Forum: Mikrocontroller und Digitale Elektronik immernoch taster abfragen auf 2 arten


von lordchen (Gast)


Lesenswert?

moin das problem hatte ich  ja aschonmal leider funzt es immernoch nicht 
!

ichhabe nun eine variable in dem interrupt, der alle 20ms ausgeführt 
wird

ist die variable bei 10 also 200ms soll er sie als KURZ erkennen
und ist sie bei 200 (4 sekunden) soll er sie als lang erkennen
ich hab mir überlegt das in dem INT. nur die VAR hochgezählt wird 
sofern das wahr wird:

if (PIND == 254 || PIND == 253 || PIND == 251 || PIND == 247 || PIND == 
239 || PIND == 223 || PIND == 191 || PIND == 127)


aber ich verstehe das irgendwie nicht wie bzw wann man das loslassen 
auswerten kann ?!muss ich den aktuellen port in einer variable irgendwo 
zwischenspeichern und danach bei nächsten int mit dem aktuellen port 
vergleichen um eine veränderung(loslassen) festzustellen
oder soll ich erstmal filtern WELCHER knopf gedrückt ist und dann mit 
IF_pin_is__Set abfragen ...

und wo soll der counter wieder zurück gesetzt werden ?

bis jetzt habe ich es so das ich in der main herausfinde was gedrückt 
ist und wielange ...
undem ich eine caseanweisung mache:

      switch(taster1)
        {
      case 254:
        PORTB = 254;
        if (counter == 10)
        {
          lcd_clrscr();
          lcd_puts("Position 1 saved");
          delay();
          delay();
          delay();
          delay();
          taster1 = 0;
          counter = 0;
        }

ich hoffe ihr könnt mir weiter helfen !
dankedafür schonmal !


gruß lordchen

von Peter D. (peda)


Lesenswert?

Stimmt, du must Dir natürlich den vorherigen Zustand merken, um den 
Wechsel von Losgelassen nach Gedrückt und umgekehrt auszuwerten.

In meinem Codebeispiel habe ich aber nur dan Wechsel zu Gedrückt 
ausgewertet.

Ich habe auch nur einen Wiederhohlzähler für alle Tasten gemeinsam 
verwendet. D.h. wenn man eine Taste drückt, bevor man die andere 
losläßt, wird diese auch als lang gedrückt ausgewertet.

Bei langem Druck, wird bei mir der gleiche Tastenkode wiederholt. Wenn 
man da ein anderes Register nimmt kann man aber auch einen anderen Kode 
erzeugen.

Da ich den Wechsel zu Gedrückt auswerte, wird immer zuerst der Kode für 
kurz gedrückt ausgegeben und erst nach der Wartezeit auch der Kode für 
lang gedrückt (in meinem Beispiel ist beides dasselbe).

Ich hoffe, jetzt kannst Du mein Beispiel besser verstehen.

Du kannst es ja im Simulator ausprobieren.


Peter

von lordchen (Gast)


Lesenswert?

ne du danke für deine anwort aber ich verstehs nicht ...
wie meinst du das ? wann muss ich den aktuellen portzustand denn 
abspeiichern ? und wie wird dieser im weiteren verlauf nochmal 
vergliachen ?


gruß
lordchen

von Peter D. (peda)


Lesenswert?

Der alte entprellte Zustand aller 8 Tasten wird in "key_state" 
gespeichert. Der neue wird erstmal in "i" abgelegt. Dann wird die Flanke 
erkannt und das entsprechende Bit in "key_press" gesetzt, wo man es in 
der Main-Loop bequem testen und rücksetzen kann.

Die Variablen "ct0" und "ct1" bilden 8 Stück 2-Bit-Zähler, d.h. Sie 
können bis 4 Zählen und dienen dem Entprellen. D.h. "key_state" 
übernimmt das Tastenbit erst, wenn es 4-mal hintereinander der 
entgegengesetzt Zustand war.


Vielleicht solltest Du erstmal nur mit dem Entprellen anfangen, z.B.:

http://www.mikrocontroller.net/attachment.php/20554/Get8key4.asm

Das ist haargenau der C-Kode, aber ohne Repeat-Funktion und in AVR 
Assembler.
Du kannst es bequem im Simulator laufen lassen, um die Funktion zu 
verstehen, bzw. direkt auf dem STK500.

Dann kannst Du die Repeat-Funktion wieder anhängen.


Aber da sind ja noch viele andere Entprellroutinen in der Codesammlung. 
Vielleicht nicht so kompakt, aber in der Funktionsweise ähnlich.

Du darfst bloß keine Angst vor fremden Kode haben. Ist völlig normal, 
daß man da erst mal Bahnhof versteht. Einfach von oben anfangen, sich 
durchzuwusteln. Du kannst mir auch per E-Mail Fragen stellen.


Peter

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.