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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren