fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

PINGUINO & RC5 ...
 
Avisos
Vaciar todo

PINGUINO & RC5 IR CODE

7 Respuestas
3 Usuarios
0 Reactions
25.9 K Visitas
ea7fnj
Respuestas: 88
Topic starter
(@ea7fnj)
Trusted Member
Registrado: hace 18 años

Buenas jóvenes.

Tiempo hace que no paso por estos lares.

A ver, al grano, estoy intentando coger el código RC5 de infrarrojos con el siguiente programa:

/*-------------------------------------------------------------------*/
#define P1 13 //LED 1
#define P2 16 //LED 2
#define IR 17 //signal from IR receiver SFH506
#define halfbit 889 //time [µs] of 1/2 bit
/*-------------------------------------------------------------------*/
void setup(void)
{
pinMode(P1,OUTPUT);
pinMode(P2,OUTPUT);
pinMode(IR,INPUT);

digitalWrite(P1,LOW); //LED1 off
digitalWrite(P2,LOW); //LED2 off
}
/*-------------------------------------------------------------------*/
uint RC5_data() //this subfunction waits for a RC5 signal and decodes it.
{
uint D0,D1,i;

D0 = 0;
D1 = 65535;

if (digitalRead(IR)) //skip if 0
{
while (digitalRead(IR)); //wait for "1 to 0" edge (falling edge)
delayMicroseconds(halfbit/2); //wait 444.5us

for(i=0;i<13;i++) //read the following 13 bits
{
D1=D1*2+(digitalRead(IR)); //and read data
delayMicroseconds(halfbit); //wait for a half bit-time
D0=D0*2+(digitalRead(IR)); //and read inverted data
delayMicroseconds(halfbit); //wait for a half bit-time
}

if ((D0^D1)==65535)
{
return (D1 & 0x7FF);
}
else return (0);
}
else return (0);
}
/*-------------------------------------------------------------------*//
void loop(void)
{
int datos;

while(1)
{

datos = 0;
datos = RC5_data(); //read RC5

if (datos==1)
{
digitalWrite(P1,HIGH); //if "1" is pressed switch on LED1
delay(2000);
}

if (datos==2)
{
digitalWrite(P2,HIGH); //if "2" is pressed switch on LED2
delay(2000);
}

digitalWrite(P1,LOW);
digitalWrite(P2,LOW);
}
}

PROBLEMA: no consigo ver si lo hace bien. He probado con un LCD 2x16 y cogia valores muy cercanos pero en ninguno de los casos conseguia coger bien el código. Pero el LCD creo que ha pasado a mejor vida y a falta de un monitor de USB, me las veo mal para verlo.

He pensado en mirarlo por el ICD2 pero implica tocar todo el código y pasarlo a CCS para verlo.

¿Alguna alma candida que lo mire a ver si me he pasado algo?

Responder
6 respuestas
ea7fnj
Respuestas: 88
Topic starter
(@ea7fnj)
Trusted Member
Registrado: hace 18 años

Es lo que me estaba temiendo, que no contase bien los microsegundos.

D1: 57464 D0: 06023 D1^D0:63487
D1: 57464 D0: 06023 D1^D0:63487
D1: 58488 D0: 07047 D1^D0:65535
D1: 58488 D0: 07047 D1^D0:65535

D1: 57464 D0: 06023 D1^D0:63487
D1: 57464 D0: 06023 D1^D0:63487
D1: 58488 D0: 07047 D1^D0:65535
D1: 58424 D0: 07047 D1^D0:65471
D1: 57464 D0: 06023 D1^D0:63487
D1: 57464 D0: 06023 D1^D0:63487
D1: 58488 D0: 07047 D1^D0:65535
D1: 58488 D0: 07047 D1^D0:65535

D1: 57464 D0: 06023 D1^D0:63487
D1: 57464 D0: 06023 D1^D0:63487
D1: 58424 D0: 07047 D1^D0:65471
D1: 58488 D0: 07047 D1^D0:65535

El caso es que aproximo el código pero no lo consigo. Dime por donde tienes la libreria a ver si esta noche cojo ya el código RC5 que me hace falta para el concurso.

Gracias

PD: Acabo de pasar a 9.05 y la comunicacion CDC se ha ido al traste.

Responder
ea7fnj
Respuestas: 88
Topic starter
(@ea7fnj)
Trusted Member
Registrado: hace 18 años

Acabo de incorporar un temporizador (T1CON = 0xB0) de 889'1us:

/*-------------------------------------------------------------------*/
void RC5_delay_us()
{
TMR1H = 0xFA;
TMR1L = 0XCA;
PIR1bits.TMR1IF=0;
T1CONbits.TMR1ON=1;
while(!(PIR1bits.TMR1IF));
PIR1bits.TMR1IF=0;
T1CONbits.TMR1ON=0;
}
/*-------------------------------------------------------------------*/

Problema: ahora leo el CDC asi -->

D1: 5746406023D1: 6143908191D1: 574640602363487D1: 614390819161440D1: 584880704765535D1: 614390819161440D1

Responder
Página 2 / 2
Compartir: