Habe mir deine AVR-Miniwebserver-SW auf mein Pollin-Board geladen und betreibe damit einen einfachen Datenlogger. Erst mal vielen Dank für die tolle Software!
In meiner Anwendung messe ich alle 5 Minuten 5 Sensorwerte. Die letzten 100 Messungen können mit Zeitstempel vom AVR-Miniwebserver gelesen werden. Die Messzeit wandle ich mit der Funktion decode_time in eine lesbare Zeit um. Dabei ist mir beim Übergang vom 30. auf den 31. August folgendes Problem aufgefallen:
So 30.08.2009, 23:40:03;210;538;160;0;0
So 30.08.2009, 23:45:03;210;538;160;0;0
So 30.08.2009, 23:50:03;210;538;160;0;0
So 30.08.2009, 23:55:03;210;538;155;0;0
Mo 1.09.2009, 0:00:03;210;538;158;0;0
Mo 1.09.2009, 0:05:03;210;538;160;0;0
Mo 1.09.2009, 0:10:03;210;538;155;0;0
Mo 1.09.2009, 0:15:03;210;538;153;0;0
Mo 1.09.2009, 0:20:03;210;535;155;0;0
Mo 1.09.2009, 0:25:03;210;535;150;0;0
Mo 1.09.2009, 0:30:03;210;535;153;0;0
Mo 1.09.2009, 0:35:03;210;535;153;0;0
Mo 1.09.2009, 0:40:03;210;535;155;0;0
Mo 1.09.2009, 0:45:03;210;535;148;0;0
Mo 1.09.2009, 0:50:03;210;535;150;0;0
Mo 1.09.2009, 0:55:03;210;535;155;0;0
Mo 31.08.2009, 1:00:03;210;535;153;0;0
Mo 31.08.2009, 1:05:03;210;535;145;0;0
Mo 31.08.2009, 1:10:03;210;535;150;0;0
In der ersten Stunde des 31.08. werden Tag und Monat offenbar falsch berechnet. Danach läuft alles wieder einwandfrei.
Habe mir den Code der decode_time-Funktion in ntp.c einmal angeschaut und glaube den Fehler gefunden zu haben.
Während der Sommerzeit muss ja eine Stunde addiert werden. Dies passiert im Abschnitt
Code: Alles auswählen
if (summertime)
{
dt->hour++; // add one hour
Code: Alles auswählen
if (dt->day == monthlen(LEAPYEAR(dt->year), dt->month))
{ // next month
dt->day = 0;
dt->month++;
}
Die Prüfung auf den letzten Tag im Monat müsste meiner Meinung nach mit mit "dt->month-1" statt mit dt->month gemacht werden, da die Funktion "monthlen" die Monatsnummern im Bereich 0..11 erwartet. In dt->month steht jedoch die Monatsnummer im Bereich 1..12.
Die beiden Aufrufe von "monthlen" im oberen Teil der decode_time-Funktion sind wohl korrekt, da zu Beginn des Codes tatsächlich mit Monatsnummern im Bereich 0..11 gearbeitet wird. Irgendwann wird dann mit
Code: Alles auswählen
dt->month ++;
Ich wäre froh, wenn du meinen Änderungsvorschlag mal prüfen könntest.
Danke und liebe Grüsse
Urs