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

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.