Forum: Mikrocontroller und Digitale Elektronik Kleine Frage zum Uhr-Tutorial


von Hagrid (Gast)


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.

von Uwe (de0508)


Lesenswert?

Moin,

Welchen "Uhr Tutorial" ?
Ich würde mich ja einlesen, wenn ich einen Link hätte.

von Jim M. (turboj)


Lesenswert?

Das kommt auf die konkrete Programmierung des Timers an. Vergleiche doch 
mal den Code mit dem Datenblatt/Manual.

von Hagrid (Gast)


Lesenswert?

Hätte den Link vielleicht beifügen sollen.
Meine das hier: 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Uhr

von spess53 (Gast)


Lesenswert?

Hi

>Werden im Falle eines Interrupts die Taktzyklen weiter gezählt?

Ja.

MfG Spess

von Max H. (hartl192)


Lesenswert?

Der Timer zählt, wenn aktiviert ist, komplett unabhängig vom Programm 
weiter.

von npn (Gast)


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.

von Hagrid (Gast)


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?

von Max H. (hartl192)


Lesenswert?

Hagrid schrieb:
> Was ist allerdings wenn das Programm so lange braucht, dass während
> dessen der Interrupt noch mal ausgelöst wird?
Falsch prgogrammiert, die ISR soll so kurz wie möglich sein

von Axel S. (a-za-z0-9)


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

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.