Forum: Mikrocontroller und Digitale Elektronik Tastendrücke erkennen?


von Andi (Gast)


Lesenswert?

Moin!
Nehmen wir an ich habe eine Variable. Diese Variable erkennt 
Tastendrücke (entprellt) und enthält den anliegenden Zustand 1 oder 0.
Wie ist es in C am leichtesten zu realisieren einen erneuten Tastendruck 
zuerkennen? Mir ist schon klar das das auf irgendeine Weise mit dem 
Flankenwechsel zutun haben muss aber wie macht man soetwas geschickt?
Dank im voraus MfG Andi

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

Mit einer zweiten Variablen, mit der man sich den vorherigen Zustand 
merkt.
Sollten sich die beiden unterscheiden (bzw. Teile davon), dann gab es 
eine Flanke...

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

Die zweite Variable muß nicht mal permant vorhanden sein:
Man kopiert die Tastenvariable hinein, liest die entprellten 
Tastenzustände ein und vergleicht die beiden Variablen dann.

Wenn man das Entprellen per Timerinterrupt macht, wird man eine separate 
Varibale brauchen...

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

Guck dir am besten mal die Entprellroutine von Peter Dannegger an.

von shagoon (Gast)


Lesenswert?

eine einfache Variable hat ja 8 Bit. Daher würde ich einfach das untere 
Nibble für den aktuellen Zustand verwenden und das obere Nibble für den 
vorherigen Zustand.
Somit sparst du Platz im Ram/Register.
Zum speichern des neuen Zustandes musst du einfach die Variable 4 Bits 
nach links shiften (VAR <<= 4;) und um zu überprüfen ob sich die beiden 
Zustände unterscheiden einfach XOR benutzen (if ((VAR >> 4) ^ (VAR & 
0x0F) printf("Taste gedrückt/losgelassen")).

Mit ein wenig mehr aufwand kannst du dir so die vorherigen 7 Zustände 
merken. Diese Methode eignet sich übrigens hervorragen zum entprellen .. 
ich nutze immer das untere Nibble für die 4 letzten Tastenzustände eines 
Timerinterrupts (einfach in jedem Aufruf den aktuellen Tastenzustand von 
rechts nach links "reinshiften") und überprüfe auf 0x0F -> die letzten 4 
Interrupts war Taste auf logisch 1 und somit werte dies als "gedrückt".

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

Umständlich...
>vorherigen 7 Zustände
Wozu?
Was interessier es mich, wie oft die Taste hin- und hergezappelt ist, 
bevor sie endlich einen stabilen Zustand eingenommen hat?
Es interessiert doch nur, ob die Taste eine gewisse Zeit lang einen 
stabilen Zustand hat.

Es geht aber nicht darum, die Tasten zu entprellen, sondern darum, eine 
Flanke bei schon entprellten Tasten festzustellen.
Dazu braucht man ein "permanentes" Byte, um 8 Tasten auszuwerten.

von dummer Rahul (Gast)


Lesenswert?

Mann ich habe es immer noch nicht geschnallt! Ich möchte in meinen 
Routinen den Tastendruck auswerten die Taste ist mit zwei Funktionen 
belegt nämlich an/aus. Wie wertet man das aus? Habe ja schließlich auch 
bei einem langen Tastendruck jede menge 1ser anliegen. (Brett vorm Kopf 
Rahul)

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

>(Brett vorm Kopf Rahul)
Ich weiß, wie es geht...

von dummer Rahul (Gast)


Lesenswert?

dann sag es mir bitte! Das war doch nett oder? Denke ich habe eine 
Antwort verdient!

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

Ist doch ganz einfach:
Du hast 2 Variablen a und b
a enthält die moemtanen Tasterstände nach dem Entprellen z.B. 11111111
b enthält die Tasterstände vor dem Entpressel (man könnte es auch 
einfach "Tastenabfrage" nennen).

a ist 11111111
b ist 11111111

Es hat sich nichts verändert (a^b = 0...)

wenn a jetzt 11101111 ist, wurde die Taste 4 gedrückt.
b ist immer noch 11111111
a^b != 0 (00010000)
da a & (1<<4) ==0 ist, wird ein Tastendruck detektiert.
b = a
solange die Taste gedrückt wird, ist a==b (a^b=0)
wird die Taste losgelassen, ist a^b !=0...

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

"^" = EXOR

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

übrigens kann man Tasten genau so entprellen...

von Karl heinz B. (kbucheg)


Lesenswert?

Wurde doch schon gesagt:

Du brauchst eine Variable, die den vorhergehenden Zustand
der Tasten enthält. Dann brauchst du eine Variable die
den jetzigen Zustand der Tasten bekommt.
Und dann vergleichst du die beiden. Wenn du zum Vergleichen
ein XOR benutzt, dann sind im Ergebnis nur dort 1-er, wo
sich der Zustand 'vorher' vom Zustand 'jetzt' unterscheidet.
Und das wars dann auch schon.

[C]
unsigned char TastenVorher;

...
{
   unsigned char TastenJetzt = wie_auch_immer_du_zu_den_Tasten_kommst;
   unsigned char Flanke = TastenJetzt ^ TastenVorher;

   // Welche Taste hat den Zustand gewechselt ?
   if( Flanke & 0x01 ) {
     // Wurde sie gedrückt oder losgelassen ?
     if( TastenJetzt & 0x01 ) {
       // losgelassen ( Annahme: Tasten sind low aktiv )
       mach_was;
     }
     else {
       // gedrückt
     }
   }

   // nächste Taste
   else if( Flanke & 0x02 ) {
     // gedrückt oder losgelassen
     if( TastenJetzt & 0x02 ) {
       ...
     }
     else {
       ...
     }
   }

   else if( Flanke & 0x04 ) {
     ...
   }

   // den jetzigen Zustand der Tasten als vorhergehenden
   // Zustand für den nächsten Durchgang merken.
   TastenVorher = TastenJetzt;
 }

Einfacher ist es alleredings, die Tastenentprellroutine
von PD (zu finden in der Codesammlung) zu benutzen.

von dummer Rahul (Gast)


Lesenswert?

danke schön!

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.