Meine Minute dauert nur 40 Sekunden. #define F_CPU 1000000UL #define PRESCALER 8UL #define F_OC 1000UL TCCR1B |= (1<<CS11) | (1<<CS10) | (1<<WGM12) TCCR1B &= ~(1<<CS12); OCR1A = ((F_CPU/(PRESCALER*F_OC))-1); TIMSK1 = (1<<OCIE1A); ISR (TIMER1_COMPA_vect) { Timer_Zaehler ++; if (Timer_Zaehler == (100) ) Sekunden ++; } Ich hab den Kram analog zu diesem Link gemacht: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR. Verwende den internen Oszillator des Atmega88. Weis nicht, was ich falsch gemacht hab.
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:
1 | ISR (TIMER1_COMPA_vect) |
2 | {
|
3 | Timer_Zaehler ++; |
4 | |
5 | if (Timer_Zaehler == (100) ) |
6 | {
|
7 | Timer_Zaehler= 0; // <----------- |
8 | Sekunden ++; |
9 | }
|
10 | }
|
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.
CS12 CS11 CS10 Description 0 0 0 No clock source (Timer/Counter stopped). 0 0 1 clkI/O/1 (No prescaling) 0 1 0 clkI/O/8 (From prescaler) 0 1 1 clkI/O/64 (From prescaler) 1 0 0 clkI/O/256 (From prescaler)
ja du hast recht, der prescaler ist falsch gewählt, daran hab ich garnicht gedacht, dass nchmal zu kontrollieren :-(
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: > F_OC = 1000 (soll 1mal pro Milisekunde ausgelöst werden) Und warum zählst du dann mit
1 | if (Timer_Zaehler == (100) ) |
nur bis Hundert?
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.
Rascheltüte schrieb: > Jetzt dauern meine Minuten schon etwas länger, also wieder eher > arbeitgeberfreundlich. wie lang dauert deine minute jetzt?
Rascheltüte (Gast) >Jetzt dauern meine Minuten schon etwas länger, also wieder eher >arbeitgeberfreundlich. Grundrechenarten und ein Quarz wirken Wunder. AVR - Die genaue Sekunde / RTC http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR
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.
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.