Forum: Mikrocontroller und Digitale Elektronik Echtzeituhr läuft zu langsam (Atmega8)


von Rick S. (riko)


Lesenswert?

Hi,

bin AVR-Anfänger und habe jetzt mal als Test eine Echtzeituhr in 
Assembler programmiert, um den Timer auszuprobieren. Es läuft auch alles 
wie gewünscht außer dass die Uhr pro 10 Minuten 3 Sekunden zu langsam 
ist. Meine Frage ist natürlich, woran das liegen könnte.

Ich benutze den Overflow-Interrupt des Timer0 mit Vorteiler 1. Bei jedem 
Interrupt wird Register a erhöht. Wenn dieses 25 erreicht hat, wird 
Register b erhöht und a wieder auf 0 gesetzt. Wenn b 25 erreicht hat, 
wird c erhöht und b wieder auf 0 gesetzt. Wenn c 25 erreicht hat, wird 
der Sekundenzähler erhöht und c auf 0 gesetzt.

Also 4 MHz / 256 = 15625 Hz
15625 Hz / (25  25  25) = 1 Hz

Ich habe schon überlegt, ob der Takt vielleicht nicht genau 4 MHz ist.
Ich habe hier eine fremde Schaltung und ich kenne mich mit den ganzen 
Bauelementen noch nicht so aus. Jedenfalls ist an den Pins XTAL1 und 
XTAL2 ein Teil angeschlossen auf dem '4.000' steht. Ich denke doch, dass 
das ein Quarz bzw Quarzoszillator ist :) (Was ist eigtl der 
Unterschied?). Parallel dazu ist noch ein Kondensator geschaltet und 
dann noch ein Kondensator zwischen XTAL2 und GND oder VCC wenn ich das 
richtig sehe.
Die CKSEL-Fuses sind alle auf 0, SUT0 ist auf 1, SUT1 auf 0.

Ach nochwas: Läuft der Timer eigentlich auch weiter, während der 
Overflow-Interrupt behandelt wird? Die Sekundenerhöhung dauert bei mir 
nämlich nicht immer gleich viele Takte (kommt drauf an, ob auch Minuten 
und/oder Stunden erhöht werden müssen). Obwohl das ja auch nur einige us 
Abweichung pro Sekunde wären.

Gruß,
      Henrik

von crazy horse (Gast)


Lesenswert?

"Ich habe schon überlegt, ob der Takt vielleicht nicht genau 4 MHz ist"
Gute Überlegung, daran muss es liegen, wenn die Software korrekt ist. 
Für einen Quarz ist die Abweichung allerdings zu hoch, mit einem 
Keramikresonator kommt das gut hin.
Also, ist es ein Quarz, liegt es an der Software.

von Karl H. (kbuchegg)


Lesenswert?

> Jedenfalls ist an den Pins XTAL1 und
> XTAL2 ein Teil angeschlossen auf dem '4.000' steht.
> Ich denke doch, dass das ein Quarz bzw Quarzoszillator ist :)

Das heist aber nicht, dass der exakt 4.0000000000 MHz hat.
Auch ein Quarz muss auf die exakte Frequenz abgeglichen
werden.
3 Sekunden bei 10 Minuten sind zwar etwas viel als dass
das alles auf das Konto der Quarzabweichung geht aber
ohne Programm kann man nicht mehr sagen.

> Was ist eigtl der Unterschied?)

Ein Quarz schwingt nicht von alleine. Man braucht einen
Schwingkreis dazu. Wenn zu einem Quarz der Schwingkreis
mit ins Gehäuse eingebaut wird, hast du einen Quarzosillator.
Der schwingt dann von alleine.

> Ach nochwas: Läuft der Timer eigentlich auch weiter, _während_
> der Overflow-Interrupt behandelt wird?

Ja. Der Timer beginnt zu laufen, sobald ein Vorteiler eingestellt
wird. Danach läuft er bis der Vorteiler wieder auf 0 gesetzt
wird. In der Zwischenzeit gint es nichts und niemanden der
den Timer am Laufen hindern würde. Der Timer ist hardwaremässig
unabhängig von der restlichen CPU.

von Karl H. (kbuchegg)


Lesenswert?


von Michael U. (Gast)


Lesenswert?

Hallo,

meine meist genutzte Variante:
Timer auf CTC-Mode
Compare-Interrupt
dann mit Zählregister weiter wie bei Dir.

Bei 4MHz z.B. Vorteiler 64 = 62500
Counter auf 250 = 250 (dann reicht ein 8Bit-Timer)
Register zählen bis 250 =  1s

Meist nehme ich aber einen 16Bit-Counter und teile so, daß ich 10ms oder 
20ms Interrupts erhalte.
Da läuft dann auch gleich Tastenentprellung mit drin.

Gruß aus Berlin
Michael

von unbeschreiblicher Rahul (Gast)


Lesenswert?

>Da läuft dann auch gleich Tastenentprellung mit drin.

Genau.

Eigenwerbung:
Beitrag "Ziemlich simple Uhr"

Irgendwann schreibe ich das mal auf avr-gcc um...

von Rick S. (riko)


Lesenswert?

danke für die Antworten.

Also bei 8bit-Timer/Vorteiler 64/Counter 250/Register bis 250 zählen/ 
hatte ich die gleiche Abweichung.

Bei 16bit-Timer/Vorteiler 64/Counter 62500/ läufts jetzt seit ner Stunde 
ohne erkennbare Abweichung.

Vielleicht hatte ich doch nen Fehler im Code :-)

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.