Unterscheidung, wie oft eine Taste gedrückt wird?

OP #2004731
Lesenswert?

Hallo!

Ich möchte mit einer Taste bestimmte Funktionen auslösen.
D.h:  Taste = 1x gedrückt --> Funktion1
      Taste = 2x gedrückt --> Funktion2
1
while(1)
2
{
3
   if (Taste == 8 && count == 1)
4
   {
5
      ...mach dies
6
   }
7
   if (Taste == 8 && count == 2)
8
   {
9
      ...mach das
10
   }
11
}

usw...

Die Tastenauswertung passiert auf der Senderseite. Auf der 
Empfängerseite erhalte ich also den Wert der gedrückten Taste (Taste 1 = 
1, Taste 2 = 2 usw..)
Wird z.B. die Taste 1 gedrückt, so ist der Wert == 1, solange bis eine 
andere Taste gedrückt wird.

Wie kann ich das lösen?
OP #2004759
Lesenswert?

Ich habe die Möglichkeit, das über einen Int. zu lösen.

Bei einem Tastendruck erhalte ich vom IRQ-Pin des Funkmoduls einen 
Interrupt. In der ISR wird der Wert der Taste der Variablen "Taste" 
zugewiesen.

Meine Idee war hier eine Variable "count" zu inkrementieren und diese 
bei der Tastenabfrage mit abzufragen.
Hier habe ich aber das Problem, das der Interrupt bei gedrückter Taste 
alle 40ms ausgelöst wird.
D.h. ein Tastendruck = ca. 5 bis 8 Interrupts.
#2004765
Lesenswert?

> Wie kann ich das lösen?

Z.B. so:

Entprellung (Taste entprellen)
Zähler (Anzahl Tastendrücke)
Timeout (nachtriggerbar)

Entprellter Tastendruck erhöht Zähler und startet Timeout.

Abgelaufener Timeout kopiert Zähler und löscht ihn dann für die nächste 
Orgie, verzweigt dann anhand der Zählerkopie zum entsprechenden Job.

Hauptaufgabe ist (wie immer): Zerlegen des Problems in kleine 
überschaubare Problemchen, die einzeln gelöst werden können.

...
#2004767
Lesenswert?

Heimo G. schrieb:
> Ich habe die Möglichkeit, das über einen Int. zu lösen.
>
> Bei einem Tastendruck erhalte ich vom IRQ-Pin des Funkmoduls einen
> Interrupt. In der ISR wird der Wert der Taste der Variablen "Taste"
> zugewiesen.
>
> Meine Idee war hier eine Variable "count" zu inkrementieren und diese
> bei der Tastenabfrage mit abzufragen.
> Hier habe ich aber das Problem, das der Interrupt bei gedrückter Taste
> alle 40ms ausgelöst wird.
> D.h. ein Tastendruck = ca. 5 bis 8 Interrupts.

Das wird dann aber aufwändig.
Denn du musst den Fall "dauerhaft gedrückte Taste" vom Fall "Taste 
gedrückt - losgelassen - wieder gedrückt" unterscheiden können.

Und die einzige Möglichkeit wie du das tun kannst, ist es wenn nach den 
erwarteten 40ms (und Vielfachen) nach einem Tastendruck, der Interrupt 
ausbleibt. Dann weißt du, dass die Taste wieder losgelassen wurde. Das 
ganze wird also eine ekelhafte Timingsache, nur um das Drücken und 
Loslassen einer Taste du detektieren.

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