Einflüsse auf die Genauigkeit des CPU-Timers

Hallo zusammen

Ich bin gerade an der Umsetzung einer textuellen Uhr welche die Zeit in einer Buchstaben-Matrix darstellt.
Siehe dazu QLOCKTWO – A NEW SENSE OF TIME – Handmade in Germany

Dafür verwende ich ein Sparkfun Thing, da ich so die Zeit mit dem Wifi Modul über NTP einfach abgleichen kann.
Ich habe dabei bewusst auf ein RTC Modul verzichtet, da ich in vielen Foren und Beiträgen gelenhabe, dass die Controller-Zeit ungenau ist, die jedoch in einem Bereich indem ich es für für akzeptabel eingestuft habe dies wieder per NTP abzugleichen.

Nun habe ich die TimeLib eingefügt und due Synchronisation mit dem NTP-Server.
Zu Testzwecken synchronisiere ich fie Zeit nun jede Minute und prüfe dabei die Differenz der über fie Timelib nachgeführten Zeit und die des NTP.

Dabei sehe ich nun, dass die Zeit der TimeLib fast 3 Sekunden pro Minute abweicht.
Dies ist in einem Bereich der für meine Umsetzungnicht nehr akzeptabel ist, so dass ich nun ein RTC Modul gekauft gsbe.

Nun jedoch zu meinen Fragen.

Welche Faktoren können zu so grossen Abweichungen führen? Wieso habe ich 3 Sekunden pro Minute, wenn ich in anderen Beiträgen von Projekten mit 2 Sekunden pro Tag lese.

Vielen Dank für eure Inputs im Voraus
Hafisch

Wenn diese Abweichung stabil ist, kannst du sie kompensieren.
Auch gibt es ja noch Helferlein wie ESP.getCycleCount()

Welche Faktoren können zu so grossen Abweichungen führen? Wieso habe ich 3 Sekunden pro Minute, wenn ich in anderen Beiträgen von Projekten mit 2 Sekunden pro Tag lese.

z.B. ein schlichter Rechenfehler in deinem Code, oder in deiner geheimen TimeLib.

Oder:
Quarze mögen keine Vibrationen.

Zu jedem Quarz gibt es ein Datenblatt.
Dort sind die Arbeitsbedingungen beschrieben.

Hallo,

wenn Du einen öffentlichen NTP server nutzt kann das auch daran liegen das die Anwortzeiten recht lange sein können. letztlich bekommst Du ja die Zeit der Anfrage beim Server. Wenn es dann Zeit benötigt bis die Daten bei dir angekommen sind kann das als Fehler auftreten. Mach das doch einfach mal alle 10 Minuten, wenn es an der internen Uhr liegt dann müsste der Unterschied ja 30s sein. Wenn es immer noch 3s sind dann liegt es an dem sync Vorgang.

Ich hab da eigendlich noch keine grösseren Abweichungen in der Uhrzeit festgestellt und ich glaube mit der standardeinstellung wird die Zeit alle 2 Stunden synchronisiert.

Heinz

Ich hab da eigendlich noch keine grösseren Abweichungen in der Uhrzeit festgestellt

Man kann ja leicht die Dauer zwischen Anfrage und Antwort messen. Die in der Antwort zurückgelieferte Zeit muss irgendwo dazwischen liegen, wenn das relevant ist.

Es gibt auch Router, die sich selbst per NTP synchronisieren und als ntp Server verwendet werden können. Da dürften Latenz-Zeiten gering sein.

Hallo zusammen

Danke für die Antworten.
Ich habe bereits einen Test gemacht, bei welchem ich alle 10 Minuten eine Synchronisation mit dem NTP-Server mache.
Die Differenz beträgt dann tatsächlich etwa 30 Sekunden.
Daher muss es schon am Timer des Boards liegen.

Als Library verwende ich die TimeLib, welche ich von hier habe:

Eine Vermutung ist, dass es an der Library liegt.
Ich werde auf jeden Fall einmsl eine Messung mit millis() machen.

Gibt es zwischen einem Arduino und einem SparkFun Differenzen welche sich in der Anwendung von Libraries äussern können?
Oder gibt es Einstellungen des Boards (Frequenz oder ähnliches) welche einen Einfluss auf das Timing und die Library haben können?

Eine Kompensation kommt von Quarz- Toleranzen und Ungenauigkeiten kommt nicht in Frage. Dies wird sich je nach Alter, Temperatur, usw dann ja auch noch ändern, so dass die Korrektur auch wieder nich stimmt.
Ein RTC ist bestellt. :wink:

Danke für die Kompetente Hilfe und einen schönen Abend wünscht
Hafisch

Eine RTC ist da in jedem Fall die bessere Wahl.

Ich hoffe, du hast die richtig (DS3231) bestellt.
Die ist von "Haus aus" Temperatur kompensiert.

Hallo zusammen

Ich habe soeben nochmals einige Tests gemacht, Dabei sind noch 2 Fragen aufgetaucht, welche ich mir noch nicht erklären kann.
Zum einen habe ich nun jede Minute, wenn die TimeLib einen Minuten-Wechsel ausgibt, einen Zeitstempel mit millis() über die serielle Schnittstelle aus.
Dieser Zeitstempel stimmt jede Minute auf die Millisekunde genau.
Soweit so gut.

Nun habe ich im Serial Monitor in der Arduino IDE den Zeitstempel aktiviert.
Und auch dieser mit einer Genauigkeit von etwa 6ms eine Minute Zeitdifferenz an.

Die Differenz sehe ich erst, wenn ich kurz vor, und kurz nach der NTP-Synchronisation die Zeitstempel ausgebe.

Die Frage ist nun, woher kommt der Zeitstempel des Serial Monitors? Ist dies die PC-Time oder kommt dies irgendwie vom Controller hoch?

Danke für die Hilf und einen schönen Abend wünscht
Hafisch

Hi

Die vom Terminal angezeigte Zeit ist vom PC.
Der Arduino sendet wirklich nur Das, was Du Dem sagst.

MfG

Hallo

such dir doch mal ein Beispiel für den ESP das die standard time.h verwendet.

oder verwende mal den hier, das benutze ich eigendlich seit einiger Zeit, weiss aber nicht mehr wo ich das jetzt her habe. Must aber sicher manuell mal eine Uhr daneben halten :slight_smile:

Heinz

#include <ESP8266WiFi.h>
#include <time.h>

const char* ssid = "xxxx";
const char* password = "yyyy";

int year;
byte month, day, hour, minute, second;

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("\nConnecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  configTime(0,0,"192.168.178.1");  // locale Fritzbox 
  //configTime(0, 0, "pool.ntp.org", "time.nist.gov");
  // setenv("TZ", "GMT0BST,M3.5.0/01,M10.5.0/02",1);
 
  setenv("TZ", "CET-1CEST,M3.5.0,M10.5.0/3", 1);  // locale Zeit einstellen mit Sommerzeit

  Serial.println("\nWaiting for time");
  while (!time(nullptr)) {
    Serial.print(".");
    delay(1000);
  }



  Serial.println("");
}

void loop() {

  readtime();
  Serial.printf("%02u-%02u-%4u\n", day, month, year);
  Serial.printf("%02u:%02u:%02u\n", hour, minute, second);
  delay(1000);
}
// Datum und zeit auslesen
void readtime() {
  time_t now = time(nullptr);
  struct tm*timeinfo;
  time(&now);
  timeinfo = localtime(&now);
  year = 1900 + timeinfo->tm_year;
  month = 1 + timeinfo->tm_mon;
  day = timeinfo->tm_mday;
  hour = timeinfo->tm_hour;
  minute = timeinfo->tm_min;
  second = timeinfo->tm_sec;


}

Hallo zusammen

Ich hab den Fehler gefunden.
Trau mich fast nicht zu Schreiben, aber aufgrund der tollen Hilfe die ich von euch erhalten habe, bin ich es euch schuldig :wink:

Ich hab die NTP Zeit geholt, diese korrekt in eine Unix-Zeit gewandelt und danach die Zeit in Stunden, Minuten und Sekunden gewandelt, welche ich in einer Struktur gespeichert habe.

Beim Wandeln der Unix-Time ist mir jedoch ein Tippfehler unterlaufen. So habe ich anstelle von % (Modulo) ein & (Adresse) erwischt.
Dies hat dazu geführt, dass ich jede Minute die Adresse der Konstante 60 ermittelt habe. Dies hat dann zu diesem Konstanten Offset geführt.

Ich entschuldige mich euch wegen diesem Fauxpas beansprucht zu haben.
Trotzdem habe ich von euch einiges gelernt :wink:

Herzlichen Dank euch allen nochmals und einen schönen Abend wünscht
hafisch

Danke für die Ehrlichkeit. Wenn Du was gelernt hast, ist doch alles gut und wenn es auch noch funktioniert, dann ist es noch besser.

Gruß Tommy