www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Entprellung von Schalter/Pin (nicht Taster) also Low & High


Autor: Hans Maier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe in der Codesammlung die "Bulletproof" Entprellung für Tasten 
gefunden. Die ist soweit wunderbar, allerdings nicht für Schalter. Habe 
jedoch einen mechanischen Schalter, bei dem auf Low und High reagiert 
werden soll. Wie entprellt man so etwas? In der ISR (Timer Overflow) 
einfach eine Variable hochzählen wenn der letzte Zustand dem aktuellen 
entspricht, andernfalls die Variable wieder auf Null zurücksetzen? Ab 
einem bestimmten Zählerwert ist halt ein Zustand eingetreten. Bessere 
Vorschläge?

Gruß,

Hans

Autor: hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nicht nur letzte==jetzigem Zustand,

sondern evtl. 5-10 Werte auf Gleichheit prüfen....

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wennn Du mal den Code genauer ansiehst, dann wirst Du bemerken, daß 
nicht nur die H-L Flanke, sondern auch der entprellte Zustand zur 
Verfügung steht.

Damit wird z.B. in der erweiterten Version die Lang/Kurz Erkennung 
gemacht.


Peter

Autor: Hans Maier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe probiert die Entprellung zu verstehen und bin dazu auch mal den 
Code per Zettel + Stift durchgegangen um zu sehen was da überhaupt 
passiert. Muss gestehen: das Teil funktioniert perfekt, aber wäre ich 
nie drauf gekommen und werde ich auch nicht ändern/anfassen. Habe nur 
die Tastenabfrage erweitert, so dass man Pins aus unterschiedlichen 
Ports verwenden kann und arbeite da noch dran Pins die nicht von 0...7 
gehen zu verwenden (z.B. PortA Pin0, Pin1 & PortB Pin1).
Zurück zum Thema: habe das jetzt so im Timer Overflow gelöst (actState 
und switchcount sind globale Variablen die mit 0 initialisiert werden):

  unsigned char tempSwitch;

  tempSwitch = (PortSwitch & (1 << PinSwitch));
  if (tempSwitch == actState)
  {
    switchcount++;
  }
  else
  {
    switchcount = 0;
  }
  actState = tempSwitch;

Außerhalb der ISR prüfe ich dann einfach switchcount auf größer/gleich 4 
und den Zustand von actState. Scheint zu laufen ;=)

Gruß,

Hans

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.