-
Timer OCR1A
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:
Code:
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
-
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
-
Danke dir SprinterSB, jetzt ist's verständlich :-)
Stefan