Forum: Compiler & IDEs 8000 überläufe pro sekunde


von roboter (Gast)


Lesenswert?

Ich brauche Hilfe für den Timer0 vom Atmega32 mit 8Mhz.

Ich möchte pro Sekunde 8000 Durchläufe realisieren.

Der Teiler ist 8.

Wie kann ich jetzt den Startwert ermitteln, womit der Timer starten 
soll.

mfg

von Falk B. (falk)


Lesenswert?

AVR-Tutorial: Timer
AVR-Tutorial: Uhr

Stichwort CTC Modus.

MfG
Falk

von roboter (Gast)


Lesenswert?

Also, irgendwie finde ich den Anfang nicht für die Formel um den 
Vorgabewert auszurechnen.

8mhz/8/256 ist klar = 3906 Umläufe pro Sekunde.

Wie komm ich jetzt auf den Vorgabewert, damit 8000 umläufe stattfinden?

von Johannes M. (johnny-m)


Lesenswert?

roboter wrote:
> Also, irgendwie finde ich den Anfang nicht für die Formel um den
> Vorgabewert auszurechnen.
>
> 8mhz/8/256 ist klar = 3906 Umläufe pro Sekunde.
>
> Wie komm ich jetzt auf den Vorgabewert, damit 8000 umläufe stattfinden?
Es gibt keinen "Vorgabewert"! Benutze die CTC-Betriebsart, dann musst Du 
nicht lange rumrechnen, kannst praktisch direkt die Anzahl der Zyklen 
eingeben und musst nicht bei jedem Überlauf nachladen.

von Karl H. (kbuchegg)


Lesenswert?

roboter wrote:
> Also, irgendwie finde ich den Anfang nicht für die Formel um den
> Vorgabewert auszurechnen.
>
> 8mhz/8/256 ist klar = 3906 Umläufe pro Sekunde.
>
> Wie komm ich jetzt auf den Vorgabewert, damit 8000 umläufe stattfinden?

Offensichtlich geht sich das nicht aus, wenn der Timer jedesmal
bis 256 durchzählt. Also wie weit muss er durchzählen:

8mhz/8/x = 8000

Nach x umstellen musst du aber alleine :-)

von holger (Gast)


Lesenswert?

Macht es doch nicht immer so kompliziert Jungs ;)
Er soll das ja auch verstehen.

8MHz/8 = 1MHz Takt für den Timer0.
Der Timer zählt mit 1/1000000Hz weiter. Also mit 1us.

Du möchtest 8000 mal pro Sekunde einen Überlauf.
1/8000Hz = 125us. Glücklicherweise ist das Ergebnis
eine Zahl ohne Kommastelle.

Der Timer muss 125 Takte abarbeiten bis zum Überlauf.
Im Overflow Betrieb läuft der Timer0 bei 255 über auf 0.
Der Reload Wert ist auf jeden Fall schon mal 255-125.
Der Überlauf erfolgt aber erst einen Takt nach dem
Timerwert 255. Also muss man einen Takt drauflegen.
Reload mit 255-(125+1) nachdem der Timer0 übergelaufen ist.

Bei 16Bit Timern muss man mit 65535 statt 255 rechnen.

Das dumme am Overflow Betrieb ist das man den Reload
Wert von Hand in den Timer nachladen muss. Dabei vergeht Zeit.
Nimmt man z.B. noch den Sprung in eine Interruptroutine
dazu, plus ein paar Pushs um die wichtigen Register
zu retten vergeht da evtl. schon soviel Zeit das der
Timer ein oder mehrere Takte weiterläuft. Gerade bei
kleinen Prescaler Werten. Lädt man den Timer dann mit
255-(125+1) nach, hat man Taktverluste die man mit dem
Reload Wert eigentlich ausgleichen müsste. Der Reload
Wert müsste kleiner werden.

Beim CTC ist das nicht der Fall. Der Overflow Wert wird
nur ein mal in ein Register geschrieben (OCR0 bei Timer0).
Beim Überlauf wird der Timer einfach auf 0 gesetzt. Per Hardware.
Es entstehen keine Taktverluste. Der Timer läuft frei durch,
unabhängig von der Software. Das einzige was man beachten muss ist
das der Timer bei 0 anfängt zu zählen. In OCR0 müsste man bei diesem
Beispiel also 125-1 reinschreiben.

Ich hoffe ich habe nicht zuviel Unsinn geschrieben ;)
 holger

von roboter (Gast)


Lesenswert?

jup, danke , das reicht.

es läuft jetzt mit euren vorschlägen.

mfg

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.