Läuft der Timer während seinem Interrupt weiter?

Gast #58636
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
Gast #58638
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
Gast #58639
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
Angehängte Dateien:
Gast #58640
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
Gast #58642
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
Gast #58643
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
Gast #58644
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

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.