Forum: Mikrocontroller und Digitale Elektronik Tasten entprellen


von Patrick A. (Gast)


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

von Anja (Gast)


Lesenswert?

Patrick A. schrieb:
> wenn zwei Taster
> gleichzeitig gedrückt werden.

2 Taster "gleichzeitig" das schaffst Du gar nicht wetten?
Ich würde abfragen ob eine "Shift" Taste bereits gedrückt ist während 
eine andere neu entprellt wurde.

Gruß Anja

von Patrick A. (Gast)


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

von Hannes L. (hannes)


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.

...

von Patrick A. (Gast)


Lesenswert?

Hallo,
vielen Dank für deine Antwort, sie hat mir sehr geholfen!!
Hab es jetzt irgendwie so gemacht und es funktioniert und das is ja die 
Hautptsache!!!

Gruß Patrick

von Peter D. (peda)


Lesenswert?

Patrick A. schrieb:
> 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.

Siehe:

Beitrag "Universelle Tastenabfrage mit 2 Tastenerkennung"


Peter

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
Noch kein Account? Hier anmelden.