PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer OCR1A



Reeper
23.02.2007, 16:02
Hallo,

ich habe ein kleines, jedoch für mich wichtiges Verständnisproblem.
Laut Datenblatt eines Atmega's 32 wird für den Timer1 bei CTC diese Formel für die gewünschte Frequenz berechnet:

Quarzfrequenz / (2*Prescaler*(1+OCR1A))

Dies ist soweit logisch, man kann diesen Wert von OCR1A ja in dezi oder in hex schreiben.

Mein Problem ist dieser Ausdruck:


OCR1A = (unsigned short) ((unsigned long) F_CPU / IRQS_PER_SECOND-1);

Wenn man nun Quarzfrequenz durch die IRQ's/s berechnet, dann erhält man einen komplett anderen Wert.

Beispiel:
https://www.roboternetz.de/wissen/index.php/Hallo_Welt_für_AVR_(LED_blinken)

Quarzfrequenz: 1MHz
IRQ's/s: 2000
gewünschte Frequenz: 0,5Hz

Laut der o.g. mir nicht verständlichen Ausdruck erhält man für OCR1A=500.
Wenn man nun die Formel aus dem Datenblatt mit einem Prescaler von 1 anwendet, dies: OCR1A=999999 bzw. 0xF423F.

Könnt ihr mir bitte diesen Ausdruck erklären 8-[

Gruß
Stefan

SprinterSB
23.02.2007, 16:33
Der Faktor 2 kommt daher, daß, wenn man mit Ein-Ausschalten eine Frequenz von f Hz erreichen will, pro Sekunde f mal ein- und f mal ausschalten muss, also 2*f mal schalten muss.

Wenn pro Sekunde q IRQs ausgelöst werden sollen, dann muss der Timer q mal überlaufen. Da der Timer immer von 0 bis OCR1A zählt (das sind 1+OCR1A Schritte) muss gelten

(1+OCR1A) * q = F_CPU

falls PRESCALE=1. Für höhere Prescaler analog

(1+OCR1A) * q = F_CPU / PRESCALE

Reeper
23.02.2007, 21:18
Danke dir SprinterSB, jetzt ist's verständlich :-)
Stefan