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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.