Tasten entprellen

Gast #2463432
Lesenswert?
• ▲
▼
Moin,
hab mal eine kleine Frage bezüglich des Enprellens von Tasten.
Hab bei meinem Projekt drei Tasten die entprellt werden müssen.
Dazu hab ich die Methode Debounce-Makro von Peter Dannegger benutzt, 
welche auch super funktioniert.
An dieser Stelle auch besten dank an Peter!!!

Nun hab ich ein Problem, denn es lassen sich irgendwie nicht 
gleichzeitig zwei Tasten überprüfen ob sie gedrückt worden. Ich brauche 
diese Funktion, da eine Aktion ausgeführt werden soll, wenn zwei Taster 
gleichzeitig gedrückt werden.
Hab gestern schon zwei Stunden rum probiert aber bin zu keinem 
funktionierenden Ergebnis gekommen.
Ich hatte es mit der If-Bedingung:
if(debounce( PINB, PB1 )&&debounce( PINB, PB0 )
probiert.

Wäre cool wenn mir  jemand auf die Sprünge helfen könnte.
Besten dank auch hier schon mal wieder im Vorraus.

Gruß Patrick
Gast #2463622
Lesenswert?
• ▲
▼
Hallo,
erstmal danke für deine Antwort!
Ich bin noch relativ frisch auf dem Gebiet der Mikrocontroller.
Was meinst du denn mit "abfragen ob eine Shift-Taste bereits gedrückt 
ist"?
Stehe irgendwie auf´n Schlauch!

Gruß Patrick
#2463689
Lesenswert?
• ▲
▼
Patrick A. schrieb:
> Was meinst du denn mit "abfragen ob eine Shift-Taste bereits gedrückt
> ist"?

Naja, es rächt schon irgendwie, wenn man Code benutzt, den man nicht 
versteht...

Von C habe ich keine Ahnung, ich benutze Peters Entprellung in ASM. 
Aber:
Du wirst es nicht schaffen, zwei Tasten so gleichzeitig zu drücken, dass 
ihre Bits in Key_Press in derselben "Runde" der 
Hintergrund-Entprellroutine (in der Timer-ISR oder einem vom Timer 
synchronisierten Job) gesetzt werden.

Es gibt aber neben Key_Press noch Key_State, in dem der entprellte 
Status der Tasten gehalten wird, um Änderungen zu erkennen. Diese kann 
man als "Shift-Tasten" missbrauchen, indem man die Bitwerte (nur 
lesend!) auswertet.

Willst Du 2 gleichzeitige Tastendrücke auswerten, so überprüfst Du bei 
auftretendem Key_Press der einen Taste auch noch Key_State der anderen 
Taste. Das erfordert aber, dass die "Shift-Taste", also die Taste, von 
der man nur Key_State auswertet, vor der anderen Taste gedückt wird.

Eine weitere Möglichkeit ohne Eingreifen in Peters Routinen sehe ich 
darin, einen Count-Down-Zähler zu implementieren, der von den 
Tastendrücken beider Tasten kumulativ gesetzt wird und in der Timer-ISR 
reduziert wird, solange er noch icht 0 ist. Jeder der beiden 
Tastendrücke erhöht ihn z.B. um den Wert 5. Wird dabei der Wert 6 
überschritten, dann waren beide Tastendrücke zeitlich sehr nahe 
beieinander. Dann verzweigt man zur gewünschten Routine und löscht dort 
den TO-Zähler.

Es gibt sicher elegantere Möglichkeiten, aber wenn man immer das Optimum 
sucht, wird man nie fertig.

...

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.