Ds3231 1024Hz Interrupt

Hallo,

ich hab auch nochmal ein Frage.

Ich habe ein Interrupt programmiert mit 1024Hz ,d.h. 0.9765625 Sekunden. Jetzt habe ich folgenden Code im Interrupt stehen

  void ISR_millisekunden(){

 
  zeit = zeit + 0.9765625
    }

Aber ich habe schon nach 20 Sekunden 1 Sekunde Abweichung. Kann mir das jemand erklären? Dann habe ich mir diesen Code geschrieben:

void ISR_millisekunden(){

  //Korrigiert sich alle 42 selbst. 
  zeit += 1;
  zaehler_zeit += 1;
  if (zaehler_zeit == 42) {
    zaehler_zeit = 0;
    zeit -= 1;
    }

Der funktionert auf den ersten Stunden, danach hat er auch eine Abweichung 1-2 Sekunden.

Kann mir jemand mit der Ds3231 einen Millisekunden Zähler empfehlen? Oder wie sollte ich den verwirklichen?

Grüße

Ich wiederhole mich immer wieder.
Fließkommazahlen beim Arduino haben nur einen Genauigkeit von 5-6 Stellen.
Grüße Uwe

Hallo,

auf Grund der Problematik die Uwe beschreibt, würde meine Lösung darin bestehen in der ISR eine unsigned long Ganzzahl zu inkrementieren. Das heißt du zählst immer sturr die Anzahl der 1024Hz Perioden. Dann und nur dann, wenn du wirklich darauf zurückgreifen musst, teilst diesen Zähler durch 1024 und hast deinen RTC Millisekundenzähler mit der Auflösung von 0,977ms. So hälst den Fließkommafehler klein.

Denke an den volatile und atomar.

Hi

Wofür float?
Wenn man bis 1024 gezählt hat, SEKUNDE++ und den Zähler wieder auf Null.
In der loop() sollte man genug Zeit haben, um eine überlaufende Sekundenanzahl auf Minuten/Stunden zu übertragen.
Alles nur mit (u)INT, quasi Zeug, was der µC im Schlaf kann.

MfG

Hallo,

für den Sekundentakt würde deine Methode ausreichen. Er könnte dafür auch 1 Hz ausgeben. Matt möchte jedoch Millisekunden.

Die kann er aber auch bei Bedarf ausrechnen und nicht bei jedem 1024Hz Interrupt

Grüße Uwe