Forum: Mikrocontroller und Digitale Elektronik Tiny13 Timerinterrupt mit falscher Zeiteinheit


von Georg X. (schorsch666)


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.

von MWS (Gast)


Lesenswert?

Wie soll der uC in 6 Takten eine ISR ausführen ?

von Rolf Magnus (Gast)


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.

von Georg X. (schorsch666)


Lesenswert?

Nabend Leute,

danke für den Hinweis. Daran hab ich jetzt irgendwie nicht mehr gedacht.
Dass kommt davon wenn man mit großen, schnellgetackteten µC verwöhnt 
ist.

Gruß,
Georg.

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
Noch kein Account? Hier anmelden.