Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Demoprogramm DCF: Timingprobleme Kategorie: Programmierung Basic (von PeterS - 25.02.2010 11:58)
Als Antwort auf Re: Demoprogramm DCF: Timingprobleme von Ben - 24.02.2010 19:47

> > > Hallo,
> > > ich habe folgendes Problem:
> > > Ich habe das Demo-Programm DCF in Basic (Demo original Version 1.6) auf mein
> > > Projekt Board (Mega32) gespielt. Anfänglich läuft es auch einwandfrei.
> > > Doch nach einigen Stunden merkt man, dass die angezeigt Uhrzeit bereits einige Minuten
> > > hinter der wirklichen Zeit (ca. 8 Minuten nach ca. 14,5 Stunden) nachläuft.
> > > Scheinbar ist mit dem 10ms-Interrupt nicht ok.
> > >
> > > Hier noch die verwendete Hard-und Software:
> > > C-Control Pro Mega 32 (Best. 198206)
> > > C-Control Pro 32 Mega Projektboard (Best. 197287)
> > > DCF-Empfangsplatine von Conrad (Best. 641138)
> > > IC-74HC164 zur Ansteuerung eines 4-zeiligen Displays
> > >
> > > C-Control IDE Version:2.1.0.0
> > > Compact-C Compiler Version:1.51.0.51
> > > Demo origignal Version 1.6 => DCF Programm
> > >
> > > Wer kann mir helfen?
> > >
> > > Danke.
> > > Ben
> >
> > Hallo Ben,
> >
> > es gibt eine Ungenauigkeit vom Quarz, und das Problem, das bei DCF manchmal zuviel in der
> > 10ms Routine abgearbeitet wird. Dabei gehen vielleicht einzelne Interrupts verloren. Aus
> > diesem Grunde gibt es die Clock Bibliotheks Routinen. Die sind in Assembler und es werden
> > garantiert alle 10ms Interrupts durchgeführt. Für die Ungenauigkeit des Quarzes kann man
> > einen Korrekturfaktor angeben. Des ist auch dort genau beschrieben.
> >
> > Da die DCF Routinen (die nicht von mir sind) aus einer älteren Zeit stammen, sollten diese
> > so umgestellt werden, das die Clock Funktionen genutzt werden. Da ich keine DCF Antenne
> > habe, kann ich es nicht selbst testen, aber hier ein Vorschlag, wie die nötige �nderung
> > aussehen könnte:
> >
> > Alter Code in DCF_Lib.cc:
> >
> > if (DCF_ARRAY[6]==0)             // DCF ok
> > {
> >     Minute=BCD2DEC(DCF_ARRAY[0]);         // Uhrzeit übernehmen
> >     Stunde=BCD2DEC(DCF_ARRAY[1]);
> >     Tag=BCD2DEC(DCF_ARRAY[2]);
> >     Monat=BCD2DEC(DCF_ARRAY[4]);
> >     Jahr=BCD2DEC(DCF_ARRAY[5]);
> >     Sekunde=0;
> >     cnt1=0;
> > }
> >
> > Neuer Code:
> >
> > if (DCF_ARRAY[6]==0)             // DCF ok
> > {
> >     Clock_SetTime(BCD2DEC(DCF_ARRAY[1]), BCD2DEC(DCF_ARRAY[0]), 0, 0);
> >     Clock_SetDate(BCD2DEC(DCF_ARRAY[2]), BCD2DEC(DCF_ARRAY[4]), BCD2DEC(DCF_ARRAY[5]));
> > }
> >
> >
> > Die aktuelle Zeit mu� dann natürlich mit Clock_GetVal() später abgeholt werden.
> >
> > Gruss Peter
>
> Hallo Peter,
>
> danke für die schnelle Antwort. Sorry, aber ich habe es leider noch nicht ganz verstanden.
> Wo muss ich den Befehl "Clock_GetVal()" im Demoprogramm einfügen?
> AuÃ?erdem habe ich auch den gesamten Ablauf noch nicht ganz erfasst.
> Die oben beschriebenen Ã?nderungen beziehen sich doch rein auf die DCF-Synchronisation, oder?
> Diese Synchronisation funktioniert aber aus meiner Sicht noch. Das heiÃ?t nach Programmstart
> wird die richtige DCF-Zeit erfasst und übergeben.

Im Demoprogramm wird in der RTC Routine nicht nur die DCF Synchronisation getriggert, sondern
dort ist auch der Code, der die Uhrzeit hochzählt. Beim hochzählen werden vermutlich einige
10ms Ticks verschluckt. Diese 10ms Interruptroutine läuft im Interpreter und sollte deshalb
nicht überlastet werden. Im Hintergrund läuft dann auch noch im Assembler eine 10ms Interrupt-
routine die mehrere Funktionen in der CCPro managed, siehe mein anderer Forenpost.

Gruss Peter

> Ich habe das DCF-Programm so verstanden:
> Erst wird die aktuelle Zeit über die DCF-Antenne empfangen und anschlie�end nur noch über den
> 10ms-Interrupt aufaddiert (RTC-Routine). Nur bei der angegebenen Zeit, wird erneut die
> Synchronisation durchgeführt(Im Demo-Porgramm um 1:15 Uhr).
> Mir scheint als ob rein der Interrupt der alle 10ms die RTC-Routine aufrufen soll nicht genau
> stimmt (z.B. 12ms anstatt 10ms), oder einige male verloren geht. Daher läuft die angezeigte
> Zeit mehr und mehr der tatsächlichen Zeit hinterher je länger die Synchronisation her ist.
> Erst mit der erneuten Syncronisation, wird das scheinbar wieder behoben.
> Habe ich das falsch verstanden?
> Danke.
> Ben


    Antwort schreiben


Antworten: