C source code complied using HT-Soft PIC C compiler

#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

{

ringcounter();

if(ringcount==0)

continue;

else

switch(ringcount)

{

case 1: RB0=1;

break;

case 2: RB1=1;

break;

case 3: RB2=1;

break;

case 4: RB3=1;

break;

case 5: RB4=1;

break;

case 6: RB5=1;

break;

case 7: RB6=1;

break;

case 8: RB7=1;

break;

default: break;

}

}

ringcount=0;

}

void dowakeoff(void)

{

char i;

for(i=0;i

{

ringcounter();

if(ringcount==0)

continue;

else

switch(ringcount)

{

case 1: RB0=0;

break;

case 2: RB1=0;

break;

case 3: RB2=0;

break;

case 4: RB3=0;

break;

case 5: RB4=0;

break;

case 6: RB5=0;

break;

case 7: RB6=0;

break;

case 8: RB7=0;

break;

default: break;

}

}

ringcount=0;

}

void wait5sec(void)

{

x=0;

TMR0=0;

while(x

if(TMR0>=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;

}

}

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | cheap international calls