PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega128: Eingangsimpuls wird "verschluckt"



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

for_ro
27.10.2006, 22:38
Hallo Digitali,
in welchem Zeitabstand wird denn deine Timer0 Routine aufgerufen?
Im schlechtesten Fall geht dir da schon ein Teil oder der ganze 100ms Impuls verloren, sodass dann nach weiteren 50ms der Impuls vorbei ist.
Kannst du die Impulse nicht an einen Interrupt Eingang hängen und dann die 50ms warten? Der wird unmittelbar bei Rising oder Falling gestartet.
Dein Mega128 hat doch genügend Int-Eingänge.

Gruß

Rolf