Forum: Mikrocontroller und Digitale Elektronik Uhr(16 Bit Timer) läuft zu schnell (in 1h ca. 8 Sekunden zu schnell)


von Stefan Weninger (Gast)


Lesenswert?

Hallo,

ich habe eine Uhr programmiert und lasse diese auf einem LC_Display 
anzeigen, jedoch zählen die Sekunden zu schnell. (in einer Stunde ist 
meine Uhr ungefähr 8 Sekunden schneller)
Die Uhr soll später dazu dienen Messwerte zu speichern. Wenn die Uhrzeit 
ganze Zeit durchläuft ist sie an einem Tag schon 3 min vorne und in 
einer Woche schon 24 min.

Laut meiner Berechnung sollte genau 1 Sekunde herauskommen:

F_CPU=16MHz
Prescaler=1024
16 Bit Timer

NormalModus: TCNT1= 65536-(1s*16000000/1024)= 49911
CTC Modus:   OCR1A= 1s*16000000/1024 -1 = 15624

Code Normal Modus:

TCCR1A = 0x00; //normal port operation
TCCR1B = 0x00; //normal port operation
TCNT1 = 49911; //set start value for 50 ms
TCCR1B |= (1<<CS10) | (1<<CS12); //prescaler = 1024 and timer started
TIMSK1 |= 1<<TOIE1; //enable timer 1 overflow interrupt
sei();

ISR(TIMER1_OVF_vect)
{
    TCNT1=49911;
    Sekunden++;
}

Code CTC Modus:

TCCR1A = 0x00; //(set mode 4)
TCCR1B = 1<<WGM12; //CTC mode
OCR1A = 15624; //set TOP value for 1s
TCCR1B |= (1<<CS12) | (1<<CS10); //prescaler = 1024 and timer started
TIMSK1 |= 1<<OCIE1A; //enable timer 1 compare match interrupt

ISR(TIMER1_COMPA_vect)
{
  Sekunden++;
}

In beiden Moden verhält sich die Uhr gleich --> sie ist zu schnell!

Ich habe schon versucht so wenig wie möglich in die ISR zu schreiben(wie 
man sieht),jedoch hat sich da nichts geändert.


Kann man da etwas machen, dass die Uhr ganz genau und exakt läuft?

Danke schon im Voraus.

mfg
Stefan

von Frank S. (_frank_s_)


Lesenswert?

Hallo Stefan,

verrate doch bitte, welchen Prozessor du nutzt und ob du den internen 
Takt oder einen Quarz etc. verwendest.

Die Abweichung sieht für den internen Takt jedenfalls ganz gut aus.

MfG von der Spree

von MWS (Gast)


Lesenswert?

Frank S. schrieb:
> Die Abweichung sieht für den internen Takt jedenfalls ganz gut aus.

Nach den Registern ist das ein ATM8, 16 o.ä., seit wann liegt deren 
interner Takt bei 16MHz?
Und in dem Bereich muss er liegen, sonst würd' gar nichts gehen.

Stefan Weninger schrieb:
> Kann man da etwas machen, dass die Uhr ganz genau und exakt läuft?

Wie groß sind die Kondensatoren am Quarz?
Fehlt das sei() beim CTC-Code aus Versehen?
CKOPT-Fuse gesetzt?

Die Abweichung ist zu groß für einen ordentlich angeschlossenen Quarz, 
der bei 50ppm oder besser liegen sollte.

Ansonsten: OCR1A = 15624/3592*3600 = 15659;

von Stefan Weninger (Gast)


Lesenswert?

Prozessor: Atmega2560

Ich verwende den internen Takt.

Also ist die Abweichung ganz normal?

Man kann die Uhrzeit höchstens anpassen, wenn ich das richtig verstehe?

Wie verwendet man den Quarz?

mfg, Stefan

von Peter II (Gast)


Lesenswert?

Stefan Weninger schrieb:
> Ich verwende den internen Takt.

16Mhz hat er doch gar nicht intern?

von MWS (Gast)


Lesenswert?

Peter II schrieb:
> 16Mhz hat er doch gar nicht intern?

Das würde mich auch interessieren.

Stefan Weninger schrieb:
> Prozessor: Atmega2560
>
> Ich verwende den internen Takt.

Der liegt bei 8MHz, da würde keine Deiner Rechnungen stimmen, das Ding 
ginge dann auch nicht 8 Sekunden nach, sondern eine halbe Stunde.

von Teo D. (teoderix)


Lesenswert?

Stefan Weninger schrieb:
> Wie verwendet man den Quarz?

http://www.mikrocontroller.net/articles/Quarze_und_AVR

Wenn du noch mehr Fragen hast, findest du sicher die meisten Antworten 
hier in den Artikeln. Benutze die Suchfunktion!

von Stefan Weninger (Gast)


Lesenswert?

MWS schrieb:
> Fehlt das sei() beim CTC-Code aus Versehen?

beim reinkopieren vergessen.

MWS schrieb:
> CKOPT-Fuse gesetzt?

Was ist das?

MWS schrieb:
> Ansonsten: OCR1A = 15624/3592*3600 = 15659;

Was ist der Grund dafür?

von Max H. (hartl192)


Lesenswert?

Stefan Weninger schrieb:
> MWS schrieb:
>> Ansonsten: OCR1A = 15624/3592*3600 = 15659;
>
> Was ist der Grund dafür?
Damit kannst du deine Abweichung korrigieren, das funktioniert aber nur 
zuverlässig wenn der Fehler konstant ist.

: Bearbeitet durch User
von Stefan Weninger (Gast)


Lesenswert?

MWS schrieb:
> Peter II schrieb:
>> 16Mhz hat er doch gar nicht intern?
>
> Das würde mich auch interessieren.
>
> Stefan Weninger schrieb:
>> Prozessor: Atmega2560
>>
>> Ich verwende den internen Takt.
>
> Der liegt bei 8MHz, da würde keine Deiner Rechnungen stimmen, das Ding
> ginge dann auch nicht 8 Sekunden nach, sondern eine halbe Stunde.

Ich verwende das ATmega 2560 Board und das hat 16 MHZ:
siehe: http://arduino.cc/en/Main/ArduinoBoardMega2560

von Stefan Weninger (Gast)


Lesenswert?

Max H. schrieb:
> Stefan Weninger schrieb:
>> MWS schrieb:
>>> Ansonsten: OCR1A = 15624/3592*3600 = 15659;
>>
>> Was ist der Grund dafür?
> Damit kannst du deine Abweichung korrigieren, das funktioniert aber nur
> zuverlässig wenn der Fehler systematisch ist.

Ok, danke

von Max H. (hartl192)


Lesenswert?

Stefan Weninger schrieb:
> Ich verwende das ATmega 2560 Board und das hat 16 MHZ:
und diese 16MHz kommen von einem Quarz, also nichts mit "interner Takt".

: Bearbeitet durch User
von Stefan Weninger (Gast)


Lesenswert?

Max H. schrieb:
> Stefan Weninger schrieb:
>> Ich verwende das ATmega 2560 Board und das hat 16 MHZ:
> und diese 16MHz kommen von einem Quarz und nicht vom internen
> Oszillator.

Ja ok sry.

von MWS (Gast)


Lesenswert?

Stefan Weninger schrieb:
> Was ist das?

Gibt's beim ATM2560 nicht, wenn vorhanden, sorgt die für einen 
kräftigeren Antrieb des Quarzes.

> Was ist der Grund dafür?

Stefan Weninger schrieb:
> Ich verwende das ATmega 2560 Board und das hat 16 MHZ:
> siehe: http://arduino.cc/en/Main/ArduinoBoardMega2560

Das Board verwendet einen keramischen Resonator, der ist nicht so genau 
wie ein Quarz, der CSTCE16M0V53-R0 16MHz wird mit 0,5% angegeben. Rechne 
es hoch, da sind 8 Sekunden noch wenig.

von Stefan Weninger (Gast)


Lesenswert?

MWS schrieb:
> Das Board verwendet einen keramischen Resonator, der ist nicht so genau
> wie ein Quarz, der CSTCE16M0V53-R0 16MHz wird mit 0,5% angegeben. Rechne
> es hoch, da sind 8 Sekunden noch wenig.

Also kann man da gar nichts machen, außer versuchen den Fehler 
auszugleichen?

von Sebastian W. (wangnick)


Lesenswert?

Frank S. schrieb:
> verrate doch bitte, welchen Prozessor du nutzt und ob du den internen
> Takt oder einen Quarz etc. verwendest.

Stefan Weninger schrieb:
> Ich verwende das ATmega 2560 Board und das hat 16 MHZ:
> siehe: http://arduino.cc/en/Main/ArduinoBoardMega2560

Stefan Weninger schrieb:
> Ich verwende den internen Takt.

Tust du mit ziemlicher Sicherheit nicht. ArduinoBoardMega2560 hat einen 
externen 16MHz Quarz und der wird auch benutzt. Es sei denn du hättest 
an den CKSEL-Fuses manipuliert 
(http://www.atmel.com/Images/Atmel-2549-8-bit-AVR-Microcontroller-ATmega640-1280-1281-2560-2561_datasheet.pdf, 
Seite 327).

Ist dein ArduinoBoardMega2560 original oder ein China-Klon?

LG, Sebastian

von Peter II (Gast)


Lesenswert?

starte dein Programm einfach mal im Simulator, wenn dort genau 1 Sekunde 
1 Sekunde lang ist, dann stimmt der code.

von Stefan Weninger (Gast)


Lesenswert?

Sebastian Wangnick schrieb:
> Ist dein ArduinoBoardMega2560 original oder ein China-Klon?

Original aus Italien.

von Sebastian W. (wangnick)


Lesenswert?

MWS schrieb:
> Das Board verwendet einen keramischen Resonator, der ist nicht so genau
> wie ein Quarz, der CSTCE16M0V53-R0 16MHz wird mit 0,5% angegeben. Rechne
> es hoch, da sind 8 Sekunden noch wenig.

Oh, das war mir neu. Aber jetzt hab ichs im Scahltplan auch gesehen. Da 
wurde aber an der falschen Stelle gespart.

LG, Sebastian

von MWS (Gast)


Lesenswert?

Stefan Weninger schrieb:
> Also kann man da gar nichts machen, außer versuchen den Fehler
> auszugleichen?

Genau. Das Ding schwingt halt mit z.B. 16035635Hz und damit musst Du 
dann weiter rechnen. Ist kein Problem, solange der abweichende Wert in 
sich stabil bleibt.

von Stefan Weninger (Gast)


Lesenswert?

MWS schrieb:
> Genau. Das Ding schwingt halt mit z.B. 16035635Hz und damit musst Du
> dann weiter rechnen. Ist kein Problem, solange der abweichende Wert in
> sich stabil bleibt.

Danke!

Sebastian Wangnick schrieb:
> Oh, das war mir neu. Aber jetzt hab ichs im Scahltplan auch gesehen. Da
> wurde aber an der falschen Stelle gespart.

Da hast du Recht.

mfg, Stefan

von Joachim B. (jar)


Lesenswert?

Stefan Weninger schrieb:
> Also kann man da gar nichts machen, außer versuchen den Fehler
> auszugleichen?

http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC

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.