Está en la página 1de 6

Señores, esto está FUNCIONANDO!

Les pongo el programa a continuación.

Algunas explicaciones quiero dar antes: Este programa está hecho SOLAMENTE
para decodificar el protocolo RC5, completamente por Software. No hay más
software entremezclado, como es tan típico, como por ejemplo para manejar LCDs.
El programa debería ser fácil de entender, y está bien comentado.

Pines:

RA0: entrada de datos desde el receptor IR (el datasheet del que usé, el IRM8601S
está adjuntado en uno de los posts anteriores).

RA1: LED que indica recepción errónea del dato (referente al comienzo del tren de
bits, y sin control de la interpretación de datos o addresses.

El MAIN del programa solo está en este momento para tirar el ADDRESS por
PORTB, esperar un segundo, y tirar entonces el COMMAND por PORTB, para que
puedan conectar LEDs y ver qué sale (en vez de usar una complicada rutina para
manejar Displays).

El resto sdel PIC se conecta como siempre. El Oscilador usado es de 4MHz, el PIC
es el 16F84.

Que el programa decodifique todo por Software y no se base en Hardware, es


bueno porque así es adaptable a casi cualquier PIC. Además, resulta que es
bastante corto, de manera que se pueda meter en PICs de bastante poca capacidad
también.

Si observan con cuidado, en el programa me salto, o no tomo en cuenta el Toggle


Bit, ya que tiene una propiedad poco necesaria, que intentar decodificarla haría que
el programa se alargue explosivamente. (demasiadas líneas de comando).

Si alguien tiene más preguntas, que pregunte!


Agradezco a jsemari por su ayuda.

Una observación: el programa a veces (pocas veces) tira datos erróneos (que no
corresponden a la tecla), pero eso se debe seguramente a alguna impureza de
señal. Talvez publique una versión mejorada de este programa.

Bueno, y este ha sido mi aporte aqui por hoy.

Saludos!

list p=16F84A ; list directive to define


processor
#include <p16F84A.inc> ; processor specific variable
definitions

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

DATA_IN EQU 0
ERROR_PIN EQU 1
ADDRESS EQU 0x0C
DATO EQU 0x0D
CONTADOR EQU 0x0E
PDel0 EQU 0x0F
PDel1 EQU 0x10
PDel2 EQU 0x11

;*******Inicialización del microcontrolador y


variables***********************************************
bsf STATUS,RP0 ;Pasar al banco 1
movlw B'00000001'
movwf TRISA ;1-7 = salida, 0 = entrada
movlw B'00000000'
movwf TRISB ;0-7 salida
bcf STATUS,RP0 ;Volver al banco 0

clrf PORTA ;Limpiar puertos


clrf PORTB
;*******Fin inicialización del
microcontrolador******************************************************
*

MAIN
call LEER
movf ADDRESS,W
movwf PORTB
call DEMORA ;demora de un segundo para alcanzar a
ver el primer dato
movf DATO,W ;que salió por PORTB, subrutina omitida
ahora.
movwf PORTB
call DEMORA ;demora de un segundo para alcanzar a
ver el primer dato
goto MAIN

;--------
FIN ;Es para que aqui termine
el programa sin que se borre PORTB.
goto FIN
;--------

LEER
btfsc PORTA, DATA_IN ;Esperar a que entre el primer dato para
comenzar
goto LEER
call DELAY14 ;Retraso de 1/4 de bit, para
estar bien "encima" del bit.
;Una vez comenzada la lectura, comprobar
el comienzo de la cadena
btfsc PORTA,DATA_IN ;Probar si primer start bit es 1 (aunque
ya es así...)
goto BAD_DATA ;Ir a BAD_DATA si el primer
start bit resulta ser cero
call DELAY12 ;Esparar por medio bit
btfss PORTA,DATA_IN ;Probar si entre 1er y 2do Start bit hay
un 0
goto BAD_DATA ;Ir a BAD_DATA si el segundo
start bit resulta ser cero
call DELAY12 ;Esparar por medio bit
btfsc PORTA,DATA_IN ;Probar si segundo start bit es 1
goto BAD_DATA ;Ir a BAD_DATA si el segundo
start bit resulta ser cero. HASTA AQUI, START BIT
call DELAY1 ;Saltarse el Toggle (por sus
propiedades complicadas)
call DELAY1

bcf PORTA,ERROR_PIN;Apagar pin de error si todo


esta bien, y en caso de que esté activo
;Si esta malo el comienzo de la cadena, será
Bad_Data
;Ahora se comienza con la decodificación de
datos útiles.

clrf ADDRESS ;Borrar ADDRESS y DATO para


empezar con variables limpias
clrf DATO

movlw D'5' ;Cargar contador para leer 5


bits (ADDRESS)
movwf CONTADOR

LEER_ADDRESS
rlf ADDRESS,F
btfss PORTA,DATA_IN ;Leer Most Significant Bit ADDRESS BITS
bsf ADDRESS,0 ;Poner en 1 la variable
ADDRESS,bit_corespondiente si fuese necesario
call DELAY1 ;Esperar un bit (para llegar al
siguiente)
decfsz CONTADOR,F ;Decrementar CONTADOR en 1 y
saltar próximo paso si es 0
goto LEER_ADDRESS ;Volver para leer el siguiente bit
;Terminada la lectura de esta cadena de datos
;Seguir con lo que sigue

call DELAY1 ;Esperar un bit para empezar a leer el


comando (próxima función)
movlw D'6' ;Recargar contador para leer 6
bits (comando)
movwf CONTADOR

LEER_DATO
rlf DATO,F
btfss PORTA, DATA_IN ;Leer MostSignificantBit DATA BIT
bsf DATO,0 ;Poner en 1 la variable
DATO,bit_corespondiente si fuese necesario
call DELAY1 ;Esperar un bit para leer el siguiente
decfsz CONTADOR,F ;Decrementar CONTADOR en 1 y saltar
próximo paso si es 0
goto LEER_DATO ;Volver para leer el siguiente bit
;Terminada la lectura de esta cadena de datos
;Seguir con lo que sigue

rrf DATO,F ;Para que el Bit 0 esté en la


pata PORTB,0
rrf ADDRESS ;Para que el Bit 0 esté en la
pata PORTB,0
return ;La lectura de datos está terminada,
ahora volver.

BAD_DATA
bsf PORTA, ERROR_PIN;Avisar que hay error
goto MAIN ;Volver al inicio, o salir de LEER

DELAY1
call DELAY14 ;Llamar 4 veces al DELAY de 1/4 de Bit
para que sea 1 Bit
call DELAY14 ;Todos los DELAYs son para 4MHz, y
DELAY1 = 1,778 ms
call DELAY14
call DELAY14
return

DELAY12
call DELAY14 ;Llamar 2 veces al DELAY de 1/4 de Bit
para que sea 1/2 de Bit
call DELAY14
return

;446 uS (la cuarta parte del tiempo de un bit).


DELAY14 movlw .110 ; 1 set numero de repeticion
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no, loop
return ; 2+2 Fin.

DEMORA movlw .14 ; 1 set numero de repeticion (C)


movwf PDel0 ; 1 |
PLop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.

END

ás: Ya he hecho un recorrido de prueba por los diferentes códigos para controles
universales para todos los aparatos Philipss. Los resultados a continuación, en la
ventana de código: (usada para que las columnas del texto se mantengan en su
lugar):

Código:

CÓDIGOS QUE FUNCIONAN para controles universales:


Aparato Código Observaciones

De Philipps:
TV 056 Funcionan funciones básicas para TV menos Channel
TV 043 Mismo caso
TV 011 Mismo caso
VCR 035 No es RC5, no funciona
VCR 013 Funcionan menos funciones básicas que en TV
VCR 012 No funciona
VCR 011 No funciona
VCR 063 El protocolo parece ser RC5 pero está corrido por un
bit
REC/AMP 028 Mismo caso anterior, pero con errores en el RC5
(protocolo no totalmente coincidente)
CD 015 Errores con RC5, no funciona.
TAPE 031 Con errores en el RC5 (protocolo no totalmente
coincidente)
TAPE 065 Caso anterior.
DVD 004 No funciona. No es RC5.
DVD 019 Caso anterior.
DVD 021 Caso anterior.

Conclusión: los tres códigos mencionados para TV son los que mejor
funcionan.

También podría gustarte