#define TIMEOUTS 98 // no. of timeouts to occur for waiting (1 timeout = 200x256us), 98 timeouts=5sec #include #include __CONFIG(0x3ff1); void ringcounter(void); void dowakeon(void); void dowakeoff(void); void delay(void); void wait5sec(void); void getdipswitch(void); char WAKEON = 4; char WAKEOFF = 5; char WAITDELAY = 2; char ringcount=0; unsigned int x=0; void main(void) { GIE=0; //disable interrupts TRISA=0b00011111; //PORTA=in TRISB=0b00000000; //B0 to B7 output OPTION=0b11010111; // tmr0/prescaler 256/tmr0 --> internal PORTB =0; //turn all relays off // getdipswitch function sets the intial on/off rings and also the delay for rings to turn device on through A4,A3,A2,A1 // A4 A3 wakeon wakeoff // 0 0 2 3 // 0 1 3 4 // 1 0 4 5 // 1 1 5 6 // // A2 A1 waitdelay // 0 0 5 // 0 1 10 // 1 0 15 // 1 1 20 getdipswitch(); //configure rings and delay while(1) { ringcounter(); if(ringcount==WAKEON) dowakeon(); else if(ringcount==WAKEOFF) dowakeoff(); } } void ringcounter(void) { ringcount=0; while(1) { x=0; TMR0=0; while(RA0==0) { if(TMR0>=200) // to keep some margin in case TMR0 rolls back to 00, keep it to C8(200dec)!! { TMR0=0; x++; if(x>=TIMEOUTS) //if timeout 5s return. Total timeout = 200us*TIMEOUTS*256(prescaler) return; } } while(RA0==1); //while A0=1 wait ringcount++; } } void dowakeon(void) { char i; for(i=0;i=200) // to keep some margin in case TMR0 rolls back to 00, keep it to C8(200dec)!! { TMR0=0; x++; } return; } void getdipswitch(void) { char temp1,temp2; temp1 = (PORTA&0b00011000)>>3; //get the A4,A3 bits into temp1 temp2 = (PORTA&0b00000110)>>1; //get the A2,A1 bits into temp2 switch(temp1) { case 0: WAKEON=2;WAKEOFF=3; break; case 1: WAKEON=3;WAKEOFF=4; break; case 2: WAKEON=4;WAKEOFF=5; break; case 3: WAKEON=5;WAKEOFF=6; break; default:break; } switch(temp2) { case 0: WAITDELAY=1; break; case 1: WAITDELAY=2; break; case 2: WAITDELAY=3; break; case 3: WAITDELAY=4; break; default:break; } }