Hallo,
das was du beschreibst ist DER ganz normale Vorgang was passiert. Völlig normal.
millis zählt immer weiter, egal was der Code macht.
Das ist quasi die µC eigene Uhr wenn man so will, Arduinoisches Feature.
Und jeder Code benötigt Zeit. Das geht nicht mit 0,000ms aus. Deswegen driftet das alles wie du schreibst völlig normal mit der Zeit auseinander.
Dein Dallas Code. Scheint nicht die Blockierungsfreie Variante zu sein. Oder?
Abhilfe schafft wie combie andeutete, den alten Zählerstand mit einem festen Wert nachzuziehen. Dann bleibt nur eine Startdifferenz übrig die immer gleich bleibt.
Oder du legst von Anfang an feste 1000er Additionsprünge fest für den Vergleichsmilliswert.
Dann bleibt es syncron. Nur wann deine Sekunde inkrementiert wird innerhalb der 1000ms bleibt dennoch variabel. Je nachdem was der restliche Code zu tun hat. Im dümmsten Fall benötigt der restliche Code mal länger wie 1sec. dann geht die dir für deine eigene Sekunde verloren.
Nochwas zu millis. Weis nicht wie genau die Uhr gehen soll. Mit der echten Uhr verglichen driftet millis sehr schnell ab. Weil das hängt von der Quarz/Resonator Genauigkeit ab.
Du kannst ja mal deine loop Zeiten vermessen.
Die Funktion "LoopTiming" wird jeweils ganz am Anfang und ganz am Ende aufgerufen.
Mit 200 Messungen wird die loop demnach 100mal vermessen und dann die Ergebnisse ausgespuckt.
Du wirst dann sehen ob min und max stark auseinander liegen etc.
//LoopTiming(); // Loop Time Messung Start
//LoopTiming(); // Loop Time Messung Ende
/*********************************************************************************
** LoopTiming() v06 by GuntherB & Doc_Arduino @ german Arduino Forum **
**********************************************************************************
** Funktion um die Dauer der Loop-Zeiten zu ermitteln **
** wird in der Loop am Anfang und Ende aufgerufen **
** benötigt ca (AL * 4 + 16) Byte RAM **
*********************************************************************************/
void LoopTiming()
{
const int AL = 200; // Arraylänge, NUR GERADE Zahlen verwenden!
static unsigned long LoopTime[AL];
static unsigned int Index=0, Messung=0, Min=0xFFFF, Max, Avg;
if (Messung % 2 == 0) // wenn Messung X gerade (0,2,4,6 usw.), entspricht immer Anfang der Loop
{
LoopTime[Index] = millis();
Messung++;
Index++;
return; // Funktion sofort beenden, spart bestimmt Zeit
}
if (Messung % 2 == 1) // wenn Messung X ungerade (1,3,5,7 usw.), entspricht immer Ende der Loop
{
LoopTime[Index] = millis();
LoopTime[Index-1] = LoopTime[Index] - LoopTime[Index-1]; // Loopdauer einen Index niedriger einspeichern wie aktuell
Messung++;
}
if (Index >= AL) // Array voll, Daten auswerten
{
for (int i = 0; i<AL; i++)
{
Min = min(Min, LoopTime[i]);
Max = max(Max, LoopTime[i]);
Avg += LoopTime[i];
}
Avg = Avg / AL;
Serial.print(F("Minimal "));Serial.print(Min);Serial.println(" ms");
Serial.print(F("Durchschnitt "));Serial.print(Avg);Serial.println(" ms");
Serial.print(F("Maximal "));Serial.print(Max);Serial.println(" ms");
Min = 0xFFFF;
Max = 0;
Avg = 0;
Messung = 0;
Index = 0;
}
}