Forum: Compiler & IDEs Tastendruck erkennung


von Sarah (Gast)


Lesenswert?

Hallo!
ich habe ein ernsthaftes problem.
Ich habe erst gerade Angefangen zu Programmieren und jetzt wollte ich 
euch fragen, ob ihr mir vielleicht helfen könnt.

Das ganze mache ich mit einem ATMEGA16.
Muss ein Programm schrieben das in ini.c/init.h - File und in einem main 
unterteilt ist. Der Timer0 soll eine INT-Frequenz von 33Hz haben.
Ich haben einen OCR0=175, HWVT=1024, SWVT=2

der Code für init.c
init_ports()
{
  DDRA&=~0x0F;
  PORTA|=0x0F;
  DDRC=0xFF;
}

init_timer0()
{
  TCCR|=(1<<CS02)|(1<<CS00)|(1<<WGM00);   //HWVT=1024,PWM mode
  OCR0=175;
  TIMSK=0x02;
}

Code für init.h
extern void init_ports(void)
...

so und nun ist meine Frage:
ich sollte einen Kurzen (<0,3s)Tastendruck von S0 schaltet LED0 ein
und LAnger(>=0,3s) Tastendruck von S1 schaltet LED0 aus.

und ich sollte das mit einer ISR machen und einen softwarevorteiler 
realisieren.

Kann mir jemand helfen?
lg Sarah

von Joachim B. (jar)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Sarah schrieb:

In Ergänzung zu den bereits genannten Links

> ich sollte einen Kurzen (<0,3s)Tastendruck von S0 schaltet LED0 ein
> und LAnger(>=0,3s) Tastendruck von S1 schaltet LED0 aus.
>
> und ich sollte das mit einer ISR machen und einen softwarevorteiler
> realisieren.

Na dann würde es sich zb anbieten, wenn du einen SOftwarevorteiler so 
einstellst, dass du Programmcode zb alle 0.1 Sekunden ausführen lässt

FAQ: Timer

Wenn dann in diesem Programmcode die Taste 1 oder 2 mal hintereinander 
als gedrückt erkannt wurde, dann war es ein kurzer Tastendruck. Wird die 
Taste öfter als 2 mal in Folge als gedrückt erkannt, dann war es ein 
langer Tastendruck.

Eines muss dir aber klar sein: Einen kurzer Tastendruck von einem langen 
Tastendruck kannst du erst unterscheiden, wenn die Taste losgelassen 
wurde. Du musst also rausfiltern, ob die Taste gerade den Übergang von 
gedrückt zu nicht gedrckt gemacht hat und wenn dem so ist, dann siehst 
du dir an, was deine Zählung der gedrückt-Zeitdauer ergibt.
Stellst du in der Timer-ISR fest, dass die Taste gerade von nicht 
gedrückt auf gedrückt gewechselt hat, dann setzt du den Zähler auf 0
Ist andererseits in der ISR die Taste gedrückt, wird der Zähler um 1 
erhöht.
Stellst du in der Timer-ISR fest, dass die Taste von gedrückt auf nicht 
gedrückt gewechselt hat, dann ist offenbar der Tastendruck zu Ende und 
du siehst nach, wie weit der Zähler gekommen ist. Die Zahl verrät dir 
dann, wie lange die Taste gedrückt war.

Noch genauer will ich das eigentlich nicht mehr ausführen, denn dann 
erledige ich deine Hausaufgaben.

Edit: die genannten Zahlen beziehen sich darauf, dass du den 
Software-Vorteiler so einstellst, dass ein bestimmter Programmcode alle 
0.1 Sekunden ausgeführt wird. Du kannst das natürlich auch auf viele 
anderen Zeiten beziehen. Hauptsache du kriegst das von den vorgegebenen 
33Hz vernünftig abgeleitet.

: Bearbeitet durch User
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.