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

Gast #6266862
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.