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 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
Code: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
Lesezeichen