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
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
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;
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
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.
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!
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?
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
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
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
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
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.
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.
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?
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
starte dein Programm einfach mal im Simulator, wenn dort genau 1 Sekunde 1 Sekunde lang ist, dann stimmt der code.
Sebastian Wangnick schrieb: > Ist dein ArduinoBoardMega2560 original oder ein China-Klon? Original aus Italien.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.