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/hatte auch so meine Schwierigkeiten mit dem DCF77-Modul. > Die Empfangsqualität des Funksignals ist ein Faktor. Um zumindest direkt zu sehen, wie die Antenne > am besten auszurichten ist, habe ich eine LED mit einem 1k Widerstand an den invertierten Ausgang > des Funkmoduls angeschlossen. Klappt ganz gut. > > Mit dem Interrupt habe ich auch so meine Probleme bekommen - spätestens, als ich zusätzliche > Funktionen, wie z.B. I2C-Module (Temperatur und PCF8574) integriert habe. > Die ursprünglichen Routine > void INT_10ms(void) > { > int irqcnt; > RTC(0x01,0x15); // DCF Update um 01:15 > DCF_PULS(); // DCF_MODE=1 Puls suchen > DCF_SYNC(); // DCF_MODE=2 Synchronisation > DCF_FRAME(); // DCF_MODE=3 Datenaufnahme > > irqcnt=Irq_GetCount(INT_TIM2COMP); // Interrupt Request Counter > } > Hat wohl immer wieder Zeitprobleme. Daher habe ich irqcnt global definiert (Var-Def in den Hauptteil) > und die Routine ergänzt, so dass "vergessene" Interrupts mitgezählt werden: > > void RTC(byte U_Stunde, byte U_Minute) > { > cnt1 = cnt1++ + irqcnt; // 10ms Zähler erhöhen plus Interrupts... > > if (cnt1==50) Port_WriteBit(PORT_LED1,PORT_OFF); // LED1 off - geht so aber nicht mehr immer, s.u. > > if (cnt1>=100) // Sekundentakt: neu >=, da gelegentlich auch zu spät... > ... > > Und dann noch ein letztes Problem: > Sobald ich Thread_Delay(); verwende, geht gar nichts mehr (egal, mit welcher Zeit). > Wenn ich die Dokumentation richtig interpretiere, dürfte das ein generelles Problem sein, da der interne > Interrupt 2 für Thread_Delay() verwendet wird und auch gleichzeitig für die INT_10ms-Routine. > Dann dürfte der Vorschlag von Werner unten aber auch nicht funktionieren??? > Ich habe es dann auch mit einer eigenen Task gelöst, die sich aber selber anhält, wenn sie fertig ist: > Thread_Wait(1,1); > und wieder nach 1 Sekunde in der Routine RTC gestartet wird: > Thread_Resume(1); // Zeitanzeige > > Gruß Martin > > > Hallo, DCF77-Versucher, > > ich hatte früher auch Schwierigkeiten mit diesem Programm und habe dann einfach den > > Uhrenbaustein mit IC PCF8583 verwendet. Die letzten Hilferufe im Forum zum Demoprogramm DCF77 > > haben mich veranlaßt, doch noch einmal genau hinzusehen. > > Es zeigt sich, daß die Interrupt-Routine INT_10ms zu lange läuft, so daß letztendlich einzelne > > Interrupts verschluckt werden und die Synchronisation nicht sauber läuft. > > Das Problem läßt sich beheben, indem in der Routine RTC(---,---) die beiden Anweisungen > > // Display_Buffer_Set(); > > // LCD_Write(); > > auskommentiert werden (bringt die notwendige Zeitreserve für die Interruptroutine) und in eine > > zweite Task verlagert werden wie folgt: > > > > void AnzeigeTask(void); > > { > > while (1) > > { > > Thread_Delay(500); // 5 Sekunden Verzögerung (als Beispiel) > > Display_Buffer_Set(); // andere Routinen sind > > LCD_Write(); // hier auch möglich > > } > > } > > > > Das Programm muß dann mit MultiThreading laufen mit der zusätzlichen Anweisung > > Thread_Start(1,AnzeigeTask); > > > > Die Anzeige wird dann alle 5 Sekunden unabhängig von der Interrupt-Routine aktualisiert. > > Weitere oder andere Routinen zur Nutzung der Zeitvariablen lassen sich so nutzen. > > > > Vielleicht hilft es ein wenig. Die einfachere und zuverlässigere Lösung für ernsthafte Projekte > > ist natürlich immer der Uhrenbaustein. > > > > Viel Erfolg, Werner > > > > > > > > > > > > > >