-         

Ergebnis 1 bis 2 von 2

Thema: Mega128: Eingangsimpuls wird "verschluckt"

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.11.2005
    Ort
    QTH: JO43BC
    Alter
    49
    Beiträge
    112

    Mega128: Eingangsimpuls wird "verschluckt"

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •