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