Forum: Mikrocontroller und Digitale Elektronik Läuft der Timer während seinem Interrupt weiter?


von Sebastian Wille (Gast)


Lesenswert?

Hi,

ich habe den Timer0 im Mega128 als RTC mit einem externen Uhrenquarz am
Laufen.

Meine Frage: Läuft der Timer, während die Befehle in seinem
Interrupt-Aufruf abgearbeitet werden, weiter? Oder erst wieder, wenn
ich mit "reti" zurückspringe?

Und werden andere Interrupts (z.B. Int0 usw.) solange blockiert?

Danke!

Sebastian

von Josef (Gast)


Lesenswert?

AVR Studio

von Josef (Gast)


Lesenswert?

Andere Interupts werden auf alle Fälle blockiert. Deswegen nicht
trödeln in den Interuptroutinen.
Der Uhrentimer laüft frei durch. Also auch beeilen, bis er wieder einen
Interupt auslöst.


Josef

von Sebastian Wille (Gast)


Angehängte Dateien:

Lesenswert?

Hi Josef,

vielen Dank! Das hatte ich gehofft, daß der weiterläuft.

Aber eins ist mir noch nicht so richtig klar: In der Atmel-AppNote
(hängt an) zu einer RTC mit dem AVR steht unter Accuracy, daß die Zeit
leicht abdriftet, wenn die "Timer-Variablen" aktualisiert werden.

Und in deren Hauptprogramm setzen sie immer wieder TCCR0 auf 0x05. Was
bringt denn das?!?

Danke!

Sebastian

von Josef (Gast)


Lesenswert?

TCCR0 auf 0x05 setzen vor sleep ist ein Dummybefehl.  Er setzt den
prescaler, damit der Timer exact alle sec einen Interrupt auslöst.
Wichtige Register sollten immer nachgesetzt werden. Besonders nach
sleep-Befehlen sollten solche Reinitialisierungen stattfinden.
Ausserdem hat Atmel in einer Error-Note einmal empfohlen, nach einem
Sleep Befehl min 2 Befehle folgen  zu lassen, damit der Sleepbefehl
richtig Zeit hat, um zu funktioniern - also macht man damit etwas
sinnvolles.

Josef

von Sebastian Wille (Gast)


Lesenswert?

Hi Josef,

danke, alles klar! :-)

Aber warum gibt es trotzdem einen leichten Drift laut Atmel?!?

Sebastian

von Josef (Gast)


Lesenswert?

Warum der Timer leicht driftet, ist mir etwas unklar. Jedenfalls wird
in der Interuptroutine, im worstcase, wenn alle Timerregister neu
besetzt werden (94 Sycles / 4 Mhz) ein leichter Drift erzeugt.
Warscheinlich ist die zu lang und es wird schon wieder ein neuer
Interrupt ausgelöst. Würde ev. einen 8 Mhz Quarz nehmen.

Josef

von Sebastian Wille (Gast)


Lesenswert?

Hi Josef,

genau das ist der Knackpunkt, warum ich den Thread begonnen habe.

Der Interrupt wird exakt jede Sekunde aufgeführt. Also dürfte meine
Interrupt-Routine bei 4MHz maximal 4.000.000 Zyklen lang sein. Im Worst
Case Fall ist sie ja nur 94 Zyklen lang...

Aber nun ist mir - glaube ich - klar, was die meinen. Bis in den
einzelnen Registern für Sekunden, Minuten usw. alle Werte richtig
drinstehen, vergehen ja einige Zyklen. Das ist mir aber egal, denn bis
die Zeichen auf dem Display stehen vergehen eh einige ms. Der Fehler
häuft sich ja auch nicht, sondern beträgt immer ca. 6µs Abweichung.

Danke auf jeden Fall nochmal! :-)

Sebastian

von Henning (Gast)


Lesenswert?

das die zeiten verspätet auf dem display landen ist ja halb so schlimm,
wesentlich wichtiger beim rtc ist das pünktlich und exakt die zeit
fortlaufend gezählt wird. sprich alle 1s der timer neu anläuft.
wielange genau das neue setzen der zähler dauert ist relativ egal, so
zumindestens meine sicht vom rtc

von Sebastian Wille (Gast)


Lesenswert?

Hallo,

genau so sehe ich das auch - solange das setzen der Variablen 1 Sekunde
nicht überschreitet! ;-)

Sebastian

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.