PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uhrzeit



Amri
29.07.2005, 11:17
Hallo,
ich möchte in meinem Controller eine Uhr programmieren (keine Funkuhr).
Aber wie bekomme ich den Controller dazu, dass er immer nach einer Sekunde weiterzählt? Ich könnte das Ganze natürlich über den Timer-Überlauf machen, aber das ist mir zu ungenau: Normale Quarze haben eine Abweichung von 30ppm, das würde bedeuten, dass meine Uhr pro Tag um 2,6 Sekunden falsch geht.
Was gibt es noch für Möglichkeiten?



Ich habe mir erlaubt den Titel von "Uhzeit" in "Uhrzeit" zu verändern!
Viele Grüße
Florian (Moderator)

SprinterSB
29.07.2005, 11:49
Es gibt Quarzoszillator-Bausteine, die allerdings teurer sind als Quarze und mehr Platz und Strom brauchen. Sie erzeugen an einem Ausgang den Takt.

http://www.reichelt.de/bilder/web/B400/!OSZI.jpg

Intern verwenden sie auch einen Quarz, haben aber idR Temperaturkompensation etc, so daß sie eine höhere Genauigkeit erreichen.
Falls sein Controller externen Takt akzeptiert (zB AVRs), ist das eine Möglichkeit.

Toleranz zB 0.01ppm: http://www.unverdross.de/p9a5.htm

Amri
29.07.2005, 11:56
Falls sein Controller externen Takt akzeptiert (zB AVRs), ist das eine Möglichkeit.

Ja, ich verwende einene AVR. Soweit ich weiß, verwendet der aber für den Timer einen eigenen, eingebauten Quarz und nicht den externen. Wenn, dann bräuchte ich also zum Beispiel einen Baustein, der an einem Pin in regelmäßigen Abständen (z.B. 1 Sekunde) ein Signal sendet.

albundy
29.07.2005, 12:12
Es gibt Quarzoszillator-Bausteine, die allerdings teurer sind als Quarze und mehr Platz und Strom brauchen

Und wenn es noch etwas genauer sein soll, baut die Firma Seiko, Twin Quarze in ihre Uhren der gehobenen Preisklasse.
Dabei schwingen beide Quarze mit unterschiedlicher Frequenz und der Mittelwert dient als Zeitbasis. Die Abweichung solcher Uhren soll bei max. 3 Sek pro Jahr liegen.

SprinterSB
29.07.2005, 12:26
Ja, ich verwende einene AVR. Soweit ich weiß, verwendet der aber für den Timer einen eigenen, eingebauten Quarz und nicht den externen.
AVRs haben keine internen Quarze.
AVRs verwenden für ihre Timer die gleiche Frequenz wie für die CPU, evtl durch einen Prescaler runtergeteilt.
Die CPU wiederum kannst du takten via
- internem RC-Oszillator (Standard-Einstellung)
- externem RC-Oszillator
- externem Takt
- externem Quarz
- externem Keramik-Oszillator

Das Zauberwort zur Auswahl heißt 'fuse bits'.


Dabei schwingen beide Quarze mit unterschiedlicher Frequenz und der Mittelwert dient als Zeitbasis.
Wie sollen die Quarze denn verschaltet sein???
Hört sich an wie gehobener Mumpitz -- sorry.
Wenn Q_A einen Fehler macht von h_A und Q_B einen solchen von h_B. Dann liegt der Fehler des arithmetischen Mittels bei
(|h_A|+|h_B||/2.
...oder steh ich da aufm Schlauch...?

5 Sek/Jahr sind etwa 0.2ppm, nicht schlecht!
Immerhin sind Quarze mechanische Bauteile.
Mit vorgealterten, selektierten Quarzen, bekannten parasitären Effekten und eingeschränktem Temperaturbereich sieht's natürlich anders aus als mit der Bastelschaltung...

Dino Dieter
29.07.2005, 12:30
Hallo

Schau dir mal den Beitrag zum Thema an.

http://www.mikrocontroller.net/forum/read-4-57760.html#new

Gruß
Dieter

Amri
29.07.2005, 13:17
Hallo

Schau dir mal den Beitrag zum Thema an.

http://www.mikrocontroller.net/forum/read-4-57760.html#new

Gruß
Dieter

Wenn ich das richtig verstanden habe, dann wird hier einfach der Timer verwendet, man lässt die Uhr einen Tag laufen, liest die Abweichung ab und kann diese dann in die Zeit miteinberechnen.
Meine Frage: Ist die Abweichung konstant? Wenn ich jetzt messe, dass mein Quarz 30 ppm zu schnell läuft, habe ich dann mit genau diesem Quarz immer 30 ppm Abweichung oder kann sich das auch ändern?

Dino Dieter
29.07.2005, 13:41
Hallo Amri

Die 30 ppm werden schon über eine längere Zeit relativ konstant bleiben. Jedoch altert der Quarz ja und die Temperatur wird auch eine Rolle spielen.

Siehe dazu auch

http://www.sprut.de/electronic/mess/frequenz.htm

Gruß
Dieter

Amri
29.07.2005, 13:49
Dann kann es also nicht sein, dass der Quarz heute mal 30ppm zu schnell ist, morgen 30ppm zu langsam? Das würde mir schonmal reichen ;)

SprinterSB
29.07.2005, 13:49
Ja, ist eben die Individualität eines jeden Quarzes.

Ein Faktor ist die Temperatur. Der Zusammenhang zwischen Temperatur und Frequenz -- die Temperaturdrift -- ist i.A nichtlinear und abhängig vom Quarztyp (Schnitt).
Dein Temperaturprofil ist aber jeden Tag ähnlich, so daß das weniger ins Gewicht fällt.

Ein weiterer Faktor ist die Alterung des Quarzes bzw seiner Kontaktierung, aber das misst sich eher in Jahren.

Mit der softwareseitigen Kompensation solltest du schon um einiges genauer werden können. Wieviel genau, wirst du sehen wenn es implementiert ist.

ceekay
31.07.2005, 20:04
hallo,
es gibt auch echtzeituhren (als kleine ic´s) diese könne auch ohne Spannungsversorgung mit einem goldcap gepuffert an die 14 tage laufen.
diese echtzeituhren könne über i2c ausgelesen werden.

möglich das ich mich da irre, wollte es aber trotzdem loswerden...

gruß ceekay

Marco78
31.07.2005, 20:35
Oder man nutz den Takt des DFC77 ;)

Amri
31.07.2005, 21:45
Naja, nur für den Takt eine DCF77-Antenne anzuschließen wäre ja nicht sehr sinnvoll- da könnte ich auch gleich das Signal ausswerten und eine Funkuhr programmieren ;)

sebastian.heyn
01.08.2005, 08:34
wenn man den avr mit 16mhz laufen lässt, dann ist die abweichung so gering, das dürfte keine problem darstellen. Das dürfte allemal genauer sein, als n radiowecker für 10 euro

SprinterSB
01.08.2005, 09:16
Die Quarzfrequenz ist für die Genauigkeit unerheblich. Ob ein Quarz 16MHz hat oder 100kHz; bei einer Genauigkeit von 10ppm ergibt sich der gleiche Fehler. Allerdings gibt es spezielle Uhrenquarze, die genauer sind als die üblichen Feld-Wald-und-Wiese-Quarze. Sie sind kleiner, arbeiten aber dummerweise bei 32768kHz und werden nicht in Serienresonsnz betrieben, sondern in Parallelresonanz.

230V Radiowecker benutzen gerne die 50Hz Netzfrequenz als Zeitbasis. Wie genau die sind weiß ich nicht, jedenfalls müssen die genau eingehalten werden. Wenn ein Kraftwerk im Netzverbund seine 50Hz nur 20ms später ins Netz speiste, würd irgendo mächtig was kokeln. Keine Ahnung, wie die Dinger synchronisiert werden...

DCF77 ist natürlich das komfortabelste, wenn man 10€ fürn Funkmodul und Platz für das Modul hat. Stromausfall ist einem egal, man bekommt Datum, Umstellung Sommer/Winterzeit und den Wochentag. Wenn das Signal mal schlecht ist, dann läuft man eben solange auf Quarz.

Conrad: 641138, 10€
Reichelt: DCF77 MODUL, 15€

sebastian.heyn
01.08.2005, 10:06
Ich habe mal nen alten funkwecker zerlegt, da waren zwei schwarze kleckse auf der platine, die verbindung zwischen beiden hatte das DCF signal drauf, vielleicht erstmal ne billigere variante als nen empfänger zu kaufen.

Wenn man die uhr in der software programmiert also mir incr sekunde und if sekunde=60 then incr minute:sekunde=0
dann geht da rechenzeit verloren, und das wird genauer wenn man einen schnelleren quarz benutzt. das meinte ich .

außerdem iglaube ich mal gelesen zu haben, dass schnellere quarze meistens genauer gehen.

Amri
01.08.2005, 14:34
Wenn man die uhr in der software programmiert also mir incr sekunde und if sekunde=60 then incr minute:sekunde=0
dann geht da rechenzeit verloren, und das wird genauer wenn man einen schnelleren quarz benutzt. das meinte ich .
Ich denke, solange man für die Sekundenzählung den Timerüberlauf verwendet, dürfte das kein Problem sein. Der Timer läuft ja schließlich immer gleich schnell, egal wie viele Befehle ausgeführt werden. Und ob die Minuten ein paar Nanosekunden früher oder später erhöht werden, dürfte auch kaum auffallen ;)

olfi13
01.08.2005, 14:44
Die Energieversorger versuchen die 50 Hz einzuhalten. Kommt es bei stärkeren Lastschwankungen zu Frequenzschwankungen, so gleichen die Energieversorger das dann danach durch leichte Frequenzänderung wieder aus bis der Radiowecker wieder stimmt.
Das ist für die zwar keine Pflicht, aber sie machen es dennoch (das war's aber auch schon soweit ich weiß mit freiwilliger Dienstleistung)

Gruß, olfi

Marco78
01.08.2005, 18:57
Ich wusste ja garnicht, das mein Radiowecker auf die Netzfrequenz synchronisiert wird?!

Ein 32kHz Uhrenquartz kann auch direkt an einem Mega angeschlossen werden und dann für den Uhrzeittakt sorgen. Das sind die Anschlüsse OSC1 und OSC2. Wie das dann weiter verarbeitet wird hängt sicherlich von der Programmiersprache ab. Ich selbst habe das noch nicht getestet und könnte wenn überhaupt nur helfen wenn es um BASCOM geht. Da wüsste ich wo ich es nachlesen kann.

Aber wenn es wirklich so 100%ig genau sein muss, bleibt wohl nur das Funkzeitsignal.

Es bleibt auch zu beachten, das wenn ein Timer benutzt wird, die Zeit vom Auslösen des Interrupts bis zur Ausführung des erstens Befehls der ISR die Uhrzeit verfälscht.
Ich habe mir mal eine Uhr programmiert, die die Zeit auf einem LCD anzeigt. Am AVR ist auch ein IR-Empfänger angeschlossen. Über ein Menü kann mit einer Fernbedienung der Preload-Wert des Timer angepasst werden. So kann man die Ungenauigkeit des Taktes und die nicht berechnetet Zeiten zum ausführen des Programms kompensieren.

SprinterSB
01.08.2005, 22:15
Es bleibt auch zu beachten, das wenn ein Timer benutzt wird, die Zeit vom Auslösen des Interrupts bis zur Ausführung des erstens Befehls der ISR die Uhrzeit verfälscht.
Nö. Nicht wenn man Timer 1 richtig verwendet. Da gibt es ein "Clear Timer on Compare Match" zusammen mit ISR zu Output-Compare (nicht: Timer Overflow) und richtigem Wert im Output-Compare-Register bekommt man genauen Sekundentakt hin -- jedenfalls so genau, wie es Quarz/Resonator hergeben:

void init_timer1()
{
/* timer1 is counter */
TCCR1A = 0;
#if defined (__AVR_AT90S2313__)
// timer1 running on full MCU clock
TCCR1B = _BV (CS10) | _BV (CTC1);
#elif defined (__AVR_ATmega8__)
// Mode #4 für Timer1 (Manual S. 97)
// und full MCU clock
TCCR1A = 0;
TCCR1B = _BV (WGM12) | _BV (CS10);
#else
#error Dont know how to setup timer1
#endif

// set PoutputCompare to get desired Timer1 frequency
OCR1A = (unsigned short) ((long) F_CPU / INTERRUPTS_PER_SECOND-1));

// output compare interrupt for timer 1
TIMSK |= _BV (OCIE1A);
}

SIGNAL (SIG_OUTPUT_COMPARE1A)
{
...
}