Forum: Mikrocontroller und Digitale Elektronik Timer im AVR - Wie ist das mit dem Starten/Stoppen?


von Tarek T. (tarek_t)


Lesenswert?

Hallo,

die Frage stellt sich mir, weil ich gerade an einem eher 
"zeitkritischen" Projekt arbeite.
Wenn ich den Timer im AVR initialisiere, dann geh ich meist wie folgt 
vor:

Ich stelle den Timer Modus ein, z.B. CTC und setze das Zählregister 
(z.B. TCNT0) auf 0. Interrupts werden eingeschaltet und mit dem 
Einstellen des Prescalers wird der Timer ja gestartet. Angenommen ich 
habe einen Prescaler von 8 eingestellt. Dann wird das Zählregister mit 
jedem 8. Taktzyklus (Takt des µControllers) um eins erhöht. Ich habe 
keine Ahnung wie die Taktteilung intern genau funktioniert, aber so 
etwas erreicht man ja beispielsweise mit FlipFlops.

Wenn ich den Prescaler dann auf 0 setze (den Timer also stoppe), könnte 
es ja sein, dass noch 3 Taktzyklen (Takt des µControllers) nötig sind, 
um das Zählregister zu inkrementieren. Wie verhält sich der Controller, 
wenn ich irgendwann später im Programm den Timer wieder aktiviere? Wird 
das Zählregister nach 3 Taktzyklen um eins inkrementiert oder beginnt 
der Taktteiler intern wieder bei 0?

Ich hoffe ich konnte die Frage klar genug stellen. Vielleicht kennt 
einer die Antwort.

Vielen Dank im voraus

von Thomas E. (thomase)


Lesenswert?

Tarek T. schrieb:
> Ich hoffe ich konnte die Frage klar genug stellen. Vielleicht kennt
> einer die Antwort.
Der Prescalercounter ist ein Zähler, wie jeder andere auch.
Wenn der Timer angehalten wird, steht er auf irgendeinem Wert und zählt 
beim nächsten Einschalten dort weiter. Man kann ihn man aber im 
GTCCR-Register zurück setzen.

mfg.

von holger (Gast)


Lesenswert?

>Wenn ich den Prescaler dann auf 0 setze (den Timer also stoppe)

Damit stoppst du den Timer nicht. Du müsstest den Timer Clock
abschalten. Also keinen Prescaler mehr.

>, könnte
>es ja sein, dass noch 3 Taktzyklen (Takt des µControllers) nötig sind,
>um das Zählregister zu inkrementieren. Wie verhält sich der Controller,
>wenn ich irgendwann später im Programm den Timer wieder aktiviere? Wird
>das Zählregister nach 3 Taktzyklen um eins inkrementiert oder beginnt
>der Taktteiler intern wieder bei 0?

Dafür gibt es den Prescaler Reset bei z.B. ATMega.

von µC-Bastler (Gast)


Lesenswert?

Dem ganzen Spiel kann man genau auf die Finger gucken, wenn man den 
Simulator in AVR Studio bemüht und sich im Einzelschritt und mit 
Breakpoints durch das Programm hangelt.

von Tarek T. (tarek_t)


Lesenswert?

Thomas Eckmann schrieb:
> Man kann ihn man aber im GTCCR-Register zurück setzen.
>
> mfg.

Sauber, vielen Dank, das Register ist mir noch nie aufgefallen. Und 
natürlich lese ich erst jetzt etwas davon im Datenblatt...

holger schrieb
>>Wenn ich den Prescaler dann auf 0 setze (den Timer also stoppe)
>
>Damit stoppst du den Timer nicht. Du müsstest den Timer Clock
>abschalten. Also keinen Prescaler mehr.

Nichts anderes habe ich damit gemeint. Der Wert, den Du für die Bits 
CS0:2 ins Kontrollregister schreibst, ist 0.

Vielen Dank, Thema hat sich erledigt.

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.