Forum: Mikrocontroller und Digitale Elektronik Kurze und lange Tasterdrücke regestrieren ATMEGA8


von Thomes (Gast)


Lesenswert?

Hallo.
Ich habe da ein Probelem und ich das mir vieleicht hier jemand helfen 
kann. Ich habe leider keine passenden Artikel im Internet oder in diesem 
Forum gefunden. Wenn dieses Thema schon einmal diskutiert wurde dann 
bitte ich um nachsicht und vieleicht einen Link zur alten dikusion.


Ich habe folgendes Probelm:

Ich möchte mit dem ATMEGA8 kurze und lange Tasterdrücke erkenne und 
darauf dementsprechend reagieren. Bei einem kurzen Druck soll eine 
andere Aktion ausgeführt werden als bei dem langen Druck.

Ich hatte bisher die Idee das mit Hilfe eines Timers zu machen. Wenn ein 
Taster gedrückt wird, soll der Timer anfangen zu zählen. So lange der 
Taster gedrückt bleibt soll ein Register incrementiert werden. Nach dem 
eine bestimmte Zeit abgelaufen ist(etwa eine sekunde) soll das 
hochgezählte register ausgewertet werden und daran erkannt werden ob der 
Taster kurz oder lang gedrückt war.

Ich habe da auch ein Programm geschrieben das aber leider nich so gut 
funktionierte. Mal ging die Led direkt nach dem Tastendruck an, mal mit 
langer verzögerung mal garnicht. Leider habe ich das Programm auch 
soweit vermurkst das garnichts mehr ging und alles nur durcheinander 
war. Darauf hin habe ich das Programm gelöscht. Deswegen kann ich leider 
auch mein Programm nicht online stellen. Ich glaube irgendwie das dies 
damit zu tun hatte das der Timer nicht bei jedem Tastendruck mit dem 
selben wert angefangen hat.

Mein Problem ist nur wie bekomme ich das hin das der Timer erst genau 
dann anfängt zu zählen wenn ich eine Taste gedrückt habe und nach dem 
Tastendruck der Timer zurückgesetzt und deaktivert wird? Wenn ich die 
Interupts Global ausstelle dann hört doch der Timer nicht auf zu zählen 
oder?

Oder gibt es da noch eine bessere möglichkeit das zu realisieren? 
Vieleicht hat ja jemand einen Assembler code für mich?

Ich vielen dank für die Hilfe
Gruß Thomes

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich würde in der Timmer ISR Abfragen ob die Taste gedrückt ist, wenn ja 
> Variable hochzählen, wenn nein --> Wert für die Mainloop sicher und 
Counter auf 0.
In der Mainloop kannst du dann die gesicherte Variable abfragen und je 
nachdem entscheiden:
> 50 --> kurzer druck
> 150 --> langer druck
oder so in der Art (hast dann auch gleichzeitig ne Entprellung)

Alles etwas theoretisch da ich nicht weiß welche Progsprache du 
verwendest

von Karl H. (kbuchegg)


Lesenswert?

Da verweise ich dich doch glatt mal auf eines der Arbeitspferde
in diesem Forum

http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29

von Johannes M. (johnny-m)


Lesenswert?

Die Vorgehensweise müsste doch eigentlich klar sein: Für jeden Taster 
gibt es eine Zählvariable. Die Taster werden jetzt zyklisch abgefragt 
(z.B. Timer-Interrupt). Wenn an einem Taster ein Flanke "Taster 
gedrückt" erfasst wird, dann wird ein Flag gesetzt und solange dieses 
Flag gesetzt ist, wird bei jeder Tasterabfrage die zu dem Taster 
gehörende Zählvariable erhöht. Das ganze so lange, bis der Taster wieder 
losgelassen wird. In dem Fall wird das Flag gelöscht, die Zählvariable 
ausgewertet (kurz oder lang gedrückt, also kleiner oder größer als ein 
Schwellwert) und wieder auf Null gesetzt.

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.