#include #include // ANSI-C Standard HeaderFile #include #include // HeaderFile für FKTs-Prototypen #include #include #include #include xdata char DCF_SIG_WERT [11][1]; //Speicherarray für DCF-Signalauswertung unsigned int i=0; unsigned int zeit=0,timer_phase2=0; // Wert für die Berechnung der Impulszeit unsigned char Praeambel_0=0,Praeambel_1=0,Erkennungsfehler=0,imp=0,imp2=0; // Werte für die Präambelerkennung unsigned char signal = 1,Nibble=0,Sensor_Typ=0,Paritaet=0,Summe=0; // Werte für Telegramerkennung unsigned char Typ=0,ID=0,Wert1=0,Wert2=0,Wert3=0,Wert4=0,Wert5=0,IDneu=0; // Werte für die einzelnen Nibbels unsigned char Wert6=0,Wert7=0,Wert8=0,Wert9=0,Wert10=0,Wert11=0,Wert12=0; // Werte für die einzelnen Nibbels unsigned char Fehler=0; unsigned char Sensor_s=0; //Spaltenzähler der Arrays unsigned char flanke_steigend=0,paritaet_dcf=0; unsigned int zeit_dcf=0; unsigned char MS_Wert=0; int fFlag=0; float value_float=0; int value_integer; unsigned char value_uchar; sbit Sig_falsch = 0x92; //P1.2 Signal ausserhalb einer erkannten "0 und 1" sbit idcf = 0x93; //P1.3 steigende Flanke DCF Signal sbit Praeambel_erkannt = 0x94; //P1.4 Präambel erkannt sbit dcf = 0x95; //P1.5 fallende Flanke DCF Signal sbit signal_kurz = 0x96; //P1.6 Signal entspricht einer "1" sbit signal_lang = 0x97; //P1.7 Signal entspricht einer "0" sbit bit_1 = 0xf8; //erkannte Werte eines Nibbels auf port 5 legen sbit bit_2 = 0xf9; //erkannte Werte eines Nibbels auf port 5 legen sbit bit_3 = 0xfa; //erkannte Werte eines Nibbels auf port 5 legen sbit bit_4 = 0xfb; //erkannte Werte eines Nibbels auf port 5 legen unsigned char Nibbelwert; sbit Auslesen = 0xef; sbit Bit6_P4=0xee; sbit Bit5_P4=0xed; sbit Bit4_P4=0xec; sbit Bit3_P4=0xeb; sbit Bit2_P4=0xea; sbit Bit1_P4=0xe9; sbit Bit0_P4=0xe8; bit phase_1 = 0; //Erkennungsphase für Datenpraeambel bit phase_2 = 0; //Datenstring Auswertung,Überprüfung und Speicherung bit phase_3 = 0; //Mittelwertbildung alle 15min und Speicherung in Seicherarrays bit phase_4=0; //Minutenlücke suchen bit phase_5=0; //Daten erkennen bit phase_6=0; //Uhrzeit+Datum schreiben auf RTC bit phase_10 = 0; bit phase_11 = 0; bit phase_12 = 0; bit phase_13 = 0; bit phase_14 = 0; //bit com = 0; //Bit empfangen void main(void) { phase_1=1; phase_4=0; phase_5=0; /***************************************/ //Interrupts inizialisieren I3FR = 0; //Einstellung vom P1.0 auf fallende Flanke EX3 = 1; //Einschalten der Interruptfunktion an P1.0 EX4 = 1; //Einschalten der Interruptfunktion an P1.1 IT1 = 1; //Einstellung vom P3.3 auf fallende Flanke EX1 = 1; //Einschalten der Interruptfunktion P3.3 EAL = 1; //Einschalten Interruptfreigabe(aller Interrupts) /*************************************** EXEN2=1; //Freigeabe für P1.5 ET2=1; //Schalter für Interruptfreigabe für P1.5 EX6=1; //Schalter für Interruptfreigabe für P1.3 /************************/ /*******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 //********************* Timer 2 ************************ T2CON = 0x40; //Timer2 initialisieren CCEN = 0x05; /* capture mode Timmer2 steuerung über Interrupts P1.0 und P1.1*/ T2I0 = 1; //Timer 2 starten while(1) { if(phase_1==1) { P4=0; T2I0=0; //Timer 2 abschalten TF2=0; //Timer 2 Flag löschen EX3=0; // Interrupt P1.0 abschalten IEX3=0; //Flag löschen P1.0 EX4=0; // Interrupt P1.1 abschalten IEX4=0; //Flag löschen P1.1 TF1=0; //Flag Timer 1 Überlauf ET1=1; //Interrupt Timer1 einschalten EXF2=0; //Flag P1.5 löschen EXEN2=1; //P1.5 freischalten ET2=1; //Interrupt P1.5 einschalten IEX6=0; //Flag P1.3 löschen EX6=1; //Interrupt P1.3 einschalten phase_1=0; phase_4=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++; }