mikrocontroller.net

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


Autor: Rick S. (riko)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rick S. (riko)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.