Schmeiss am besten die Kontaktschalter raus, Diese scheinen zu prellen.
Lichtschranken sind da besser, und meistens direkt an die C-Control
anschliessbar. VG Micha
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
Schmeiss am besten die Kontaktschalter raus, Diese scheinen zu prellen.
Lichtschranken sind da besser, und meistens direkt an die C-Control
anschliessbar. VG Micha
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
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
Wir haben so viel mit so wenig solange versucht, das wir jetzt qualifiziert sind, fast alles mit fast nichts zu bewerkstelligen.
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
soviel zeit wie du hast 1-10 ms reichen völlig aus
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
Wir haben so viel mit so wenig solange versucht, das wir jetzt qualifiziert sind, fast alles mit fast nichts zu bewerkstelligen.
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!
Lesezeichen