Ich verwende derzeit einen ATmega32, um die Zeit zu halten, also habe ich das Datenblatt sorgfältig gelesen und den Timer 1 so konfiguriert, dass er jede Sekunde einen Interrupt generiert.
Gemäß der folgenden Formel auf dem Datenblatt sollte ich mit einem 16-MHz-Takt, einem Vorteiler von 256 und OCR1A = 31249 eine Frequenz von 1 Hz im CTC-Modus erhalten:
Diese Formel ist auf Seite 99 des ATmega32-Datenblatts verfügbar .
Ich habe Timer 1 wie folgt konfiguriert:
TCCR1A = 0;
TCCR1B = (1<<WGM12)|(1<<CS12);
OCR1A = 31249;
TIMSK = (1<<OCIE1A);
Hier ist der Interrupt-Code
ISR(TIMER1_COMPA_vect){
sec++;
}
Dann verwende ich ein LCD, um den Wert von sec kontinuierlich zu drucken , und ich bekomme ein Timing von 0,5 Sekunden. Mit anderen Worten, für jede verstreichende Sekunde generiert der Timer zwei Interrupts.
Zuerst dachte ich, ich hätte vielleicht die Sicherungen falsch gemacht, aber das scheint nicht der Fall zu sein, da Verzögerungen gut funktionieren. Wie auch immer, hier ist, wie ich die Sicherungen konfiguriert habe:
-U lfuse:w:0xff:m -U hfuse:w:0x99:m
Ich habe absolut keine Ahnung, was los ist, ich habe alles doppelt überprüft, einen anderen ATmega32 ausprobiert, einen anderen 16-MHz-Quarzoszillator ausprobiert, und ich bekomme immer noch das gleiche Ergebnis.
Ist das Datenblatt falsch oder übersehe ich hier etwas?
Wenn der Systemtakt 16 MHz und der Prescaler 256 beträgt , läuft Ihr Timer weiter , also wird es in jedem eine Erhöhung geben . Ein Interrupt wird generiert, wenn der Wert des Zählers 31249 ist . Wenn wir diese Zeit berechnen: , was genau das gleiche Ergebnis ist, das Sie haben.
Die Gleichung im Datenblatt dient einem anderen Zweck:
Zum Generieren einer Wellenformausgabe in Modus, der Der Ausgang kann so eingestellt werden, dass er seinen logischen Pegel bei jeder Vergleichsübereinstimmung umschaltet, indem die Vergleichsausgangsmodus-Bits auf den Umschaltmodus gesetzt werden . Der Der Wert ist auf dem Port-Pin nicht sichtbar, es sei denn, die Datenrichtung für den Pin ist auf Ausgabe eingestellt . Die erzeugte Wellenform hat eine maximale Frequenz von Wenn wird auf Null gesetzt . Die Wellenformfrequenz wird durch die folgende Gleichung definiert: (...)
Wenn Sie die Frequenz eines bestimmten Pins messen würden, wäre es meiner Meinung nach 1 Hz.
Um eine 1 s zu erreichen , Interrupt-Generierung benötigen Sie 62500 Ticks und da der Zähler bei 0 beginnt, setzen Sie OCR1A auf , und da Timer1 ein 16-Bit-Timer ist, ist dieser Wert nicht zu hoch (< 65535, ).
Diese Formel gilt für die Ausgangsfrequenz des OCnA-Pins ("Zum Generieren eines Wellenformausgangs im CTC-Modus kann der OC1A-Ausgang so eingestellt werden, dass er seinen logischen Pegel bei jeder Vergleichsübereinstimmung umschaltet, indem die Vergleichsausgangsmodus-Bits auf den Umschaltmodus gesetzt werden (COM1A1: 0 = 1).[...] Die Wellenformfrequenz wird durch die folgende Gleichung definiert:"). Da Sie stattdessen den Interrupt verwenden, erhalten Sie zwei Vergleiche pro Periode. Lassen Sie die 2 vom Nenner weg, um die Unterbrechungsfrequenz zu berechnen.
DrFriedParts