www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tastendrücke erkennen?


Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck dir am besten mal die Entprellroutine von Peter Dannegger an.

Autor: shagoon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dummer Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>(Brett vorm Kopf Rahul)
Ich weiß, wie es geht...

Autor: dummer Rahul (Gast)
Datum:

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

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"^" = EXOR

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
übrigens kann man Tasten genau so entprellen...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dummer Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke schön!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.