DCF 77 Zeit springt um eine Sekunde vor / zurück

Hallo

Ich spiel grad mit Zeitmodulen rum (DS3231-RTC-Modul und DCF77-Modul).

Mein Sketch soll die Zeiten von beiden Modulen auf einem LCD-Display anzeigen.
Eigentlich wollte ich den Aufbau eine Weile in die Schublade legen und nach ein paar Wochen schauen, ob das RTC-Modul noch richtig geht.

Zum Testen liegt der Aufbau jetzt eine Weile neben mir, dabei ist mir folgendes aufgefallen:
Beide Zeiten laufen gleich, beim Minutenwechsel springt die DCF-Zeit dann manchmal eine Sekunde vor.
Beim nächsten erfolgreichen Signal-Empfang springt die Zeit wieder zurück.
Das Ganze passiert so alle 10 Minuten mal.

Bei einer Uhr spielt das kaum eine Rolle, merkt ja keiner ob die gelegentlich mal eine Sekunde falsch geht.
Mich würde aber interessieren, wo der Fehler herkommt.

Gruß, e0mc2

Code:

#include <DCF77.h>
#include <Time.h>
#include <TimeLib.h>
#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal.h>

#define DCF_PIN 2           // DCF77 Pin
#define DCF_INTERRUPT 0     // Interrupt mit Pin

DS3231 clock;
RTCDateTime dt;

time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

int RTCStd = 0;
int RTCMin = 0;
int RTCSek = 0;

int DCFStd = 0;
int DCFMin = 0;
int DCFSek = 0;

void setup() 
 {
  lcd.begin (16, 2);
  DCF.Start();
  clock.begin();
 }

void loop()
 {
  time_t DCFtime = DCF.getTime(); //Prüfen ob neue DCF-Zeit vorhanden ist
  if (DCFtime!=0)
   {
    setTime(DCFtime);
   }
     
  dt = clock.getDateTime(); 
  
  // Variablem RTC setzen
  RTCStd = dt.hour;
  RTCMin = dt.minute;
  RTCSek = dt.second;  

  // Variablen DCF setzen
  DCFStd = hour();
  DCFMin = minute();
  DCFSek = second(); 

  // RTC anzeigen
  lcd.setCursor (0, 0);
  lcd.print ("RTC:    ");
  if (RTCStd < 10) lcd.print ("0");
  lcd.print (RTCStd);
  lcd.print (":");
  if (RTCMin < 10) lcd.print ("0");
  lcd.print (RTCMin);
  lcd.print (":");
  if (RTCSek < 10) lcd.print ("0");
  lcd.print (RTCSek);
  lcd.setCursor (0, 1);

  // DCF anzeigen
  lcd.print ("DCF77:  ");
  if (DCFStd < 10) lcd.print ("0");
  lcd.print (DCFStd);
  lcd.print (":");
  if (DCFMin < 10) lcd.print ("0");
  lcd.print (DCFMin);
  lcd.print (":");
  if (DCFSek < 10) lcd.print ("0");
  lcd.print (DCFSek);

}

Ist die 59 Sekunde (fehlendes Sekundensignal zum Erkennen des Minutenanfangs und Synchronisation der Datenübertragung) der DCF77 Dekodierung falsch implementiert? Grüße Uwe

Ich denke, dass er es teilweise falsch erkennt.

Etwa einmal pro 10 Minuten überspringt er beim Zählen die "0" (geht von 59 direkt auf die 1). Beim nächsten richtigen erfassen des Signales (meist eben genau eine Minute später) hat er dann wieder die richtige Zeit (bleibt sozusagen 2 Sekunden auf der "0").

Gruß, e0mc2

Mich würde aber interessieren, wo der Fehler herkommt

Aus deiner dcf-Library, bzw. der Art wie sie verwendet wird.

Kann die Library dir den exakten Zeitpunkt eines Sekunden-Wechsels oder Minuten-Wechsels sagen? (ms genau? )

DCF liefert einmal pro Minute Datum/Uhrzeit, die Sekunde denkt sich die Library selbst aus, indem sie sich auf diesen Minuten Wechsel synchronisiert.