RTC auf Millisekunden abgleichen

Hallo Leute!

Nachdem ich drei Tage (inkl. zusammenlöten) gebraucht habe, mein Adfafruit Data Logging Shield mit meinem Arduino Mega2560 zum Laufen zu kriegen, folgt auch gleich das nächste Problem. Meine Messdaten möchte ich später mit eine Bildverarbeitungssoftware abgleichen und zwar möglichst genau. Jetzt habe ich festgestellt, dass der DS1307 beim Abgleich mit dem PC keine Millisekunden abgleicht. Ein Blick in die C++RTClib und in die hRTClib ließ mich zu dem Schluss kommen, dass Millisekunden da auch gar nicht definiert sind. Nach zwei Stunden suchen im Internet habe ich ein Uhr gefunden (AtomSync), die mir Millisekunden auf dem Monitor darstellt. Der PC kann also Millis. Gibt es ein Trick, dass mein RTC die Millis mit synchronisiert?

Und noch eine Frage, was mir aufgefallen ist. Der serielle Monitor zeigt die PC-Zeit + 5 Sekunden. Braucht der Mikrokontoller so lange um das Zeitsignal zu empfangen, umzurechnen und dann darzustellen? Schreibt er auf die SD-Karte später die richtige Zeit?

Bin für jede Hilfe dankbar...

Viele Grüße

Der serielle Monitor zeigt die PC-Zeit + 5 Sekunden. Braucht der Mikrokontoller so lange um das Zeitsignal zu empfangen, umzurechnen und dann darzustellen

Nicht unbedingt, kannst du aber so programmieren :wink:

Zum Verständnis:

  • der "serielle Monitor" ist der in der IDE, der anzeigt, was der Arduino sendet ?
  • "um das Zeitsignal zu empfangen" heisst, den DS1307 über I2C abzufragen ?

Ich schätze mal, jemand hat die Uhrzeit falsch eingestellt ( auf dem PC ? ) :wink:
Oder deine loop() braucht zu lang bevor das Senden passiert.

Du kannst ja mal einen sketch schreiben, der auf ein Zeichen vom SerialMonitor wartet und mit der frisch gelesenen Zeit des DS1307 antwortet.
Das sollte quasi sofort, deutlich schneller als eine Sekunde gehen.

Um klarzustellen: der DS1307 hat keine Millisekunden sondern nur Sekunden. Er teilt die Frequenz des 32768 Hz Quarzes durch 32768 und erhält so ein 1 Hz Signal = Sekundensignal.

Wenn Du einen Sketch benuzt um mit der Uhrzeit des PC die Zeit zu stellen indem Du die Systemvariablen DATE TIME nimmst wirst Du immer eine kleinen Verspätung haben. Diese Variablen werden im Moment des Kompilierens genommen und in das Maschinenprogramm als numerischen Wert eingearbeitet, dann übertragen und ausgeführt (= RTC gesetzt). 5 Sekunden ist eigentlich sehr wenig für das alles.

Ich weiß keine Lösung um ohne viel Aufwand eine genauere Uhrzeit als Sekunden zu bekommen. (Außer GPS, welches aber in Gebäuden nicht funkioniert.

Lösungsvorschlag: Du nimmst die Uhrzeit vom Display des Arduino im Video (es genügt am Anfang) auf und kannst so sagen in welchem Bild die Sekunden wechseln. So kannst Du die Bilder auf das Logfile syncronisieren.

Viele Grüße Uwe

Hallo Uwe,

ich hatte in einem der zahlreichen Beiträge im Forum über den DS1307 gelesen, dass der beim Speichern von Daten auf einer SD-Karte die Zeit in Millisekunden dazuschreiben kann, gerechnet ab dem Resetzeitpunkt. Da werden die abgelaufenen Sekunden wahrscheinlich nur umgerechnet ?!? Hatte gehofft, dass der DS1307 auch vom PC ziehen kann. Geht also nicht...

Trotzdem Danke

Viele Grüße

Thomas

Arduino hat die Funktionen millis() und micros() die alle mS bzw µS incrementiert werden (Überlauf nach 49 Tagen bzw 70 Stunden). Sie starten bei null wenn der Arduino eingeschaltet wird. Es ist also möglich einen Zeitpunkt relativ auf mS bzw µS genau anzugeben aber nicht absolut gegenüber einem anderen System (Videokamera). Ich befürchte auch daß die Videokammera die Zeitstempel nicht so genau aufzeichnet.
Grüße Uwe

Ein Versuch habe ich noch :slight_smile:

Kann man den DS1307 vielleicht direkt über die USB-Schnittstelle ansteuern ohne den Umweg des kompillerens?

Was spricht dagegen, die RTC einmal mit einem speziellen Sketch zu setzen, der die Zeit per Serial-Input bekommt? Auf die Serielle Verbindung kannst Du dann z.B. mit Processing vom PC aus schreiben. Wenn die RTC einmal gesetzt ist, spielst Du dann deinen eigentlichen Sketch auf den Arduino, der dann die Zeit nur auslies, ohne sie zu setzen. Durch die Batterie auf der RTC sollte diese die gestellte Zeit behalten.
Du kannst das Zeit stellen ja auch in den eigentlichen Sletch einbauen. Wenn noch ein Pin-Frei ist, kann man den z.B. abfragen. Wenn der auf HIGH oder LOW (LOW ist einfacher, weil interner PullUP) gesetzt ist, wird auf dem seriellen Port auf eine Zeit gewartet und diese dann in die RTC geschrieben.

Buntmann:
Ein Versuch habe ich noch :slight_smile:

Kann man den DS1307 vielleicht direkt über die USB-Schnittstelle ansteuern ohne den Umweg des kompillerens?

Ja, kann man machen aber das löst nicht Dein Problem das Du im Titel geschrieben hast. Es bleibt immernoch eine Ungenauigkeit bis zu einer Sekunde zwischen Arduino und PC.
Grüße Uwe

Es bleibt immernoch eine Ungenauigkeit bis zu einer Sekunde zwischen Arduino und PC.

Wenn man die RTC stoppt und neu startet, kriegt dann nicht der interne 32786 - Zähler auch ein Reset ?
So kriegt man den Sekundenwechsel doch millisekundengenau hin, oder ?

Und die DS1307 hat auch einen Sekundentakt-Ausgang, damit kriegt man den sekundenwechsel auf die ms genau mit

Dann dürfte aber kein so großer Zeitversatz bei der Anzeige im ser. Monitor sein. Ich vergaß, das ganze sollte noch bedienerfreundlich sein und in drei oder sechs Monaten, wenn ich das Projekt übergeben habe auch noch funktionieren und laut Forum könnte ich pro Monat einen Zeitdifferenz von bis zur einer Sekunde haben, weil die Uhren halt nicht genau gleich gehen...

Ein DS1307 ist nicht soooo genau, die tägliche Abweichung dürfte im Sekunden-Bereich sein. Nach sechs Monaten kannst Du also Abweichungen im Minuten-Bereich erwarten. Deutlich genauer sind die DS323X-Chips vom selben Hersteller, da dort die Quartze temperaturkompensiert sind. Wenn Du aber eine zeitliche Übereinstimmung im Sub-Sekundenbereich auch nach Monaten haben willst, wirst Du um eine regelmässige Synchronisation nicht herumkommen. In diesem Bereich operieren übrigens auch die PC-RTC nicht, auch dort hast Du bis zu einigen Sekunden Abweichung pro Tag, wenn Du nicht eine Sychronisierung à la NTP benutzt.

Wenn es das Projekt erfordert und die Voraussetzungen gegeben sind (Netzwerk bis zum Arduino), dann verwende doch einen Arduino-Ethernet und synce dir Zeit per NTP. Das sollte zumindest auf die Sekunde genau werden. Täglich einmal (oder notfalls mehrmals) die Zeit per NTP holen und die Uhr wieder abgleichen.

Hatte mir auf Verdacht schon mal ein Arduino Ethernet Shield bestellt, mich da aber noch nicht richtig rangetraut, weil im Netz dazu noch nicht so viel gefunden hatte, muss wohl doch mal anfangen zu suchen, denn als absoluter Laie kann ich mir leider keine Programm selber schreiben, danke für die Tipps...

Bei der Ethernet-Lib der IDE ist doch ein UDP / NTP Client Beispiel dabei soweit ich weiss. Das kannst Du auf jeden Fall als Ausgangspunkt nehmen.

Schau mal bei "Datei -> Beispiele -> Ethernet" da muss es irgendwas mit NTP oder UDP geben. Ansonsten liefert "arduino NTP" bei google schon folgendes:

Meine Messdaten möchte ich später mit eine Bildverarbeitungssoftware abgleichen und zwar möglichst genau.
Jetzt habe ich festgestellt, dass der DS1307 beim Abgleich mit dem PC keine Millisekunden abgleicht.

Das sind zwei verschiedene Aufgaben:

  • eine Uhr auf eine Sekunde genau stellen ( synchron mit dem Rest der Welt) --> ntp
  • zwei Zeiten mit etwa gleicher Millisekunde (um ein Frame in einem Video wiederzufinden ?) zu synchronisieren. --> da ist engineering gefragt :~

alles klar, auf der Seite bin ich gerade dabei mich einzulesen, was es bei der IP-Adressierung zu beachten gibt, werde mich mal reinfuchsen.. auf jeden Fall hätte ich dann eine Referenzzeit auf die sich alle beziehen können... Spannung weg, soweit ich das im Moment beurteilen kann, heißt dann aber auch Zeit weg, bedeutet das muss als eine Art Routine vorweglaufen... bin auf den Abgleich mit dem seriellen Monitor gespannt...

Du stellst Dir das einfacher vor als es ist:

  1. Die serielle Schnittstelle hat eine begrenzte Übertragungsgeschwindigkeit
  2. Auf der PC Seite ist die Latenz der seriellen Schnittstelle grundsätzlich unbekannt
  3. Die Besten bezahlbaren RTCs die ich kenne sind DS323*. Die sind 2ppm genau. D.h. wenn Du garantiert auf 1 Millisekunde genau sein willst, dann mußt Du spätestens alle 500s nachstellen, besser wäre alle 250s.
  4. Damit beim Nachstellen nichts dazwischen kommt dürfen in der Zeit keine Interrupts (insbesondere die der seriellen Schnittstellen und Timer0) laufen
  5. Mit DCF77 auf 1/100s zu syncen ist leicht, auf 1/1000 schon schwieriger, aber möglich
  6. Mit GPS auf 1/1000s zu syncen ist für Timekeeping GPS leicht, für Navigations GPS ist unklar ob leicht oder schwer
  7. GPS geht nicht in Gebäuden

Meiner Meinung nach wäre die einfachste Lösung alles per Kabel synchron zu halten. Um Videoframes zu syncen wäre es vieleicht am einfachsten irgendwo EINEN ausreichend schnellen Zähler zu haben der per Definition richtig läuft und den einfach immer mal wieder mit der Kamera aufzunehmen.

Hallo Udo,

ich muss ehrlich sagen ich habe noch gar keine Vorstellung, ich muss mich da langsam rantasten, ich will ja eigentlich die Drück- und Rückholbewegung eines Inlineskaters erfassen, daher ist eine drahtgebundene Lösung unvorteilhaft wegen der verletzungsgefahr und der eingeschränkten Bewegung...

Viele Grüße

daher ist eine drahtgebundene Lösung unvorteilhaft

Wieso kommt dann aber eine Ethernet-Verbindung in Betracht (NTP)? Wenn es nur auf ein Video-Frame ankommt, sollte doch eine Auflösung von ca. 1/25s genügen (dazwischen ist ein Faktor 40!).

Also ich als Dummi habe gedacht, dass ich über Ethernet die Zeit synchronisieren kann und die dann auf dem Ethernet Shield weiterläuft (ich hatte in der Beschreibung da was von Clock gelesen), wahrscheinlich auch wieder falsch gedacht :~