Buenas. He estado mirando como funciona el RC5, y por lo que veo un 'o' es un nivel alto durante 889us seguido de un nivel bajo de 889us. Un '1' es un nivel bajo durante 889us seguido de un nivel alto de 889us.
Por otro lado una trama completa consta de dos unos seguidos, llamados bits de star, un bit de 'tongle', que sirve para distinguir una sola pulsación de una pulsacion mantenida, cinco de direccion, y seis de comando.
En teoria para leer una trama, (El receptor de infrarrojos invierte la señal) detectamos una bajada de la salida del detector, contamos 444us, con lo cual nos situamos a 1/4 del primer bit (un bit son 889+889 us), testeamos ese nivel, y contando otros 889us nos situamos a 3/4 del primer bit, testeamos ese nivel, y si es contrario al nivel testeado anteriormente, de momento es un codigo rc5. Guardamos el primer nivel testeado, contamos otros 889us y entonces estamos a 1/4 del segundo bit. Esto se repetiria hasta completar los 14 bit.
Esto se corresponderia con este codigo:
#INT_EXT
void MandoDistancia(){
delay_us(444); //Espera 444
while((nbit++ != 13) && (state == 0)){
if(input(REC_IR)==0){
delay_us (889);
if(input(REC_IR) != 1)
state=1;
bit=0;
}else{
delay_us(889);
if (input(REC_IR) != 0)
state=1;
bit=1;
}
shift_left(data,2,bit);
delay_us (889); //ESTO ES LO QUE CAMBIA DEL CODIGO ANTERIOR
}
Pues bien, eso no se porqué pero no funciona, sin embargo el codigo puesto por migsantiago un poco mas arriba, si funciona (a 8Mhz claro, a 4Mhz no).
PD: Aqui se puede ver graficamente algo del RC5
http://robots-argentina.com.ar/Comunicacion_protocolorc5.htmUn saludo.