#include #define THR (0) #define TLR (0) #define TH (0) #define TL (0) #define TV (1.04) //Teilerverhältnis sbit SIG_A=P1^7; data int count; //Variable für Zählung der Überläufe data unsigned int tpe; //Periodendauer Eingang data unsigned int tpa=65535; //Periodendauer Ausgang void main(void) { TMOD=0x11; TH0=THR; TL0=TLR; TH1=TH; TL1=TL; ET0=1; ET1=1; EX0=1; EA=1; IT0=1; TR0=1; TR1=1; for(;;) { switch(count) { case 1: if((TH1*256+TL1)>=tpa) //wenn Zeit für Korrektursignal erreicht { SIG_A^=1; //ausgangssignal ausgeben TH1=THR; //timer zurücksetzen TL1=TLR; } break; default: if((TH1*256+TL1)>=tpa) //wenn Zeit für Korrektursignal erreicht { count--; TH1=THR; //timer zurücksetzen TL1=TLR; } break; } } } void EXTint1(void) interrupt 0 //immer wenn neg. Flanke von Eingagssignal { TR0=0; count=0; tpe=TH0*256+TL0; //verstrichene Zeit erfassen tpa=tpe*TV; //Ausgangsperiodendauer berechnen inkl. Korrektursignal TH0=TH; TL0=TL; TR0=1; //Zeitzähler zurücksetzen und neu starten } void Timeint1(void) interrupt 1 //für Erfassung { count++; TH0=TH; TL0=TL; if(count==31) //Dann sind ca. 2 sekunden vergangen ohne eine Änderung des Eingangssignals { SIG_A=0; count=1; } } void Timeint2(void) interrupt 3 //für Ausgabe { TH1=THR; TL1=TLR; }