www.mikrocontroller.net

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


Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HildeK (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ...)

Autor: manoh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.