Time Library kalibrieren

hallo zusammen,

ich benutze die Time Library, habe aber eine Zeitabweichung von mehreren Sekunden pro Tag. Nun würde ich gern eine Kalibrierung durchführen, an welchem wert muß ich schrauben? Ich habe ein VB Programm geschrieben, das die synchronisierung mit der PC Zeit durchführt, der Arduino soll aber längere Zeit unabhängig laufen. Ich möchte eine Funktion basteln, die in Abhängigkeit der Zeit der letzten Synchronisation und der ab da aufgetretenen Zeitabweichung den Timer kalibriert. Hat da jemand eine Idee?

Gruss Michael

Bist Du Dir sicher, daß die Library schuld ist oder ist das Problem vieleicht Dein Quarz / Resonator? Die einzige wirklich brauchbare Methode ist auf einen RTC Chip zu wechseln.

[quote author=Udo Klein link=topic=59241.msg426576#msg426576 date=1303545708]Die einzige wirklich brauchbare Methode ist auf einen RTC Chip zu wechseln.[/quote]

...welche aber leider auch nicht immer 100%ig ist. Meine RTC z.B. geht pro Tag 1,57 Sekunden vor. :(

Optimal wäre ein DCF77-Empfänger oder ein GPS, sofern Du Empfang hast...

Wenn Deine RTC soviel daneben liegt, dann solltest Du die Kondensatoren / den Quarz checken oder gleich einen richtig guten RTC nehmen. Z.B. ds3231. Und wenn Du es unbedingt "100%ig" haben willst, dann hol Dir eben bei Ebay ein gebrauchtes Trimble Thunderbolt Modul.

Joghurt: Optimal wäre ein DCF77-Empfänger oder ein GPS, sofern Du Empfang hast...

Auch ein Radioempfänger mit RDS gibt die genaue Uhrzeit und ist funktioniert im Gegensatz zu GPS innerhalb von Häusern und ist weniger kritischer auf Störungen vom Rest der Elektronik als DFC77. Grüße Uwe

[quote author=Udo Klein link=topic=59241.msg427253#msg427253 date=1303625778]oder gleich einen richtig guten RTC nehmen.[/quote]

Ist ein DS1307-Breakout von Watterott, funktioniert mit Korrekturzeit mittlerweile ganz gut.

Aber das Wahre ist das natürlich nicht, gibts von dem DS3231 irgendwo eine Breakout-Version zu kaufen?

http://macetech.com/store/index.php?main_page=product_info&cPath=5&products_id=8&zenid=61f255fedb9c841ace9d4e18bc5c7d2e

Bestellt, bin gespannt. :) Tnx!

Berichte wie gut das Ding wirklich ist. Ich habe ein Thunderbolt hier, das ist richtig gut. Leider ist der Stromverbrauch ziemlich groß. Ohne Steckdose läuft da nichts. Es ist immer wieder cool zu sehen wenn der Frequenzzähler in der letzten Stelle abweicht und klar ist, daß der Frequenzzähler schuld ist :)

Einen extra chip wollte ich eben vermeiden. Es muß doch eine Möglichkeit geben, die Zeit z.B. einmal am Tag zu korrigieren?

Ich habe beste Erfahrungen mit dem PCF8583 gemacht. Mit einem Trimmer-C (siehe Datenblatt) habe ich es geschafft, den Chip auf ca. 1-2 sek Abweichung im Monat zu tunen (bei Raumtemperatur). Leider gibt's dafür noch kein Shield. Eine Arduino Library ist verfügbar. Der Chip hat einen Speicher, den man theoretisch zusätzlich dazu nutzen könnte eine SW-Korrektur der Zeit durchzuführen. Eine reine SW Lösung kann ich nicht empfehlen.

Hi,

ich habe mittlerweile 2 DS3231 im Einsatz und bin damit sehr zufrieden. Für den DS3231 braucht man eigentlich kein Shield der Anschluss beschränkt sich auf Spannungsversorgung +5V 0V, Batterie und den I2c Bus.

Hallo,

buddhafragt: Es muß doch eine Möglichkeit geben, die Zeit z.B. einmal am Tag zu korrigieren?

ein Kollege von mir macht das mit einem Funkwecker. Mittags um 12 "klingelt" dieser. Das Signal wird abgegriffen und auf einen Eingang des Prozessors geleitet. Damit stellt er täglich die Uhr, die intern läuft. (funktioniert auch für Sommer-/Winterzeit)

Gruss

Kurti

Hallo zusammen, hallo Michael,

ich glaube du suchst so etwas (Schnipsel aus meinem letzten Programm):

void UhrKorrektur (){

  time_t t = now ();
  if (hour(t) == 2 && minute(t) == 2 && second(t) == 2){
    adjustTime(30);
    Alarm.delay(1000);
  }
}

Ich habe ausprobiert um wieviel die Uhr pro Tag falsch geht (bei mir ca. 30sec) und korrigiere sie jede Nacht um 02:02:02 Danach verzögere ich das Programm um 1 Sekunde damit ich nicht mehrfach den adjust.Time aufrufe.

Nachteil: Wenn du deine Zeitsyncronisation mit dem PC kurz vor 02:00 Uhr machst, geht deine Uhr ab 02:02 Uhr 30 Sekunden vor. (Aber dafür nahezu konstant und sie läuft nicht weg)

(Hinweis: Aus der Alarm Libary verwende ich keine "repeat" Funktion sondern nur "once" sonst gibt es noch andere Probleme)

Viele Grüße, finu

30s Abweichung pro Tag? Das sind ~348 ppm, wie passiert denn sowas? Was für einen Arduino hast Du? Einen mit Resonator oder einen mit Quartz? Mit Resonator wäre das ziemlich gut, mit Quarz wäre das total daneben. D.h. falls Dein Arduino mit Quartz läuft stimmt was mit Deiner Software nicht.

…falls Dein Arduino mit Quartz läuft stimmt was mit Deiner Software nicht.

:blush: kann schon sein. Es ist mein erstes Programm für den Uno. Es ist ein Arduino Uno R2 aus Italien mit Quarz.

Was kann man falsch machen um die Uhr zu “verbiegen”? Ich benutze die Libaries:
#include <Time.h>
#include <TimeAlarms.h>
#include <Dogm.h>
#include <MemoryFree.h>

Time.h brauche ich nur um die Uhr zu stellen und auf einen bestimmten Zeitpunkt zu warten, die delays mache ich ausschließlich mit “Alarm.delay”, aus der TimeAlarms.h nutze ich nur den “Once” Befehl. Dogm.h brauch ich für mein Grafikdisplay (zeigt Zeit, Schaltpunkt, Schaltdauer, und zwei Graphen an). Das Programm läuft nun seit einer Woche einwandfrei und mit der nächtlichen “adjust.Time” Korrektur auch ausreichend genau.
Ich werde mir mein Programm aber nochmal genau ansehen…

Viele Grüße, finu

Man kann beispielsweise cli() benutzen um Interrupts auszuschalten. Wenn man das diese mit sei() wieder anschaltet, dann werden alle bis dahin aufgelaufenen einmal ausgeführt. Wenn aber ein Interrupts n >= 2 mal ausgelöst wurde folgt daraus, das er n-1 mal zuwenig ausgeführt wird. Inbesondere gilt das auch für die Uhr.

Wenn also eine der verwendeten Libraries Interrupts ab und zu zu lange abschaltet, dann läuft Deine Uhr zu langsam.

Ein häufiger Grund für längeres setzen von cli() sind “delay” Routinen die auf hohe Genauigkeit angewiesen sind und die Verzögerung durch Schleifen erzeugen. Sowas ist gelegentlich in irgendwelchen Libraries versteckt. Um herauszufinden ob eine Library dran schuld ist hat man verschiedene Möglichkeiten:

  1. Schauen was passiert wenn man die Library nicht verwendet…
  2. Analyse des vollständigen Quellcodes ALLER Libs.
  3. Analyse des Compilats.

(1) ist gelegentlich ausreichend, wenn es klappt grenzt es schnell das Problem ein.
(2) bringt den größten Erkenntnisgewinn. Die Arduino Libs sind alle ziemlich klein, daß geht also recht fix und man lernt viel dabei.
(3) das geht oft schneller, allerdings sind die Erkenntnisse geringer als mit (2) und man kann die Erkenntnisse nicht unbedingt beim nächsten Projekt wieder verwenden.

Aufgrund von (2) ist z.B. klar, daß die alte Implementation von delayMicroseconds die Arduino benutzt hatte um Mikrosekunden zu verzögern schuld sein konnte. Mittlerweile ist das allerdings behoben. Wenn man hingegen sowas wie
cli(); delayMicroseconds(…); kombiniert, dann ist man wieder genau dort.

Ein weiterer sehr häufiger Grund sind Interrupt Routinen die zu lange brauchen. In Interruptbehandlern wird bei den AVRs normalerweise implizit das Auslösen weiterer Interrupts unterbunden. Wenn nun eine ISR zu lange braucht hat man den gleichen Effekt wie oben beschrieben. Besonders kritisch ist das wenn die ISR nur leicht länger braucht als der Abstand zwischen 2 Timer Interrupts. Sagen wir mal 1%. In diesem Fall wird der Effekt verschluckter Timer Ticks statistisch auch nur in 1% der Fälle auftreten und die Uhr geht 1% zu langsam. Wenn die Laufzeit der ISR noch dazu von selten eintretenden Bedingungen groß gemacht wird, dann kann genau das dazu führen, daß die Uhr langsam aber sicher nachgeht.

Eine anderer Grund kann aber auch tatsächlich der Quarz sein. Um das auszuschliessen braucht man entweder einen Frequenzzähler oder alternativ einen zweiten Arduino und ein paar Ideen :wink:

...vielen Dank für die ausführliche Antwort! Ich werde mich dann mal auf die Suche machen sobald ich den nächsten Arduino habe. Uno "Eins" muss arbeiten! ]:D

Da der Fehler konstant zu sein scheint (läuft jetzt seit zwei Wochen), funktioniert "adjust.Time" für meine Zwecke ausreichend genau.

Du hast aber recht, ein Quarz sollte mit +-20ppm oder besser laufen.

Viele Grüße, finu

Naja, +/- 20ppm ist schon ziemlich gut wenn man keine besonderen Maßnahmen trifft. Ich habe schon öfters +/- 50 ppm und schlechter gesehen. Grund ist, daß die Quarze die Toleranzgrenzen nur einhalten wenn die Kondensatoren korrekt dimensioniert sind und die Temperatur halbwegs stimmt.

RTCs sind in der Regel deshalb besser weil da tatsächlich sorgfältig abgestimmt wird. Vor allem bei den Modellen mit Temperaturkompensation.