Forum: Mikrocontroller und Digitale Elektronik Meine Minute dauert nur 40 Sekunden


von Rascheltüte (Gast)


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.

von Rascheltüte (Gast)


Lesenswert?

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?

von Markus W. (Firma: guloshop.de) (m-w)


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
}

von Rascheltüte (Gast)


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.

von Rascheltüte (Gast)


Lesenswert?

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)

von Rascheltüte (Gast)


Lesenswert?

ja du hast recht, der prescaler ist falsch gewählt, daran hab ich 
garnicht gedacht, dass nchmal zu kontrollieren :-(

von Ein Gast (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


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.

von Uwe Bonnes (Gast)


Lesenswert?

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?

von Johannes M. (johannesm)


Lesenswert?

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? ;-)

von Martin K. (maart)


Lesenswert?

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?

von Thomas E. (thomase)


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.

von Rascheltüte (Gast)


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.

von Uwe Pommes (Gast)


Lesenswert?

Rascheltüte schrieb:
> Jetzt dauern meine Minuten schon etwas länger, also wieder eher
> arbeitgeberfreundlich.

wie lang dauert deine minute jetzt?

von Falk B. (falk)


Lesenswert?

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

von Rascheltüte (Gast)


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.

von Markus W. (Firma: guloshop.de) (m-w)


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.

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
Noch kein Account? Hier anmelden.