PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Münzzähler C-Control I Unit M-2.0 Programmierung



bfelix
16.05.2009, 13:15
Hallo,

als Projektarbeit an der Schule steht die Konstruktion, der Bau und Betrieb eines einfachen Münzzählers an. Das heißt, man wirft verschiedene Münzen ein und das Gerät zeigt den eingeworfenen Betrag an, ähnlich wie bei Parkscheinautomaten.

Der zur Verfügung stehende Controller ist eine C-Control I Unit M-2.0. Die Münzen laufen über ein Sortierrondell und lösen nach durchwandern einen von 8 verschiedenen Schaltern aus. Es sind einfache Kontaktschalter, welche an die ersten 8 Digitalports angeschlossen sind. Der gezählte Betrag wird auf eine LCD-Anzeige übertragen.

Wenn das Programm auf den Controller überspielt wird, kommt es zu folgendem Fehlverhalten:
- Startbetrag ist 3,88 € (Summe der Einzelmünzen 2+1+0,5+0,2+0,1+0,05+0,02+0,01)
- Der Controller zählt ohne Tastendruck wild drauf los

Im Simulator der Conrad C-Control/CCBASIC 2.0 IDE scheint das Programm tadellos zu funktionieren. Meine Frage ist nun, ob jemand Fehler im Programmcode findet und korrigieren könnte oder andere Gründe und Lösungen wüsste, welche dazu führen, dass der Controller unmotiviert zählt.

Nebenfrage: Ist jemandem schon öfters das Programmierboard (http://www1.conrad.de/fas6/fh.php?fh_host=http://www1.conrad.de&fh_session=/scripts/wgate/zcop_b2c/~flN0YXRlPTQxODQzMTMwNjE=?&fh_pic_url=//media.conrad.de&layout=b2c&finder=&fh_params=fh_search%3Dc-control%2Bprogrammier%26fh_secondid%3Db2c198318%26 fh_lister_pos%3D0%26fh_location%3D%252f%252fb2ccon rad_de_b2c%252fde_DE%252f%2524s%253dc%255cu002dcon trol%255cu0020programmier%26fh_eds%3D%25c3%259f%26 fh_refview%3Dsearch) für die Unit M 2.0 kaputt gegangen und weiß auch da Rat?

Zum Schluss noch der Programmcode.
Für Hilfe wäre ich dankbar
bfelix


DEFINE schalter BYTEPORT[1] 'Definiere Byteport 1 (Schalter 1-8) als Schaltervariable
DEFINE muenzbetrag WORD[1] 'Eingeworfener Münzbetrag
DEFINE alter_muenzbetrag WORD[3]
DEFINE eur WORD[4]
DEFINE cent BYTE[9]
DEFINE aktueller_schalter BYTE[4] 'Kopie von Byteport 1
DEFINE vormaliger_schalter BYTE[3] 'Kopie von Byteport 1 der jeweils vorherigen Schleife, dient als Sperre um Münzen nicht doppelt zu registrieren
DEFINE sperre_1 BIT[17] 'Ausschnitt der vormaliger_schalter Variable als Ja/Nein Schalter für die Auswertung
DEFINE sperre_2 BIT[18]
DEFINE sperre_3 BIT[19]
DEFINE sperre_4 BIT[20]
DEFINE sperre_5 BIT[21]
DEFINE sperre_6 BIT[22]
DEFINE sperre_7 BIT[23]
DEFINE sperre_8 BIT[24]
DEFINE schalter_1 BIT[25] 'Ausschnitt der aktueller_schalter Variable als Ja/Nein Schalter für die Auswertung
DEFINE schalter_2 BIT[26]
DEFINE schalter_3 BIT[27]
DEFINE schalter_4 BIT[28]
DEFINE schalter_5 BIT[29]
DEFINE schalter_6 BIT[30]
DEFINE schalter_7 BIT[31]
DEFINE schalter_8 BIT[32]

'Initialisierung
vormaliger_schalter = 0
aktueller_schalter = 0
muenzbetrag = 0

PRINT"#ON_LCD#";
PRINT"#INIT#";
PRINT"#CLR#";
PRINT"#L101#";
PRINT "Muenze einwerfen";
PRINT"#L201#";
PRINT "GELD:";
PRINT"#L214#";
PRINT "EUR";
PRINT"#OFF#";

#schleifenanfang
IF (muenzbetrag <> alter_muenzbetrag) THEN GOTO ausgabe
IF (schalter <> vormaliger_schalter) THEN GOTO auswerten ELSE PRINT "Keine Änderung an den Schaltern"
GOTO schleifenanfang

#auswerten
aktueller_schalter = schalter
IF (aktueller_schalter < vormaliger_schalter) THEN GOTO entsperren
IF (aktueller_schalter > vormaliger_schalter) THEN GOTO berechnen_und_sperren

#entsperren
vormaliger_schalter = aktueller_schalter
IF (vormaliger_schalter = 0) THEN PRINT "Alle Schaltersperren wurden gelöst" ELSE PRINT "Schaltersperren wurden gelöst"

'Für Fehlersuche wieder einkommentieren
'PAUSE 100

GOTO schleifenanfang

#berechnen_und_sperren
IF (schalter_8 <> 0 AND sperre_8 = 0) THEN muenzbetrag = muenzbetrag + 200
IF (schalter_7 <> 0 AND sperre_7 = 0) THEN muenzbetrag = muenzbetrag + 100
IF (schalter_6 <> 0 AND sperre_6 = 0) THEN muenzbetrag = muenzbetrag + 50
IF (schalter_5 <> 0 AND sperre_5 = 0) THEN muenzbetrag = muenzbetrag + 20
IF (schalter_4 <> 0 AND sperre_4 = 0) THEN muenzbetrag = muenzbetrag + 10
IF (schalter_3 <> 0 AND sperre_3 = 0) THEN muenzbetrag = muenzbetrag + 5
IF (schalter_2 <> 0 AND sperre_2 = 0) THEN muenzbetrag = muenzbetrag + 2
IF (schalter_1 <> 0 AND sperre_1 = 0) THEN muenzbetrag = muenzbetrag + 1
PRINT "Münze eingeworfen und ausgewertet"
vormaliger_schalter = aktueller_schalter
PRINT "Schalter wurden gesperrt"

'Für Fehlersuche wieder einkommentieren
'PAUSE 100

GOTO schleifenanfang

#ausgabe
alter_muenzbetrag = muenzbetrag
eur = muenzbetrag / 100
cent = muenzbetrag MOD 100
PRINT"#ON_LCD#";
PRINT"#L211#";
PRINT cent;
PRINT"#L210#";
PRINT ",";
IF (eur > 1) THEN PRINT"#L209#";
IF (eur > 10) THEN PRINT"#L208#";
IF (eur > 100) THEN PRINT"#L207#";
IF (eur > 1000) THEN PRINT"#L206#";
PRINT eur;
PRINT"#OFF#";
PRINT muenzbetrag;
GOTO schleifenanfang

hardware.bas
16.05.2009, 18:58
Schmeiss am besten die Kontaktschalter raus, Diese scheinen zu prellen.
Lichtschranken sind da besser, und meistens direkt an die C-Control
anschliessbar. VG Micha

bfelix
16.05.2009, 19:53
Danke für die Antwort.

Inwiefern kann ich die Lichtschranken direkt anschließen? Oder einfach nur ohne Vorwiderstand? Wir haben versucht durch Widerstände und Transistorschaltungen ein Prellen zu unterbinden. Ist das so nicht möglich? Der Controller zählt auch ohne Tastendruck unmotiviert los, prellen müsste doch zumindest einen Tastendruck benötigen und würde nicht zu ununterbrochenem Zählen führen? Eignen sich prinzipiell alle Lichtschranken von Conrad für dieses Vorhaben, wie würden sie angeschlossen (ich sehe mehrere Kontake) und muss ich auf diese teuren Reflektoren zurückgreifen oder reicht auch einfache Alufolie?

Grüße
bfelix

FriLu
16.05.2009, 21:23
Hi,
deine Beschreibung klingt nach "in der Luft" hängenden Eingängen. Das heisst, sind die Schalter offen, haben die Eingänge ein undefiniertes Potenzial, bzw bei aktivierten (internen) Pullups wird ohne gedrückten Taster ständig H eingelesen.
Wenn dem so ist: Die Taster nach Plus anschliessen, die Eingänge über jeweils einen Widerstand (~1KOhm) nach Masse.
Kontaktprellen kann man einfach mit einer kleinen Pause in den Unterprogrammen "ausbremsen".
MfG Lutz

bfelix
16.05.2009, 21:44
Danke für die Antwort.

Leider komme ich erst am Montag über die Schule an entsprechende Widerstände. Reicht ein 1 kOhm Widerstand aus, wo ich mit allen 8 Schaltern drauf gehe und dann auf GND oder muss ich für jeden einzelnen Schalter einen 1 kOhm Widerstand verwenden? Welche Pause beim "ausbremsen" hat sich denn als praktikabel erwiesen?

Grüße
bfelix

Thomas$
16.05.2009, 21:53
soviel zeit wie du hast 1-10 ms reichen völlig aus

FriLu
16.05.2009, 22:12
Hi,
natürlich pro Schalter... Also, Plus an Schalter, Schalter an Eingang und Widerstand, Widerstand an Masse.
Der Wert ist bei deaktivierten internen Pullups unkritisch, sollte etwa im Bereich vom 1- 100KOhm liegen. Sind die internen Pullups aktiviert, ergibt sich ein Spannungsteiler, deshalb mein Vorschlag von etwa 1kOhm, der noch ein sicheres L ergibt.
LG Lutz

bfelix
17.05.2009, 08:48
Danke für die Antworten.

Jetzt muss ich nur noch nen funktionstüchtiges Programmierboard auftreiben und herausfinden wie man theoretisch die Lichtschranken verkabelt, wenn das nicht vorher am Preis scheitert. Aber vielleicht klappt es ja auch morgen mit dem entprellen der Taster.

Grüße
bfelix

Nachtrag 27.05.
Nachdem das Lehrpersonal uns auf die Qualität des Equipments hingewiesen hat und die Taster entprellt wurden, konnte der Münzzähler seinen Dienst aufnehmen. Vielen Dank für die Hilfe!