Forum: Mikrocontroller und Digitale Elektronik OCRnA vom Compiler berechnen lassen.


von Alex (Gast)


Lesenswert?

Hallo, wie berechne ich den OCRnA wert für einen 16bit Timer?
Ich brauche die Formel wo ich den Wert in Klartext als Zeit angebe.
Für einen 8bit Timer sieht sie so aus:

OCR1A = F_CPU / 1024.0 * 10e-3 - 0.5;        // 10ms interrupt

Funktioniert einwandfrei bei 8bit Timer, doch der 16bit läuft nur halb 
so schnell.

Danke im Voraus für die Hilfe.

von Achim M. (minifloat)


Lesenswert?

Alex schrieb:
> doch der 16bit läuft nur halb so schnell.

Bei Phasenrichtiger PWM ist das z.B. so. Der zählt in einem Zyklus eben 
hoch und wieder runter.

Du betreibst den aber im CTC-Modus? Stimmt auch der Vorteiler?

von Alex (Gast)


Lesenswert?

Hi, so sieht die Initialisierung für den Timer aus:

TCCR1A = 1<<WGM11;                                    // Mode 2. CTC
TCCR1B = 1<<CS12 | 1<<CS10;                           // F_CPU / 1024
OCR1A = F_CPU / 1024.0 * 10e-3 - 0.5;                 // 10ms interrupt
TIMSK1 = 1<<OCIE1A;

Ich meine ist alles richtig eingestellt, oder?

von Achim M. (minifloat)


Lesenswert?

Alex schrieb:
> TCCR1A = 1<<WGM11; // Mode 2. CTC

Das stimmt nicht, das ist Mode 2, beim 16bit-Timer aber Phasenkorrekte 
9bit-PWM. Was du brauchst ist Mode 4, CTC mit TOP in OCR1A Dazu muss nur 
WGM12 gesetzt sein. Dieses Bit ist aber in TCCR1B. Hab jetz auf Verdacht 
im DB des Mega16 geschaut.

mf

PS: Es gibt da noch Mode 12, CTC mit TOP in ICR1. Da kann man dann noch 
beide OCR-Einheiten verwenden, weil OCR1A nicht für TOP gebraucht wird.

von Alex (Gast)


Lesenswert?

Perfekt! Vielen Dank!!!

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.