Tiny13 Timerinterrupt mit falscher Zeiteinheit

OP #1945036
Lesenswert?
• ▲
▼
Hallo Leute,


ich spiel hier grad mit nem Tiny13 rum.
Als Umgebung verwende ich das AVR-Studio4 und den GCC. Ich programmier 
somit den Tiny13 in C.

Ich hab jetzt mal einen Timerinterrupt eingerichtet und lass innerhalb 
dessen einen Portpin toggeln.
Eingestellt ist der internen Oszillator mit 4,8MHz und der ClockDivider 
steht auf 8. Somit läuft der µC ja mit 600kHZ. Wenn ich jetzt nen Timer 
mit dieser Frequenz laufen lasse dann bekomme ich alle 426.7µsec nen 
OVFIRQ. Soweit ja alles in Ordnung. Wenn ich jetzt aber im TimerIRQ den 
Timerwert vorbelege und somit den Überlauf zeitlich vor verschiebe dann 
passt die Messung überhaupt nicht mehr zusammen.

Als Beispiel belege ich den Timer mit 250. Somit sind ja nur 6 Takte für 
nen Überlauf notwndig. Was eine OVFIRQ Zeit von ca. 10µsec ergeben 
sollte. Wenn ich den Port aber am Oszi messe dann bin ich bei 138µsec.

Testweise hab ich auch den Clockdivider mal deaktiviert. Damit läuft der 
µC deutlich schneller. Auch hier kann ich eine Abweichung feststellen. 
Allerdings liegt diese bei ca. 50%.

Ich kann mir grad dieses Verhalten nicht erklären. Hatte jemand von euch 
bei diesem µC ähnliches Verhalten?

Gruss und Danke,
Georg.
Gast #1945062
Lesenswert?
• ▲
▼
Georg X. schrieb:
> Als Beispiel belege ich den Timer mit 250. Somit sind ja nur 6 Takte für
> nen Überlauf notwndig. Was eine OVFIRQ Zeit von ca. 10µsec ergeben
> sollte. Wenn ich den Port aber am Oszi messe dann bin ich bei 138µsec.

Du gehst davon aus, daß das Beschreiben des Timer-Registers exakt in dem 
Moment passiert, in dem die Interrupt-Bedinung auftritt. Tatsächlich 
liegt da aber einiges an Zeit dazwischen. Der Prozessor muß beim 
Auftreten eines Interrupts erstmal den aktuell ausgeführten Befehl 
fertigmachen. Dann sichert er den Program Counter auf den Stack. Als 
nächstes springt er den Interrupt-Vektor an, wo wieder ein Sprungbefehl 
steht, der dann die eigentliche ISR anspringt. Die fängt dann erstmal 
an, das Statusregister und die verwendeten Standard-Register zu sichern. 
Dann geht es mal so langsam an die Ausführung deines 
Timer-reset-Befehls.
6 Takte sind aber sowieso bei weitem zu wenig für die 
Interrupt-Abarbeitung. Für eine kurze ISR kannst du eher so das 5- bis 
10-fache davon rechnen. Dazu kommt noch das Hauptprogramm, das ja evtl. 
auch noch Zeit haben möchte.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.