Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, C-Control II Station, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.1
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)