PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timergrundlagen



Riley
25.07.2007, 18:49
Hallo, O:)

ein Timer springt ja in gleichmäßigen Abständen in den Timerinterrupt.
Wenn sich das Programm im Timerinterrupt befindet, zählt der Timer dann weiter?
Oder ist er in dieser Zeit gestoppt?

Habe den Timer mit einer Frequenz von 20Hz ablaufen lassen und gleichzeitig im Timerinterrupt einen "Wait 2 - Befehl" eingebracht.

Das ganze mittels LED zur Ansicht gebracht.

Die LED blinkte alle 2 sec.

Nun denke ich, wenn ich die Zeit für meine Timerinterrupts ausrechnen möchte, muss ich die Zeit die ich benötige um den Timerinterrupt abzuarbeiten mitrechnen.

Habe ich einen Denkfehler, oder stimmt das so.

Schöne Grüße,
Riley

MeckPommER
25.07.2007, 19:35
Ich glaube, das ist ein Denkfehler.

Der Timer zählt immer unbeirrbar weiter. Wenn du einen 8-Bit Timer mit 20Hz ticken läßt, dann mußte er alle 12,8 Sekunden beim Überlauf den Interrupt auslösen, wobei er dann weiterzählt.
Deine LED sollte also eigentlich 10,8 Sekunden aus sein, dann 2 Sekunden an u.s.w.

Wobei man sich leicht mal vertut ist die Berechnung des Interruptintervalls aus Taktfrequenz, Prescaler und der Bittiefe des Timers.
Kannst ja mal deinen Quellcode einstellen, vielleicht finden wir dann des Rätsels lösung :-)

Gruß MeckPommER

Hanni
25.07.2007, 21:27
Habe den Timer mit einer Frequenz von 20Hz ablaufen lassen und gleichzeitig im Timerinterrupt einen "Wait 2 - Befehl" eingebracht.

Naja, wait in einer Interupt Routine ist ne ganz blöde Idee.
Vor allem deshalb weil sich interupts für gewöhnlich nicht selbst unterbrechen.

Grüße,
Hanni

MeckPommER
26.07.2007, 16:00
Japp. Interrupt-Routinen sollten immer so kurz wie möglich sein. In diesem Fall ists aber nicht so wichtig.
Ich glaube, Riley meinte, das der Timer mit 20Hz getaktet wird und nicht, das er 20* pro Sekunde einen Interrupt auslöst.

Gruß MeckPommER

Riley
26.07.2007, 17:11
Den Wait 2 Befehl wollte ich nur zur Veranschaulichung in den Interrupt einbringen.

Ich verwende einen Quarz mit 16 MHz.

Ich möchte den Timer für das US-Modul SRF05 verwenden.
Es sollte alle 50ms eine Enfernungsmessung vorgenommen werden.
Der Timerinterrupt hat eine Durchlauf von 40ms.

Riley
26.07.2007, 17:16
Anbei der Quellcode!

Prescaler und Timerwert sind noch nicht richtig eingestellt.

Es wird eine Entfernung gemessen und dann entsprechend der Entfernung eine Zahl auf einer 7-Segmentanzeige ausgegeben.

Schöne Grüße,
Riley

milkbubi
26.07.2007, 18:42
Also der Timer läuft unabhängig vom restlichen Programm weiter. Da du im Interrupt 2 Sekunden wartest, kann das Programm 40 mal (2s*20Hz) nicht in die Routine springen, da es sich schon darin befindet. Sobald er wieder ins Hauptprogramm springt kommt nach spätesten 1/20 Sekunde der nächste Interrupt. Da das mit Augenmaß wohl nicht zu erfassen sein wird kommst du auf deine 2 Sekunden.
Hoffe ich rede keinen Müll, dann verbessert mich.

mfg milkbubi

Riley
26.07.2007, 20:05
Der Timer zählt unabhängig weiter, egal ob er sich im Interrupt befindet oder nicht. Mit diesem Satz ist mir der Knopf aufgegangen! :)

Wenn der Interrupt in meinem Fall 40ms lang dauert, müsste ich den Timer so zählen lassen, dass der Interrupt in Zeitabständen größer 40ms gestartet wird.
So stört der Interrupt den Programmablauf nicht mehr.

Hab ich es jetzt nun verstanden?

Dankesehr,
Riley

MeckPommER
26.07.2007, 20:12
Japp :-)

Der Timer zählt in Abhängigkeit vom Systemtakt, der Rest kümmert ihn nicht.
Eine gebräuchliche Vorgehensweise ist mitunter, im Interrupt nur eine Variable zu setzen, die dann im Hauptprogramm ausgewertet wird.
Der Interrupt setzt die Variable - im Hauptprogramm schubbst die Variable die Entfernungsmessung an.
So bleibt der Interrupt schön kurz und verzögert keine anderen Programmteile, aus denen beim Timerüberlauf rausgesprungen wird.

Gruß MeckPommER

milkbubi
26.07.2007, 23:03
schön dass wir helfen konnten.
Wenn die Entfernungsmessung das einzige ist, was der mc machen soll kannste die Messung auch im Interrupt machen, ansonsten ist die Variante mit Variable hochzählen und im Hauptprogramm auswerten auf jeden Fall vorzuziehen.
Was man noch wissen sollte ist aber, dass auch das rein und raus springen aus der Routine Zeit kostet, was bei der Timervorgabe brücksichtigt werden sollte um keine Interrupts zu "verlieren".

Schönen Abend noch

mfg milkbubi

Riley
27.07.2007, 06:32
Ist ja ger nicht so kompliziert, wenn man es mal verstanden hat!

Vielen Dank!! =D>
Riley