AVR - TIMER0 - ISR_OVF_vect - ATMEGA16A

#5701321
Lesenswert?

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
#5701346
Lesenswert?

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
Gast #5701356
Lesenswert?

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().
#5701651
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren