Kleine Frage zum Uhr-Tutorial

Gast #3714365
Lesenswert?
• ▲
▼
Morgen,
ich habe mir mal das Uhr Tutorial durch gelesen.
Allerdings auch nun ne Frage dazu. Es werden ja die Taktzyklen
gezählt. Bei einer bestimmten Anzahl wird ein Interrupt (Overflow) 
ausgelöst.

Werden im Falle eines Interrupts die Taktzyklen weiter gezählt?
Ansonsten hätte man ja nach jedem Interrupt wider einen Zeitlichen 
Versatz.
Gast #3714428
Lesenswert?
• ▲
▼
Hagrid schrieb:
> Werden im Falle eines Interrupts die Taktzyklen weiter gezählt?
> Ansonsten hätte man ja nach jedem Interrupt wider einen Zeitlichen
> Versatz.

Wenn du den CTC-Modus des Timers nutzt, dann zählt der hardwaremäßig 
hoch, ohne durch irgendwas gestört zu werden. Die Auslösung des 
Interrupts passiert auch automatisch beim Compare. Das heißt, durch dein 
Programm gehen auf keinen Fall Takzyklen verloren.
Gast #3714441
Lesenswert?
• ▲
▼
Das klingt ja ziemlich cool.
Danke! Hat mir sehr geholfen!
Was ist allerdings wenn das Programm so lange braucht, dass während 
dessen der Interrupt noch mal ausgelöst wird?
Das sollte bei der Uhr zwar nicht der Fall sein sein, wie sähe es dann 
bei längeren Programmen aus?
#3714507
Lesenswert?
• ▲
▼
Hagrid schrieb:

> Was ist allerdings wenn das Programm so lange braucht, dass während
> dessen der Interrupt noch mal ausgelöst wird?

Ein AVR sperrt Interrupts, wenn er in die ISR springt. Die ISR kann also 
von keinem (auch nicht ihrem eigenen) Interrupt unterbrochen werden. Die 
ISR läuft also bis zum Ende durch und sobald am Ende Interrupts wieder 
zugelassen sind, wird sie durch den anstehenden Interrupt gleich wieder 
ausgelöst. Falls während der Ausführung der ISR der Interrupt gleich 
mehrmals auslösen sollte, dann werden alle diese Auslösungen zu einer 
zusammengefaßt (es gibt nur ein Bit, das speichert ob ein Interrupt 
ausgelöst hat, nicht mehrere, um die Anzahl mitzuzählen).

Prinzipiell kann man in einer ISR Interrupts wieder zulassen. Das ist 
z.B. sinnvoll, wenn man mehrere ISR hat, manche davon selten aufgerufen 
werden und lang sind, andere hingegen oft aufgerufen werden und kurz 
sind. Dann kann man in der langen ISR Interrupts wieder erlauben (sei) 
und sie so von anderen Interrupts unterbrechen lassen.

Wenn in dieser Konstellation die ISR von ihrem eigenen Interrupt 
unterbrochen wird, dann können alle möglichen schlimmen Dinge geschehen. 
Z.B. wird sie sich ihre eigenen statischen Variablen zerschießen. Und 
wenn das oft genug hintereinander passiert (z.B. wenn das der 
Timer-Überlauf Interrupt ist) dann wird früher oder später der Stack 
überlaufen, die Variablen überschreiben und am Ende alles abstürzen.


XL

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.