Pages: [1] 2   Go Down
Author Topic: RTC auf Millisekunden abgleichen  (Read 1563 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3005
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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 smiley-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  ? )  smiley-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.
 
 

Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 257
Posts: 21484
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 257
Posts: 21484
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ein Versuch habe ich noch :-)

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

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 257
Posts: 21484
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ein Versuch habe ich noch :-)

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
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3005
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 108
Posts: 5144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
http://arduino.cc/en/Tutorial/UdpNtpClient
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3005
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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  smiley-confuse

Logged

Pages: [1] 2   Go Up
Jump to: