/* Programmname : Technikerprojekt_Ver_17.C51 Datum: 16.09.05 Programmierer: Thomas Stricker und Frank Weisenburger ProgFunktion : Erkennung einer Präambel Zwischenspeichern der Werte nach 15 min Speicherung der Mittelwerte der Sensoren mit Zeitstempel */ #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 MS2001ID_z=0,MS2001IuA0_z=0,MS2001IuA1_z=0,MS2001IuA2_z=0,MS2001IuA3_z=0,MS2001IuA4_z=0; //Zeilenzähler für Zwischenspeicher Array unsigned char MS2001IuA5_z=0,MS2001IuA6_z=0,MS2001IuA7_z=0,MS2000R_z=0,MS2000W1_z=0; xdata unsigned int S2001ID_z=0,S2001IuA_z=0,S2000R_z=0,S2000W1_z=0; //Zeilenzähler für Speicher Arrays 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; void main(void) { phase_1=0; phase_2=0; phase_3=0; phase_4=1; phase_5=0; phase_6=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 ES0 = 1; //Einschalten Interrupt RS232 EAL = 1; //Einschalten Interruptfreigabe(aller Interrupts) //*********************************************************************************************/ T2CON = 0x40; //Timer2 initialisieren CCEN = 0x05; // capture mode Timmer2 steuerung über Interrupts P1.0 und P1.1 T2I0 = 1; //Timer 2 starten /******************************************************************************************** //********************************Initialisieren RS232 **************************************** //PCON=PCON&0x80; //BIT SMOD setzen //REN0=1; //SM0=0; //SM1=1; //S0RELH=3; //BAUD Generator Reloadwert MSB //S0RELL=243; //BAUD Generator Reloadwert LSB //********************************************************************************************** //**************************** Initialisierung Timer1 für DCF **********************************/ 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 ES0 = 0;//RS232 off RI0=0; TI0=0; T2I0=0;//Timer 2 Interrupt off TF2=0;//Timer 2 Flag löschen EX3=0;//P 1.0 Interrupt off IEX3=0;//P1.0 Flag löschen EX4=0;//P1.1 Interrupt off IEX4=0;//P1.1 Flag löschen EXEN2=1;//P1.5 freischalten EXF2=0;//P1.5 Flag löschen ET2=1;//P1.5 Interrupt on IEX6=0;//P1.3 Flag löschen EX6=1;//P1.3 Interrupt on EAL=1; flanke_steigend=0; 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_1=0; phase_2=0; phase_3=0; phase_4=0; phase_5=1; phase_6=0; 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_1=0; phase_2=0; phase_3=0; phase_4=1; phase_5=0; phase_6=0; 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_1=0; phase_2=0; phase_3=0; phase_4=1; phase_5=0; phase_6=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_1=0; phase_2=0; phase_3=0; phase_4=1; phase_5=0; phase_6=0; } } if(phase_6==1) { set_clock(); Bit0_P4=~Bit0_P4; phase_1=0; phase_2=0; phase_3=0; 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_1=0; phase_2=0; phase_3=0; phase_4=1; phase_5=0; phase_6=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++; }