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
https://www.mikrocontroller.net/attachment/12660/C_TAST.C Beitrag "Tasten entprellen - Bulletproof" http://www.mikrocontroller.net/forum/read-4-49709.html http://www.ece.umd.edu/~msquared/rtas2000.pdf Beitrag "Re: Tasten entprellen - Bulletproof"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.