Oder man nutz den Takt des DFC77
Oder man nutz den Takt des DFC77
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
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
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€
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.
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 auffallenZitat von sebastian.heyn
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
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.
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:Zitat von Marco78
Code: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) { ... }
Lesezeichen