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

Re: DCF77 Kategorie: Programmierung C (von MartinK - 7.06.2008 6:34)
Als Antwort auf DCF77 von Werner L - 2.04.2008 15:48
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board
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
>
>
>
>
>
>
>


    Antwort schreiben


Antworten: