Forum: Mikrocontroller und Digitale Elektronik Unterscheidung, wie oft eine Taste gedrückt wird?


von H. G. (ledi)


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?

von Sauger (Gast)


Lesenswert?

Moin,

Heimo G. schrieb:
> 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?

geht nicht, die Tasten müssten gedrückt/losgelassen melden.

MfG

von Karl H. (kbuchegg)


Lesenswert?

Heimo G. schrieb:


> Wie kann ich das lösen?

> Wird z.B. die Taste 1 gedrückt, so ist der Wert == 1, solange bis eine
> andere Taste gedrückt wird.

Solange dir der Tastenauswerter seine Ergüsse nicht in anderer Form zur 
Verfügung stellt - gar nicht.

von H. G. (ledi)


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.

von Hannes L. (hannes)


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.

...

von Karl H. (kbuchegg)


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.

von Sauger (Gast)


Lesenswert?

Moin,

dann wird dein Sender Pulsen, ähnlich einer Fernbedienung vom TV/Radio
... also bleibst beim geht nicht.

MfG

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.