Forum: PC-Programmierung Binären Eingang "entprellen"


von Marc (Gast)


Lesenswert?

Hallo,
ich bekomme alle 25ms ein Datenpaket, in dem sich u.a. binäre Eingänge 
befinden.
Die will / muss ich "entprellen", das heißt, wenn der Eingang z.B. 1 war 
und nur kurz 0 wird, will ich ihn als Ergebnis auf 1 sehen.

Gibt es da einen einfachen, kleinen Algorithmus?
Die Code-Snippets von Peter Dannegger kann ich glaube ich nicht nutzen, 
da dort (wenn ich es richtig verstehe) nur das Drücken des Tasters 
ausgewertet wird.

Ich will ja aber beide Richtungen.

Ich könnte es über eine Statemachine lösen, aber das wird nicht mehr 
witzig, wenn ich 2 oder sogar noch mehr Eingangssignale "entprellen" 
will.

Danke für Tipps.

von Lord Z. (lordziu)


Lesenswert?

Zuerst einmal musst du wissen, ab welcher Dauer du eine "0" auch 
wirklich als "0" detektieren willst.

Außerdem wärs ganz nett zu wissen, welche Sprache du benutzt. Und eine 
Statemachine brauchst du nicht wirklich.

Es reichen dafür ein oder zwei Arrays. In einem speicherst du den 
aktuellen Zustand ab. Im anderen den Zeitpunkt des letzten 
Flankenwechsels. Der Index der Arrays steht für den Eingang, den du 
lesen willst.
Wenn ein Flankenwechsel an einem Eingang auftritt, speicherst du die 
Zeit im Array. Beim nächsten Wechsel prüfst du die aktuelle Zeit gegen 
die gespeicherte. Und schon weißt du, wie lang der Puls war und kannst 
entsprechend reagieren.

von Marc (Gast)


Lesenswert?

Ich stelle mir momentan vor, dass ich z.B. 3 "Takte" lang 1 bzw. 0 sehen 
muss, bevor ich in den Zustand 1 bzw. 0 wechsle.

Sprache ist C, aber das ist von Ideen ja unabhängig.

von Lord Z. (lordziu)


Lesenswert?

Jetzt sehe ich gerade, dass du Datenpakete bekommst, da ist es ja noch 
einfacher.

Du zählst in einem Array (am Index, der für deinen Eingang steht) die 
Anzahl hoch, wie oft eine "0" empfangen wurde. Da kannst du jetzt selbst 
festlegen, nach welcher Zeit (Anzahl * 25ms) du die "0" übernimmst.

von HildeK (Gast)


Angehängte Dateien:

Lesenswert?

Marc schrieb:
> Ich könnte es über eine Statemachine lösen, aber das wird nicht mehr
> witzig, wenn ich 2 oder sogar noch mehr Eingangssignale "entprellen"
> will.

Das ändert doch fast nichts!
Eingänge bitweise in ein Byte lesen. Bei jeder Änderung des Bytes die 
Behandlung durchführen. Ob sich das eine Bit oder ein anderes änderte, 
spielt doch keine Rolle. Wenn du ein Bit richtig behandeln kannst, ist 
der Aufwand für weitere nur noch minimal.

Du kannst eine Statemachine erstellen oder aber auch ein Schieberegister 
nachbilden, dessen Ausgänge UND und ODER-verknüpft werden - für die 
Erkennung einer '1' bzw. einer '0'. Auch dann ist der Mehraufwand für 
mehrere Signale gleichzeitig kaum aufwändiger - es wäre nur je Eingang 
ein Byte als Schieberegister notwendig.

Wenn der erste erkannte Wechsel garantiert keine Störung ist, dann 
kannst du auch einfachst sofort darauf reagieren und dann ein Delay 
einlegen, um nachfolgende Preller zu unterdrücken.
Viele Wege führen nach Rom.

Anbei mal ein C-Beispiel für die Schieberegistervariante.
(bitte nicht steinigen - ich bin kein Softwerker ...)

von manoh (Gast)


Lesenswert?

Marc schrieb:
> Gibt es da einen einfachen, kleinen Algorithmus?
> Die Code-Snippets von Peter Dannegger kann ich glaube ich nicht nutzen,
> da dort (wenn ich es richtig verstehe) nur das Drücken des Tasters
> ausgewertet wird.

Wieso sollst Du diese Routine nicht nutzen können??? Ein Port ist auch 
nur ein Register.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.