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
"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.
> 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.
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
>Da läuft dann auch gleich Tastenentprellung mit drin. Genau. Eigenwerbung: Beitrag "Ziemlich simple Uhr" Irgendwann schreibe ich das mal auf avr-gcc um...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.