Guten Tag zusammen, ich habe so meine Probleme mit Timern und deshalb frage ich mal hier nach. Ich habe einen Atmega16A mit 12MHz. Ich möchte, das beim start einer Eingabe über einen gewissen PORT (per Tastenfeld), der Timer startet. Während der Timer 2s lang läuft, soll die Eingabe über das Tastenfeld in ein Array abgespeichert werden. Nach den 2s, soll dann auf einem LCD-Display die Eingabe angezeigt werden und der Timer sollte stoppen, damit er wieder starten kann, wenn erneut eine Eingabe startet. Zwischen stoppen und starten soll 1s vergehen (per Delay). Mein Problem ist jetzt nur der Timer selber, der Rest ist kein Problem. Könnte mir also jemand helfen, wie man das am besten macht? Damit beim Timer nach 2s ein Interrupt auslöst, weiß ich wie es geht, mein Problem ist, dass der Timer anschließend aufhören soll und erst wieder ab der nächsten Eingabe startet. Kann ich also den Timer stoppen und dann erst wieder über ein if() starten? mfg Sebastian Schneider
Du hast die Sache mit den Timern noch nicht richtig verstanden. Und mit Timer0 kommst du eh nicht auf 2s bei 12MHz. edit: link vergessen: https://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer
:
Bearbeitet durch User
Ok, danke erstmal für die Antwort. Wie schon gesagt, hab ich so meine Probleme mit den Timern. Wie könnte ich dann realisieren, dass ich nur diese zwei Sekunden zweit habe von der ersten bis zur letzten Eingabe? Edit: bzw. wäre es zum Beispiel möglich, dass ich erst nach mehrerem auslösen der Interrupt die Aktion setzte. Also auf diese Weise auf die 2s komme? lg Sebi
:
Bearbeitet durch User
H.Joachim S. schrieb: > Und mit Timer0 kommst du eh nicht auf 2s bei 12MHz. Dann kann er ja den Timer1 verwenden. Oder wenn es nicht supergenau gehen soll, den Timer 0 merhmals aneinanderstückeln.
Ja es ist nicht so genau. Da es halt nur darum geht, dass man z.B nicht 10s lang ganz langsam etwas eingeben kann. Man sollte einfach z.B ziffern in einer Zeit von etwa 2s eingeben.
:
Bearbeitet durch User
Sebastian S. schrieb: > Edit: bzw. wäre es zum Beispiel möglich, dass ich erst nach mehrerem > auslösen der Interrupt die Aktion setzte. Also auf diese Weise auf die > 2s komme? Ja, das würde ich als den goldenen Weg betrachten. Und irgendwie stoppen, muss man den auch nicht. Der kann im Hintergrund weiter ticken. Hilft auch beim entprellten der Tastatur, oder beim Bau eines delay().
Hi Arduino Fanboy D. Danke für deine Antwort. Jetzt weiß ich glaub wie ich es hin bekomme. Sollte ich es nicht schaffen, werde ich hier nochmals schreiben. Lg Sebi
Stelle den Timer0 z.B auf 10ms ein. Mit dem Compare-Modus kann man das ausreichend genau hinbekommen. In der Timer-Interrupt-Routine zählst du dann einfach nur eine Variable hoch. Dort kann man dann bei Bedarf auch Tastenabfragen und Tastenentprellung mit unterbringen. In der Main-Routine überprüft man dan ob die Variable schon 200 erreicht hat. Dann sind 2s vergangen und man kann irgendwas machen, auch die Variable mit neuem Startwert laden.
:
Bearbeitet durch User
Bei 12 MHz und 2 Sekunden müßtest du (geschätzt)den prescaler (Teiler)für Timer_1 auf 1024 einstellen. Das Eingeben des Teilerfaktors startet auch den Timer. Das Eingeben des Faktors 0 stopt den Timer.
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.