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.
Moin, Welchen "Uhr Tutorial" ? Ich würde mich ja einlesen, wenn ich einen Link hätte.
Das kommt auf die konkrete Programmierung des Timers an. Vergleiche doch mal den Code mit dem Datenblatt/Manual.
Hätte den Link vielleicht beifügen sollen. Meine das hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Uhr
Hi
>Werden im Falle eines Interrupts die Taktzyklen weiter gezählt?
Ja.
MfG Spess
Der Timer zählt, wenn aktiviert ist, komplett unabhängig vom Programm weiter.
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.
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.