Warum wird vom Timer Output Compare value häufig eine 1 abgezogen (eins, -1, subtrahiert, weniger)? Ich dachte, ich hätte dazu im Datenblatt auch einen Satz gelesen - finde ich nicht mehr (http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf). Weil der Vergleich einen Timer-Tick dauert bzw. nach einem Tick stattfindet? Demnach dauert es beim Wert 0 bereits 1 Tick. Also muss vom Sollwert (Ticks) 1 abgezogen werden. Ja? Mein "Problem" ist nämlich, dass die eingestellte deutlich von der gemessenen Frequenz abweicht. Einstellung: 16.5e6/8/43 = 47965,11 (-> OCR0B += 42); Gemessen: 24.542 kHz Rechteck * 2 = 49084 kHz Interruptfrequenz Also über 2% Abweichung. F_CPU müsste jedoch auf besser 1% eingestellt sein (micronucleus USB bootloader), also ca. zwischen 47490 und 48444 kHz liegen. Ich messe mit einem Rigol Oszilloskop. Entweder ich bin off-by-one, die Kalibrierung ist falsch, oder ich messe Mist. Ich muss wohl mal den ISP rausholen und CKOUT aktivieren zum Vergleich.
Fragesteller schrieb: > Demnach dauert es beim Wert 0 bereits 1 Tick. > Also muss vom Sollwert (Ticks) 1 abgezogen werden. > Ja? Ja. Ist doch logisch: So ein Timer-Register ist mathematisch gesehen ein Divisor. Ein Divisor mit dem Wert Null wäre eine (praktisch unbrauchbare) Singularität. Also vermeidet man die Sinularität (und erweitert nebenbei den nützlichen Wertebereich), indem man per Konvention festlegt, dass der tatsächliche Divisor dem Registerwert+1 entspricht. Ähnliches wirst du an SEHR vielen Stellen in der digitalen Elektronik finden...
Danke für die Bestätigung. Ich dachte, das hätte irgendwo explizit gestanden. Aber auch AVR130 erwähnt das nirgends. Für den CTC Mode gibt es eine Formel, in dem die 1 steckt. Aber dann ist mein Compare-Value ja richtig, und entweder die Kalibrierung oder die Messung daneben. Ich vermute: ersteres.
Ah: > 11.5 Output Compare Unit > The 8-bit comparator continuously compares TCNT0 with the Output Compare Registers (OCR0A and OCR0B). > Whenever TCNT0 equals OCR0A or OCR0B, the comparator signals a match. >> A match will set the Output Compare Flag (OCF0A or OCF0B) at the next timer clock cycle. > If the corresponding interrupt is enabled, the Output Compare Flag generates an Output Compare interrupt. > The Output Compare Flag is automatically cleared when the interrupt is executed.
> Forensoftware > sucht > Programmierer
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.