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: