Re: Bug in DemoProg DCF ? Kategorie: CC-Pro Unit & Appl.Board (von Peter S - 6.07.2005 0:13) | ||
Als Antwort auf Bug in DemoProg DCF ? von ChristianK - 3.07.2005 20:39 | ||
| ||
Sorry, aber uns ist wahrscheinlich die falsche Version der Library in das Update gekommen. Hier ein schnelles Update, was aber nur kurz getestet wurde, um allen schnell Anhilfe zu schaffen. Bitte den folgenden Text als "DCF_Lib.cc" in das Verzeichnis "Libraries" kopieren. Gruss Peter ---------------------------- /************************************************************************** DCF77 Library ***************************************************************************/ // DCF Input Signal at PortD.7 #define DCF_IN 31 byte cnt1; byte Sekunde, Minute, Stunde; byte Tag, Monat, Jahr; // DCF DATA byte CNT8; byte Shift_CNT; byte DCF_MODE; byte DCF_DATA; byte BIT_CNT; byte SEC_CNT; byte DATA_CNT; byte DCF_PARITY; byte DCF_ARRAY[7]; int ARRAY_INDEX; word DCF_LIMIT_CNT; //------------------------------------------------------------------------- void Write2Digits(byte val) { char num[3]; Str_WriteWord(val,10,num,0,2); Msg_WriteText(num); } //------------------------------------------------------------------------- void DCF_ARRAY_Clear(void) { byte i; for (i=0; i<7; i++) DCF_ARRAY[i]=0; } //-------------------------------------------------------------------------- // Initialisation for DCF-Mode void DCF_INIT(void) { Port_DataDirBit(DCF_IN,0); // Port D.7=input Port_WriteBit(DCF_IN,1); // pull up on Port_DataDirBit(30,1); // enable LED1 Port_WriteBit(30,1); // LED1 off DCF_ARRAY_Clear(); DCF_MODE=0; //DCF disabled } //------------------------------------------------------------------- // START DCF-Mode void DCF_START(void) { SEC_CNT=0; ARRAY_INDEX=0; DCF_ARRAY_Clear(); DCF_PARITY=0; DCF_LIMIT_CNT=0; // Abbruch wenn kein Signal vorhanden DCF_DATA=0; BIT_CNT=0; DCF_MODE=1; // DCF enabled } //------------------------------------------------------------------- //********* DCF_MODE=1 Puls suchen ********************************* void DCF_PULS(void) { if (DCF_MODE==1) { if (Port_ReadBit(DCF_IN)) SEC_CNT++; else SEC_CNT=0; if (SEC_CNT==5) { DCF_MODE++; // Puls gefunden > Modewechsel SEC_CNT=0; } } } // //********* DCF_MODE=2 Frameanfang suchen *************************** // Synchronisation auf den Frameanfang (Pulslücke) // Störungen <20ms weden ignoriert void DCF_SYNC(void) { if (DCF_MODE==2) { // Abbruch wenn nach 3 Minuten kein Frameanfang gefunden wurde DCF_LIMIT_CNT++; if (DCF_LIMIT_CNT>20000) // > 3 Minuten { DCF_ARRAY[6]=0xFF; // kein SYNC DCF_MODE=0; // Limit erreicht } // Minutensynchronisation: fehlender Bit-Puls if (Port_ReadBit(DCF_IN)) { DCF_DATA++; if (DCF_DATA==5) // 50ms Pulsbreite { // neuer Start SEC_CNT=0; DCF_DATA=0; } } else { // kein Puls vorhanden DCF_DATA=0; } SEC_CNT++; if (SEC_CNT==130) { // Minuten_SYNC gefunden DCF_MODE++; // Modewechsel SEC_CNT=0; BIT_CNT=0; DATA_CNT=0; CNT8=0; Shift_CNT=0; }; } } //--------------------------------------------------------------------------------- // BCD Kodierung zu Dezimal Wandlung // byte BCD2DEC(byte value) { return((value>>4)*10+(value&0xf)); // oberes Nibble * 10 plus unteres Nibble } //--------------------------------------------------------------------------------- //******** DCF_MODE=3 Datenaufnahme ******************************* // Die seriellen Daten ab Minuten werden in DCF_ARRAY abgelegt // ein Durchlauf dauert ca. 1ms@16MHz void DCF_FRAME(void) { if (DCF_MODE==3) { SEC_CNT++; if (Port_ReadBit(DCF_IN)) { DATA_CNT++; // Pulse zählen für Datenauswertung } // Datenauswertung -------------------------------------------------- if (SEC_CNT==100) // 10ms Abtastung: 100x10ms=1s { // Bit eingelesen, Auswertung if (DATA_CNT>=15) { DCF_DATA=1; DCF_PARITY++; //increment parity counter } else { DCF_DATA=0; } DATA_CNT=0; SEC_CNT=0; // reset CNT_SEC BIT_CNT++; // ready for next Data Bit //--------------------------------------------------------------------- // Datenaufnahme, Bit0 bis Bit21 ignorieren --------------------------------- // Die Daten für Minuten, Stunden usw. werden getrennt in ein Byte im DCF_ARRAY // abgelegt, z.B. Minuten in DCF_ARRAY[0]: Minuten_low Bit0..3, Minuten_high Bit4..6 // // DCF_ARRAY[0] : Minuten // DCF_ARRAY[1] : Stunden // DCF_ARRAY[2] : Tag // DCF_ARRAY[3] : Wochentag // DCF_ARRAY[4] : Monat // DCF_ARRAY[5] : Jahr // DCF_ARRAY[6] : Error ( Synchronisation, Parity) //------------------------------------------------------------------------------- if (BIT_CNT>=22) // Start der Datenaufnahme ab Minuten { if (BIT_CNT==22) { Shift_CNT=7; } // Minuten if (BIT_CNT==30) { Shift_CNT=6; } // Stunden if (BIT_CNT==37) { Shift_CNT=6; } // Tag if (BIT_CNT==43) { Shift_CNT=3; } // Wochentag if (BIT_CNT==46) { Shift_CNT=5; } // Monat if (BIT_CNT==51) { Shift_CNT=8; } // Jahr //--------- Daten bitweise an die richtige Position schieben if (Shift_CNT>0) { // DCF-Daten von links schieben DCF_ARRAY[ARRAY_INDEX]=(DCF_ARRAY[ARRAY_INDEX]>>1)|(DCF_DATA<<7); CNT8++; Shift_CNT--; if (Shift_CNT==0) // Daten rechtsbündig schieben { for (CNT8=CNT8; CNT8<8; CNT8++) { DCF_ARRAY[ARRAY_INDEX]=(DCF_ARRAY[ARRAY_INDEX]>>1); } ARRAY_INDEX++; CNT8=0; } } //---------- Byte vollständig aufgenommen und im DCF_ARRAY gespeichert //---------- Parity überprüfen ( Minuten, Stunden, Rest ) if (BIT_CNT==21) { DCF_PARITY=0; // reset parity counter }; if (BIT_CNT==29) { if ((DCF_PARITY&1)==1) // check parity { DCF_ARRAY[6]=1; // Minuten Error } DCF_PARITY=0; // reset parity counter }; if (BIT_CNT==36) { if ((DCF_PARITY&1)==1) { DCF_ARRAY[6]=DCF_ARRAY[6]|2; // Stunden Error } DCF_PARITY=0; // reset parity counter } if (BIT_CNT==59) // 59=3B Parity P3 { if ((DCF_PARITY&1)==1) { DCF_ARRAY[6]=DCF_ARRAY[6]|4; // Final Parity Error } //------------ END of DCF-DATA-TRANSMISSION DCF_MODE=0; // DCF finished 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; } else { DCF_START(); // neuer Versuch } } } } // END Datenaufnahme } // END DCF_MODE=3 } //------------------------------------------------------------------------- | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum