Schön, hier von den "Machern" zu lesen
Mittlerweile sieht die ntp.c bei mir so aus:
.......
void ntp_get (unsigned char index)
{
NTP_DEBUG("** NTP DATA GET! **\r\n");
struct NTP_GET_Header *ntp;
ntp = (struct NTP_GET_Header *)ð_buffer[UDP_DATA_START];
ntp->rx_timestamp = LBBL_ENDIAN_LONG(ntp->rx_timestamp);
ntp->rx_timestamp += GMT_TIME_CORRECTION; // UTC +1h
time = ntp->rx_timestamp;
uint16_t tage = (unsigned long)(time/86400); // Tage seit 1.1.1900
if(39445 < tage < 43100) // NTP-Prüfung: Jahr 2008 bis 2018?
{
tage -= 39445; // 108 Jahre abziehen -> Tag 0 ist 31.12.2007
.........
Der Fehler tritt aber noch immer sporadisch auf, allerdings subjektiv seltener als vorher.
Einen wirklich brauchbaren Ethernet-trace vom letzten NTP-Zeitabgleich, bevor die Uhr falsch gestellt wurde, habe ich leider noch immer nicht auf auf die Reihe bekommen. Aber mittlerweile glaube ich auch nicht mehr, dass ich da irgendein Problem ableiten könnte. Alle wegen eventuellen Timingproblemen o.ä. ungültigen Daten fange ich ja jetzt eigentlich mit der Prüfung ab.
Dass der Controller für über eine Sekunde beschäftigt ist, kann ich mir eigentlich auch kaum vorstellen - FTP ist bei mir zwar aktiviert, wird aber nicht genutzt, das Logging auf die SD-Karte ist abgeschaltet. Ausserdem wurde die Zeit nach Ablauf von 1800 Sekunden NTP_REFRESH auch wieder korrekt aktualisiert.
Falls doch mal ein Überlauf auftritt, könnte ja auch dieser Zusatz in der main.c helfen? (Hab's einfach mal zum Test in den AVR geladen):
.....
if(ntp_timer > NTP_REFRESH){
ntp_timer = NTP_REFRESH;
ntp_request();
.....