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.
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.
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.
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.
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 ...)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.