Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > > > 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