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 > 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 > } > //------------------------------------------------------------------------- >