void main(void) { phase_4=1; phase_5=0; EAL=1; // Hauptschalter Interrupt EXEN2=1; ET2=1; EX6=1; /************************/ /*******Timer1***********/ /************************/ TMOD=0x10; //Timer 1 16 Bit Timer einstellen TH1 = 0xe6; //Reloadwert Timer1 MSB TL1 = 0x00; //Reloadwert Timer1 LSB ET1 = 1; //Interrupt einschalten TF1 = 0; //Inetrruptflag löschen while(1) { if((phase_4==1)&&(imp2==2)) //Phase_4 suchen nach Schaltsekunde { printf("%04u\r",zeit_dcf); Bit3_P4=1; MSek(4); Bit3_P4=0; imp2=0; //Rücksetzen des Signalwertes if((zeit_dcf>350)&&(zeit_dcf<390)) // abfrage ob Schaltsekunde erkannt wurde { printf("\n%u\n",zeit_dcf); TH1 = 0xe6; //0xe6; //Reloadwert Timer1 MSB TL1 = 0x00; //0x00; //Reloadwert Timer1 LSB zeit_dcf=0; //erkannte Zeit auf 0 setzen TR1=1; //Timer1 starten phase_4=0; //Erkennugsphase stoppen phase_5=1; //Datenerkennungsphase starten imp2=1; //setzen des Signalwertes flanke_steigend=255; // Erkannte fallende Flanke auf 1 setzen }//ENDE if Schaltsekunde }//ENDE if Phase_4 if((phase_5==1)&&(imp2==2)) //Datenerkennungsphase einschalten { imp2=0; //setzen des Signalwertes if((zeit_dcf<=22)&&(zeit_dcf>=15))//Abfrage ob eine "0" erkannt wurde { auswertung_dcf_signal(0,flanke_steigend); Bit5_P4=~Bit5_P4; }//ENDE if Erkannte "0" else { if((zeit_dcf<=40)&&(zeit_dcf>=35))//Abfrage ob eine "1" erkannt wurde { auswertung_dcf_signal(1,flanke_steigend); Bit6_P4=~Bit6_P4; }//ENDE if Erkannte "1" else { if(flanke_steigend!=255)//Abfrage ob eine ein Signal erkannt wurde { //das weder einer "0" noch einer "1" entspricht Bit4_P4=~Bit4_P4; phase_4=1;//Phase_4 suchen nach Schaltsekunde phase_5=0;//Datenerkennungsphase einschalten TH1 = 0xe6;//0xe6; //Reloadwert Timer1 MSB TL1 = 0x00;//0x00; //Reloadwert Timer1 LSB zeit_dcf=50; TR1=0;// Timer1 abschalten imp2=0;//setzen des Signalwertes }//ENDE if ausserhalb Signal }//ENDE else }//ENDE else if (flanke_steigend >= 59)//Überprüfung nach 59 erkannten Werten { Bit4_P4=~Bit4_P4; EXF2=0; Sek(2); phase_4=1; phase_5=0; TH1 = 0xe6;//0x5f; //Reloadwert Timer1 MSB TL1 = 0x00;//0x04; //Reloadwert Timer1 LSB TR1=1; imp2=1; } } } } /***************************************************/ void sig_dcf_fallend (void) interrupt 5 { if((phase_4==1)&&(imp2==1)) { imp2=2; Bit2_P4=1; MSek(4); Bit2_P4=0; EXF2=0; TR1=0; } else { if((phase_5==1)&&(imp2==0)) { imp2=1; Bit2_P4=1; MSek(4); Bit2_P4=0; EXF2=0; TH1 = 0xe6;//0x5f; //Reloadwert Timer1 MSB TL1 = 0x00;//0x04; //Reloadwert Timer1 LSB zeit_dcf=0; TR1=1; } else { EXF2=0; TH1 = 0xe6;//0x5f; //Reloadwert Timer1 MSB TL1 = 0x00;//0x04; //Reloadwert Timer1 LSB zeit_dcf=0; phase_4=1; phase_5=0; } } if(phase_6==1) { set_clock(); Bit0_P4=~Bit0_P4; phase_4=1; phase_5=0; phase_6=0; } } void sig_dcf_steigend (void) interrupt 13 { if((phase_4==1)&&(imp2==0)) { imp2=1; Bit1_P4=1; MSek(4); Bit1_P4=0; TH1 = 0xe6;//0x5f; //Reloadwert Timer1 MSB TL1 = 0x00;//0x04; //Reloadwert Timer1 LSB zeit_dcf=0; TR1=1; } else { if((phase_5==1)&&(imp2==1)) { imp2=2; flanke_steigend++; Bit1_P4=1; MSek(4); Bit1_P4=0; TR1=0; } else { EXF2=0; TH1 = 0xe6;//0x6e; //Reloadwert Timer1 MSB TL1 = 0x00;//0x00; //Reloadwert Timer1 LSB zeit_dcf=0; phase_4=1; phase_5=0; } } } void timer1_ISR (void) interrupt 3 { Bit2_P4=1; Bit2_P4=0; TF1=0; //Inerruptflag löschen TH1 = 0xe6;//0x5f; //Reloadwert Timer1 MSB TL1 = 0x00;//0x04; //Reloadwert Timer1 LSB zeit_dcf++; }