Meine Minute dauert nur 40 Sekunden

Gast #2908391
Lesenswert?

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.
(Firma: guloshop.de) #2908405
Lesenswert?

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
}
Gast #2908414
Lesenswert?

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.
#2908483
Lesenswert?

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.
#2908682
Lesenswert?

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.
Gast #2909184
Lesenswert?

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.
Gast #2909481
Lesenswert?

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.
(Firma: guloshop.de) #2909672
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren