#include <18F252.h>
#use delay(clock=20000000)
#fuses NOWDT,HS, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7)
int1 get_RC5(void);
#define IR_INPUT PIN_B0 // the IR-Decoder has to be connected to an interrupt pin
#define IR_STATUS (!input(IR_INPUT)) // invert signal from IR-Receiver
typedef struct
{
int8 data[2];
int8 state;
}
rc5_struct;
rc5_struct rc5;
// interrupt function for external interrupt pin
#int_EXT
EXT_isr()
{
get_RC5();
}
// RC5 decoding
int1 get_RC5(void)
{
int16 tmp,t;
int i;
int1 inp;
set_timer1(0); // reset timer
while(IR_STATUS==1);
t=get_timer1();
if ((t<400) || (t<800)) return 0; // no RC5 code, cancel decoding
// receive all 13 data bits
for (i=0;i<13;i++)
{
inp=IR_STATUS;
set_timer1(0);
while (IR_STATUS==inp)
{
t=get_timer1();
if (t>800) return 0; // timing wrong -> no RC5
}
tmp<<=1;
if (inp==0) tmp++;
set_timer1(0);
while (get_timer1()<776);
}
tmp=tmp | 0x3000; // clear Bits 13,14 & 15
tmp=tmp & 0x37ff; // cut off Togglebit
rc5.data[0]=tmp & 0xff; // extract device address
tmp>>=8;
rc5.data[1]=tmp & 0xff; // extract command code
rc5.state = 1; // set flag for successful IR command decoding
disable_interrupts(INT_EXT); // disable Interrupts until received command has been processed
return 1;
}
void main()
{
// controller initialisieren
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // timer1 is used for RC5-decoding. When the chip runs @ 20MHz,
// a prescaler of 8 has to be used
setup_timer_2(T2_DISABLED,0,1);
//setup_comparator(NC_NC_NC_NC);
//setup_vref(FALSE);
// enable interrupts
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
rc5.state = 0;
while(1)
{
if(rc5.state==1)
// did we receive a valid command?
{
printf("Device: %u\n", rc5.data[0]); // display device address
printf("Command: %u\n", rc5.data[1]); // display command code
rc5.state = 0;
enable_interrupts(INT_EXT); // reenable interrupts
}
}
}