haxan
New Member
Hi,
After long trying with SIRC (sony protocol) and not successful, i am trying out RC5 protocol by Philips.
The following code was written for another compiler and PIC16. I want to port it for PIC18 using C18 compiler. The code written below is not working as yet. Can someone please help me with this.
After long trying with SIRC (sony protocol) and not successful, i am trying out RC5 protocol by Philips.
The following code was written for another compiler and PIC16. I want to port it for PIC18 using C18 compiler. The code written below is not working as yet. Can someone please help me with this.
Code:
#include <p18cxxx.h>
#include <delays.h>
#pragma config WDT = OFF, LVP = OFF, OSC = XT, DEBUG = OFF
#define IR_pin PORTBbits.RB0
#define TIME_MIN (5)
#define TIME_MAX (11)
#define TIME_STEP (2)
#define LED0 PORTCbits.RC0
#define LED1 PORTCbits.RC1
#define LED2 PORTCbits.RC2
#define LED3 PORTCbits.RC3
#define LED4 PORTCbits.RC4
int RC5_receive(unsigned int *, unsigned int *);
void Delay100Us(unsigned char);
void applyIR(void);
void Delay100Us(unsigned char time)
{
char x;
for(x=0;x<time;x++)
Delay10TCYx(9);
}
unsigned int IR_addr, IR_data = 0;
void applyIR(void)
{
switch(IR_data)
{
case 0: LED0 ^= 1;break;
case 1: LED1 ^= 1;break;
case 2: LED2 ^= 1;break;
case 3: LED3 ^= 1;break;
case 4: LED4 ^= 1;break;
}
}
void main(void)
{
ADCON1 = 0x0F;
TRISB = 0x01;
TRISA = 0x00;
PORTB = 0x00;
TRISC = TRISD = TRISE = 0x00;
PORTA = PORTC = PORTD = PORTE = 0x00;
PORTC = 0x55;
while(1)
{
RC5_receive(&IR_addr, &IR_data);
applyIR();
}
}
int RC5_receive(unsigned int * RC5addr, unsigned int * RC5data)
{
int OffTime, OnTime, DevTime, DiTime, i, j, k;
unsigned int data = 0, addr = 0;
unsigned int bit_mask;
if(!IR_pin)
{
for(OffTime = 0; !IR_pin && OffTime < TIME_MAX; OffTime += TIME_STEP){Delay100Us(TIME_STEP);}
if (OffTime > TIME_MAX) return -1;
if (OffTime < TIME_MIN) return -1;
for(OnTime = 0; IR_pin && OnTime < TIME_MAX; OnTime += TIME_STEP){Delay100Us(TIME_STEP);}
if (OnTime > TIME_MAX) return -1;
if (OnTime < TIME_MIN) return -1;
//* skip token
DevTime = (2 * OffTime + OnTime + OffTime / 2);
for (k = 0; k < DevTime; k += TIME_STEP){Delay100Us(TIME_STEP);}
//* get address and data
DiTime = (OffTime + OnTime);
for (i = 0; i < 5; i++)
{
if(IR_pin) {addr <<= 1;} else{addr <<= 1; addr |= 1;}
for (k = 0; k < DiTime; k += TIME_STEP){Delay100Us(TIME_STEP);}
}
for (i = 0; i < 6; i++)
{
if(IR_pin){data <<= 1;}else{data <<= 1; data |= 1;}
for (k = 0; k < DiTime; k += TIME_STEP){Delay100Us(TIME_STEP);}
}
*RC5data = data;
*RC5addr = addr;
return 0;
}
return -1;
}
Last edited: