Re: dcf Zeit falsch Kategorie: Programmierung (von André H. - 11.01.2009 16:47) | ||
Als Antwort auf dcf Zeit falsch von Norbert - 11.01.2009 15:43 | ||
| ||
Hallo Norbert, > Was macht eigentlich das CC2 OS genau mit dem dcf frame? > > Laut dcf Beschreibung werden sowohl time als auch date mit jeweils einem > eigenen parity bit übertragen. Nun ist es natürlich denkbar, dass durch einen > gro�en Zufall eine �bertragungsstörung trotzdem zu einem richtigen parity > geführt hat. > Dieses Problem ist bekannt und führt dazu, dass es für Programmierer empfehlenswert ist, > zwei aufeinander folgende dcf frames nach Plausibilität zu prüfen: > ... > ... > Ich werde nun meine Nachtroutine ändern, aber > Was macht eigentlich unser CC2 Betriebssystem? Das OS prüft nicht die Parity-Bits, liest aber immer zwei DCF-Frames ein, und vergleicht, ob beide "gleich" sind. "Gleich" bedeutet hier, da� alle Angaben au�er der Minute identisch sein müssen. Bei der Minute mu� die Differenz aus neuem Frame und zuvor eingelesenem Frame 1 betragen. Ist dies nicht der Fall, wurd solange eingelesen, bis zwei aufeinanderfolgende Frames nach dieser Prüfmethode korrekt sind. Da das OS im laufenden Betrieb die Uhr nur zur vollen Stunde syncronisiert, d.h. frühestens zwei Minuten nach Stundenwechsel werden die neuen Zeitdaten in die entsürechenden Systemvariablen der CC2 geschrieben, reicht dies normalerweise aus. Erfolgt ein Neustart der CC2 kurz vor Stundenwechsel, z.B. um x:58, dauert der Sync mindestens 4 Minuten, da beim Frame um (x+1):00 die Stunden und evtl. sogar die Datumswerte abweichen. Da� bei zwei aufeinanderfolgende Frames vereinzelt derselbe Fehler auftaucht und somit auf eine falsche Zeit syncronisiert wird, konnte ich leider schon feststellen. Nicht nur bei µControllern, sondern auch bei normalen Funkuhren. So unwahrscheinlich ist das leider nicht, wenn der Empfang an der Grenze ist, oder etwas störendes in der Gegend ist, das in einem Minutenrythmus stören kann, so da� dergleiche Fehler öfters hintereinander auftauchen kann. Die Wahrscheinlichkeit, da� dies passiert, wäre wahrscheinlich geringer, wenn das OS auch die Parity-Bits auswerten würde. Jetzt wird meine ToDo-Liste schonwieder länger. :-) Ich habe vor längerem eine kleine Testroutine geschrieben, um DCF-Frames "per Hand" ohne OS an einem normalen I/O einzulesen, da ich Empfangsprobleme hatte. Das Parity prüfe ich aber hier auch nicht. :-) Anbei das Programm. MfG André H. const bcd[]=1,2,4,8,10,20,40,80; const DOW_NAMES[] = "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"; thread main {long timer;int bit,nr; byte minute, stunde, tag, dow, monat, jahr; string s1,s2; hwcom.setspeed(8); hwcom.clr(); loop { wait ports.get(15); timer=system.timer(); wait not ports.get(15); timer=system.timer()-timer; if timer>1950 bit='F'; else if timer>1780 {bit='S';nr=-1;} else if timer>930 bit='F'; else if timer>880 bit='0'; else if timer>830 bit='F'; else if timer>780 bit='1'; else bit='F'; hwcom.num(nr+1); hwcom.tab(); hwcom.num(timer); hwcom.tab(); hwcom.put(bit); if bit=='F' { hwcom.tab(); hwcom.print("Bitfehler"); } else if nr==-1 { hwcom.tab(); hwcom.print(DOW_NAMES[dow%7]); s1= ' ' + (tag/10+0x30) + (tag%10+0x30) + '.' + (monat/10+0x30)+ (monat%10+0x30) + '.' + (jahr/10+0x30) + (jahr%10+0x30); hwcom.print2(s1); s2= 9 + (stunde/10+0x30) + (stunde%10+0x30) + ':' + (minute/10+0x30) + (minute%10+0x30) + ":00"; hwcom.print2(s2); } else if nr==15 { hwcom.tab(); if bit=='0' hwcom.print("Betriebsantenne"); else if bit=='1' hwcom.print("Reserveantenne"); } else if nr==16 { hwcom.tab(); if bit=='1' hwcom.print("Ankündigung Zeitumstellung"); } else if nr==17 { hwcom.tab(); if bit=='0' hwcom.print("Normalzeit"); else if bit=='1' hwcom.print("Sommerzeit"); } else if nr==18 { hwcom.tab(); if bit=='0' hwcom.print("Sommerzeit"); else if bit=='1' hwcom.print("Normalzeit"); } else if nr==19 { hwcom.tab(); if bit=='1' hwcom.print("Ankündigung Schaltsekunde"); } else if nr==20 { hwcom.tab(); if bit=='1' hwcom.print("Startbit Zeit OK"); else hwcom.print("Startbit Zeit Fehler"); } else if nr>20 and nr<28 { if nr==21 minute=bit and 1; else if bit=='1' minute=minute+bcd[nr-21]; } else if nr>28 and nr<35 { if nr==29 stunde=bit and 1; else if bit=='1' stunde=stunde+bcd[nr-29]; } else if nr>35 and nr<42 { if nr==36 tag=bit and 1; else if bit=='1' tag=tag+bcd[nr-36]; } else if nr>41 and nr<45 { if nr==42 dow=bit and 1; else if bit=='1' dow=dow+bcd[nr-42]; } else if nr>44 and nr<50 { if nr==45 monat=bit and 1; else if bit=='1' monat=monat+bcd[nr-45]; } else if nr>49 and nr<58 { if nr==50 jahr=bit and 1; else if bit=='1' jahr=jahr+bcd[nr-50]; } hwcom.ret(); nr=nr+1; } } Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: dcf Zeit falsch (von Norbert - 12.01.2009 21:29) |