mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tiny13 Timerinterrupt mit falscher Zeiteinheit


Autor: Georg X. (schorsch666)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie soll der uC in 6 Takten eine ISR ausführen ?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Georg X. (schorsch666)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.