Uhrzeit wird falsch angezeigt

Nabend

Ich hab ein Problem, dass sich die Uhr irgendwann aufhängt und eine Falsche Uhrzeit anzeigt.
Habe die Vermutung dass es an SetSyncInterval liegt. Verwende ich das richtig?

#include <DS3232RTC.h>
#include <TimeLib.h> 
#include <Wire.h>

void setup() {  // Setup beim Start des Arduinos

  setSyncProvider(RTC.get);     // Zeit vom RTC bekommen
  setSyncInterval(5000);
 delay(1000);
  
}


void loop() { // Schleife 

   Serial.print(hour());
  Serial.print(minute());
}

Hallo

Das Print im Loop wird zu oft aufgerufen . So schnell kann es nicht ausgegeben werden und die Schnittstelleläuft über.

Bau was ein damit du nur jede Sekunde einmal über die serial.print kommst

Am besten mit millis , zur Not kannst du auch ein delay (1000) mit in den Loop nehmen

Zum Thema millis blink without delay aus den Beispielen ansehen und verstehen

Hängt sich trotzdem mit der Zeit auf auch wenn ein delay von 1000ms dabei ist.

Na dann fehlt sicher noch was.

Beispiel aus der lib suchen und das erst mal testen

scr34m_818:
Hängt sich trotzdem mit der Zeit auf auch wenn ein delay von 1000ms dabei ist.

Warum verwendest du nicht ein Beispiel aus der Library ?
Da wird doch alles genau vorgegeben.

Einfacher geht es wirklich nicht.

Ich will eigentlich nur wissen wie es mit SetSyncInterval funktioniert damit ich dass auf einen anderen Code übertragen kann

scr34m_818:
Ich will eigentlich nur wissen wie es mit SetSyncInterval funktioniert damit ich dass auf einen anderen Code übertragen kann

Und genau das findest du in den Beispielen.
Da es zahlreiche Libraries für die RTC gibt, kann ich das hier nicht sagen.
Poste einen Hyperlink zu der Lib und wir können für dich nachschauen.

Hi

hour() und minute() kommen wo her?
Es gibt durchaus mehr als eine Lib, Die den Namen RS3231 trägt.
Bei den Anderen ist Das ebenfalls zumindest zu vermuten.
Bevor ich also anfange und DIr eine Lösung auszuarbeiten, Die bei Dir dann eh nicht läuft, wäre Es ganz nett, wenn Du die verwendeten Libs verlinken würdest.

Zum Thema 'Aufhängen' - wenn der Sketch sich auch mit delay(1000); aufhängt, müsste Er Sich ohne das delay() DIREKT aufhängen (da der Arduino doch ein/zwei Mal oder öfter die Sekunde dort vorbei kommt).

Wenn der Aufhänge-Zeitpunkt eher 'gleich' ist, wird's wohl was Anderes sein.

MfG

Die TimeLib von Paul Stoffregen will bei setSyncProvider eine Funktion/Methode, die die UNIXZeit zurückliefert.

Wir haben das hier in einer schwereren Geburt mal für die RTC des Nextion gebaut. Daran kann man sich für andere Quellen evtl. orientieren.

Gruß Tommy

Tommy56:
Die TimeLib von Paul Stoffregen will bei setSyncProvider eine Funktion/Methode, die die UNIXZeit zurückliefert.

Wir haben das hier in einer schwereren Geburt mal für die RTC des Nextion gebaut. Daran kann man sich für andere Quellen evtl. orientieren.

Gruß Tommy

Ja genau und die UNIXZeit bekomme ich mit RTC.get ich habe nur das Problem mit SetSyncInterval
Die Timelib ist ja auf längerzeit gesehen etwas ungenau darum möchte ich einmal am Tag die Timelib mit dem RTC synchronisieren. Aber wenn ich das mit SetSnyncInterval mache hängt sich die Uhrzeit auf.
Darum wollte ich fragen wie das funktioniert mit SetSyncInterval bzw. ob es noch eine andere Lösung gibt

Die Lib ist genau, der Takt des MC ist es nicht.

Ich habe mit 3600 bei setSyncInterval (am ESP8266) gute erfahrungen gemacht, auch 7200 oder größer geht. Ich habe immer Vielfache einer Stunde genommen.

Gruß Tommy

Okey also müsste das ja theoretisch so funktionieren wie ich oben geschrieben habe oder?

Weil bei mir hängt sich die Uhrzeit wenn ich SetSynchInterval benutze irgendwann auf bzw. die Zeit wird falsch gesetzt

Wenn ich mir das RTC direkt ausgeben lasse bekomme ich folgendes:

20:51:41.011 -> 1554925844

Hi

10.04.2019 21:50:44 -> 1554925844

Was stimmt daran nicht?
Ich verstehe Dein Problem nicht!
Ich verstehe, daß Du ganz gerne hättest, daß der µC eine genaue Uhrzeit hat.
Dafür hat Er eine RTC.
Um nicht laufend nur mit der Uhr zu schwätzen, wird die aktuelle Uhrzeit nur 'ab und zu' dort ausgelesen und ggf.(??) angepasst.
DABEI hast Du Probleme, oder?
... Welche?

Bitte keine Wiederholungen der 'schüff ... Uhrzeit ist falsch ... hängt sich auf'-AUssagen - sondern, wie äußern sich die Unzulänglichkeiten, was hast Du bisher versucht, Das einzugrenzen und was ist dabei herausgekommen?
ALLES, was Du bereits erfolglos probiert hast, brauchen wir Dir hier nicht vorschlagen - oder, wir erkennen einen Fehler in Deinem Vorgehen, dann wird's vll. doch noch was.

MfG

#include <DS3232RTC.h>
#include <TimeLib.h>
#include <Wire.h>

void setup() {  // Setup beim Start des Arduinos

  setSyncProvider(RTC.get);     // Zeit vom RTC bekommen
  setSyncInterval(5000);
 delay(1000);
 
}


void loop() { // Schleife

   Serial.print(hour());
  Serial.print(minute());
  delay(1000);
}

Hängt Uhrzeit wird nach unbestimmter Zeit falsch ausgegeben bis man den Arduino resettet und er erneut sich die Uhrzeit vom RTC hohlt

#include <DS3232RTC.h>
#include <TimeLib.h>
#include <Wire.h>

void setup() {  // Setup beim Start des Arduinos

  setSyncProvider(RTC.get);     // Zeit vom RTC bekommen
 delay(1000);
 
}


void loop() { // Schleife

   Serial.print(hour());
  Serial.print(minute());
  delay(1000);
}

Funktioniert einwandfrei aber irgendwann wenn die Uhr Monate durchlaufen würde wär sie irgendwann ungenau oder?

Dann gib uns doch mal die richtigen und die falschen Ausgaben, so wie sie bei Dir auf Serial erscheinen.

Wir können nicht auf Deinen Rechner schauen.

Gruß Tommy

Hi

Das sieht doch nach einem ISR-Aufruf auf - intern wird der Kram so alle Sekunde aufgerufen und dort wird geschaut, ob die Zeit bereits abgelaufen ist ... oder so.
Meiner Meinung nach wird der Fehler dann dort zu finden sein - ist hier auch der einzige Unterschied zwischen beiden Sketchen.
Gibt's diese ISR? Der ganze Kram aka atomar und volatile sind, auch, wenn's eine Lib ist, ja nicht zwingend zu 100% eingehalten.
Dürfte aber keinen Absturz auslösen - außer, da hängt sich was auf, weil die Zeit einfach noch nicht um ist - Werteüberlauf oder so Kram.
Gab's schon einen Link zur Lib?

Davon ab: Auch eine RTC wird 'nach einigen Monaten' die eine oder andere Sekunde falsch gehen - wenn der Sketch aber nicht viel mehr machen soll, als bisher gezeigt, sehe ich noch keine größere Katastrophe auf Dich zukommen :wink:

MfG

postmaster-ino:
Das sieht doch nach einem ISR-Aufruf auf - intern wird der Kram so alle Sekunde aufgerufen und dort wird geschaut, ob die Zeit bereits abgelaufen ist ... oder so.

Wo meinst Du da eine ISR zu erkennen?

Gruß Tommy

Hi

Das 'selber synchronisieren' wird regelmäßig die übergebene Zahl mit der bereits vergangenen Zeit vergleichen müssen.
Da ich hier keinen separaten Aufruf dazu sehe, wird Das die Lib wohl intern abfrühstücken - da wäre meine Wahl ein selbständig wiederkehrender Aufruf - das macht ein Timer, Dieser springt dann eine ISR an (... setzt ein Flag, wenn auch das IE Flag gesetzt ist ... -> ISR)

... und irgendwo Da wird mit Stringoperationen ein Crash zwischen Stack und Heap ausgelöst ... ok, Das ist jetzt wirklich weit her geholt :wink:

MfG

ISRs kommen von Prozessor-interner Hardware. Die Library ist rein Software:

  if (nextSyncTime <= sysTime) {
    if (getTimePtr != 0) {
      time_t t = getTimePtr();

Ist wie millis(). Abfragen ob eine bestimmte Zeit abgelaufen ist und wenn ja wird die per Funktionszeiger übergebene Funktion aufgerufen die die Zeit von der RTC holt

Das findest jedesmal statt wenn man irgendwie die Zeit aus der Library ausliest.

Das Problem tritt komplett unregelmäßig auf es kann mal Stunden dauern und die Uhrzeit ist auch nicht immer im gleichen Abstand falsch.