Wenn ich mir die Sekunden anzeigen lasse (60 Stück) und messe parallel
mit der Stoppuhr, dann vergehen auf der Stoppuhr nur 40 Sekunden. Also
muss irgendwo ein Fehler drinnen sein, aber ich find ihn nicht. Oder
kann es sein, dass der interne Oszillator so schlecht ist, dass dadurch
dieser große Fehler herkommt?
Hallo!
Ich hab keine Ahnung, ob du Prescaler und Timer richtig parametriert
hast, war jetzt zu Faul, das Datenblatt zu holen. ;-)
Aaaber, die ISR wolltest du bestimmt so schreiben:
sorry, Timer_Zaehler = 0 steht natuerlich auch drinnen, wuerde das
fehlen, würde er ja nur einmal die sekunde zählen.
Ich hab den Prescaler so gewählt, dass nach der Division ein gerader
Wert rauskommt
1Mio/8 = 125.000
F_OC = 1000 (soll 1mal pro Milisekunde ausgelöst werden)
Also ist ORC1A = 125-1 = 124 ---> ein gerader Wert.
Rascheltüte schrieb:> sorry, Timer_Zaehler = 0 steht natuerlich auch drinnen
Wofür wurde eigentlich vor mehreren Jahrzehnten "copy & past" erfunden?
Dann weiss man einfach, das man eine identische Kopie hat, was zwar
nicht immer erwünscht ist, aber in diesem Fall vielleicht doch ganz
praktisch.
Rascheltüte schrieb:> Wenn ich mir die Sekunden anzeigen lasse (60 Stück) und messe parallel> mit der Stoppuhr, dann vergehen auf der Stoppuhr nur 40 Sekunden.
Das ist ja die perfekte Arbeitnehmeruhr.
Rascheltüte schrieb:> Oder kann es sein, dass der interne Oszillator so schlecht ist, dass> dadurch dieser große Fehler herkommt?
Natürlich kannst du nicht erwarten, daß eine Minute 60.000.000µs dauert.
Aber 40s ist nun sehr weit daneben. Mit 57 oder 63 Sekunden wirst du
leben müssen oder du musst einen Quarz nehmen.
mfg.
Rascheltüte schrieb:> Meine Minute dauert nur 40 Sekunden.>> #define F_CPU 1000000UL
...
> Verwende den internen Oszillator des Atmega88.
Und wie kommst Du darauf, dass der interne Ozillator 10 MHz hat?
Uwe Bonnes schrieb:> Rascheltüte schrieb:>> Meine Minute dauert nur 40 Sekunden.>>>> #define F_CPU 1000000UL> ...>> Verwende den internen Oszillator des Atmega88.>>> Und wie kommst Du darauf, dass der interne Ozillator 10 MHz hat?
Weil eine 1 mit 6 Nullen 1 MHz sind? ;-)
Rascheltüte schrieb:> TCCR1B |= (1<<CS11) | (1<<CS10) | (1<<WGM12)
Das ist Prescaler = 64.
Martin Kreiner schrieb:> Und warum zählst du dann mit if (Timer_Zaehler == (100) )> nur bis Hundert?
Das ist wohl die Verzweifelungstat, weil es mit 1000 nicht hingehauen
hat.
Damit sollte er die Minute allerdings in 6 Sekunden machen. Da der
Prescaler aber nicht auf 8 sondern auf 64 steht, dauert es jetzt 6*8s =
48s.
Das kommt dann so leidlich hin mit den handgestoppten 40s.
mfg.
Thomas Eckmann schrieb:> Das ist wohl die Verzweifelungstat, weil es mit 1000 nicht hingehauen> hat.
genau, dass war sie - eine Verzweiflungstat, weil ich erst nach dem
Fehler gesucht hab - und was macht man da - erst mal überall dran
rumdrehen und rumprobieren. Leider ward ich nicht auf die Idee gekommen,
den Prescaler zu überprüfen. Hab mir einfach den Wert für 8bit falsch
abgeschrieben, eine Null und Eins vertauscht. Aber mit schwerwiegenden
Konsequenzen.
Jetzt dauern meine Minuten schon etwas länger, also wieder eher
arbeitgeberfreundlich.
Falk Brunner schrieb:>>Jetzt dauern meine Minuten schon etwas länger, also wieder eher>>arbeitgeberfreundlich.>> Grundrechenarten und ein Quarz wirken Wunder.
dass ist richtig - ABER zu einfachen Testzwecken reicht das vollkommen
aus. Eine Differenz von 20Sekunden fand ich extrem, eine Sekunde oder
gar +-2 Sekunden sind mir auch noch egal.
Rascheltüte schrieb:> dass ist richtig - ABER zu einfachen Testzwecken reicht das vollkommen> aus. Eine Differenz von 20Sekunden fand ich extrem, eine Sekunde oder> gar +-2 Sekunden sind mir auch noch egal.
Wenn du den Oszillator über das Register OSCCAL nachkalibrierst, dann
kriegst du auch Abweichungen von weniger als eine Sekunde/Minute
zuverlässig hin.