Forum: Mikrocontroller und Digitale Elektronik AVR - TIMER0 - ISR_OVF_vect - ATMEGA16A


von Sebastian S. (sebian19)


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

von H.Joachim S. (crazyhorse)


Lesenswert?

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
von Sebastian S. (sebian19)


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

: Bearbeitet durch User
von TimerBenutzerVerwender (Gast)


Lesenswert?

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.

von Sebastian S. (sebian19)


Lesenswert?

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
von Einer K. (Gast)


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().

von Sebastian S. (sebian19)


Lesenswert?

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

von Thomas F. (igel)


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.

: Bearbeitet durch User
von Jörn P. (jonnyp)


Lesenswert?

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