Uhr(16 Bit Timer) läuft zu schnell (in 1h ca. 8 Sekunden zu schnell)

Gast #4029103
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
Gast #4029141
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;
Gast #4029146
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
Gast #4029193
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
Gast #4029194
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
Gast #4029211
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.
Gast #4029212
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?
#4029213
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

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