AVR t85 Timer: "Compare-Wert - 1" und gemessene Frequenz

Gast #6266862
Lesenswert?

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.
Angehängte Dateien:
Gast #6267064
Lesenswert?

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...
Gast #6267113
Lesenswert?

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.
Gast #6267118
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren