digitali
27.10.2006, 21:29
Hallo,
innerhalb einer Timer-Schleife horche ich auf drei als Eingang deklarierten I/O-Ports nach 100ms-Impulsen. Diese kommen von einem elektronischen Muenzpruefer. Sobald eine Muenze eingeworfen wird, wird auf dem jeweiligen Kanal (0.5, 1.0, 2.0 EUR) der genannte 100ms-Impuls erzeugt (Low).
Laut Herstellerangaben soll man zur Sicherheit erst in der 50ten Millisekunde diesen Impuls auswerten (Ausfilterung von Stoerimpulsen). Damit es nicht zu undefinierten Kreditimpulsen kommen kann (es geht ja hier um Geldverarbeitung - also muss das 100%tig funktionieren).
Und genau das ist nun der Punkt: Es funktioniert nur zu 98%...
Ab und an wird ein Impuls einfach nicht erkannt. D.h. die Muenze faellt in die Kasse aber meine Steuerung hat das nicht erkannt.
Das kann nun einige Ursachen haben. Entweder ist meine Software fehlerhaft oder meine Hardware. Und nun versuche ich systematisch den Fehler einzukreisen.
Als erstes vermute das die Eingangsspannung bei einem Low hier gerade im Grenzbereich liegt, so das der 128er evt. diesen nicht immer sauber erkennt. Eine Messung mit dem Oszi ergab 0,42V.
Ein Blick ins Datenblatt zum 128er hat mich irgendwie erschlagen und ich weiss ehrlich gesagt nun nicht genau was da Sache ist. Weiss da jemand zufaellig genaue Eingangswerte fuer sichere High- und Lowpegelerkennung bei einem AVR?
In Sachen Software habe ich relativ simpel gestrickt:
Timer0_isr:
If Pinc.0 = 0 Then
Waitms 50
If Pinc.0 = 0 Then
Kredit = Kredit + 0.5
End If
End If
If Pinc.1 = 0 Then
Waitms 50
If Pinc.1 = 0 Then
Kredit = Kredit + 1
End If
End If
If Pinc.2 = 0 Then
Waitms 50
If Pinc.2 = 0 Then
Kredit = Kredit + 2
End If
End If
Return
Das laesst sich sicherlich auch noch besser loesen. Ad hoc fiel mir diese Loesung ein, die ja im Grossen und Ganzen auch funktioniert.
Zunaechst wird geprueft ob eine I/0-Port Low ist. Dann stumpf 50ms warten und danach erneut pruefen ob noch Low ist. Und erst nun wird entsprechend gehandelt.
Mag es vielleicht noch sichere Methoden geben?
Die Erfassung der Muenzimpulse habe ich in eine Timerroutine verbannt. Es gibt eine zweite Timerroutine (ziemlich genauer Sekundentakt) in der ich stetig die aktuellen Kreditwerte verarbeite, eine Tastenabfrage fuer eine Menuesteuerung (Ausgabe auf 4x20 LCD) und zwei Funktionen um Daten ins externe Eeprom abzuspeichern und auszulesen. Nebenbei werden die Werte auch noch seriell ausgegeben.
Mit freundlichen Gruessen
Digitali
innerhalb einer Timer-Schleife horche ich auf drei als Eingang deklarierten I/O-Ports nach 100ms-Impulsen. Diese kommen von einem elektronischen Muenzpruefer. Sobald eine Muenze eingeworfen wird, wird auf dem jeweiligen Kanal (0.5, 1.0, 2.0 EUR) der genannte 100ms-Impuls erzeugt (Low).
Laut Herstellerangaben soll man zur Sicherheit erst in der 50ten Millisekunde diesen Impuls auswerten (Ausfilterung von Stoerimpulsen). Damit es nicht zu undefinierten Kreditimpulsen kommen kann (es geht ja hier um Geldverarbeitung - also muss das 100%tig funktionieren).
Und genau das ist nun der Punkt: Es funktioniert nur zu 98%...
Ab und an wird ein Impuls einfach nicht erkannt. D.h. die Muenze faellt in die Kasse aber meine Steuerung hat das nicht erkannt.
Das kann nun einige Ursachen haben. Entweder ist meine Software fehlerhaft oder meine Hardware. Und nun versuche ich systematisch den Fehler einzukreisen.
Als erstes vermute das die Eingangsspannung bei einem Low hier gerade im Grenzbereich liegt, so das der 128er evt. diesen nicht immer sauber erkennt. Eine Messung mit dem Oszi ergab 0,42V.
Ein Blick ins Datenblatt zum 128er hat mich irgendwie erschlagen und ich weiss ehrlich gesagt nun nicht genau was da Sache ist. Weiss da jemand zufaellig genaue Eingangswerte fuer sichere High- und Lowpegelerkennung bei einem AVR?
In Sachen Software habe ich relativ simpel gestrickt:
Timer0_isr:
If Pinc.0 = 0 Then
Waitms 50
If Pinc.0 = 0 Then
Kredit = Kredit + 0.5
End If
End If
If Pinc.1 = 0 Then
Waitms 50
If Pinc.1 = 0 Then
Kredit = Kredit + 1
End If
End If
If Pinc.2 = 0 Then
Waitms 50
If Pinc.2 = 0 Then
Kredit = Kredit + 2
End If
End If
Return
Das laesst sich sicherlich auch noch besser loesen. Ad hoc fiel mir diese Loesung ein, die ja im Grossen und Ganzen auch funktioniert.
Zunaechst wird geprueft ob eine I/0-Port Low ist. Dann stumpf 50ms warten und danach erneut pruefen ob noch Low ist. Und erst nun wird entsprechend gehandelt.
Mag es vielleicht noch sichere Methoden geben?
Die Erfassung der Muenzimpulse habe ich in eine Timerroutine verbannt. Es gibt eine zweite Timerroutine (ziemlich genauer Sekundentakt) in der ich stetig die aktuellen Kreditwerte verarbeite, eine Tastenabfrage fuer eine Menuesteuerung (Ausgabe auf 4x20 LCD) und zwei Funktionen um Daten ins externe Eeprom abzuspeichern und auszulesen. Nebenbei werden die Werte auch noch seriell ausgegeben.
Mit freundlichen Gruessen
Digitali