Hola amigos, estoy tratando de leer los codigos de un control remoto DAEWOO R48C04 con un programa hecho con el mplab, el programa que use de base era uno que encontre en internet para decodificar el protocolo de sony y funciona bien para esta marca; segun la informacion que encontre del protocolo daewoo http://users.telenet.be/davshomepage/daewoo.htm, cambie los valores para la lectura de los bits, compile el programa e hice la simulacion con el mpsim, stimulus, watch y el stopwatch y el programa funciona ok, pero cuando lo paso al PIC, no hace nada, subo el programa para que lo puedan analizar y me den su opinion:
Subo tambien una imagen del control remoto Daewoo, le he hecho variaciones de valores al programa pero no he logrado que funcione, el control remoto esta bien, por que lo revise con un osciloscopio para pc que utiliza la tarjeta de sonido del computador y la grafica muestra que el CR esta transmitiendo; quisiera saber si es que este control remoto maneja otro tipo de protocolo y su grafica de tiempos o valores de los bits para poderlos modificar en el programa, o si hay algo en lo que este fallando, por favor recibo gustosamente cualquier observacion al respecto.
Código:
;**********************************************************************
; Programa para decodificar un tren de pulsos codificados en *
; formato Daewoo para el Microcontrolador PIC16F628A @ 4Mhz. *
; utlizando el oscilador interno*
;**********************************************************************
LIST P=16F628A
#include <p16F628A.INC>
;=======================================================
; Bits de configuracion del pic
;=======================================================
__CONFIG 0x3F18
#DEFINE Banco0 bcf STATUS,RP0 ; Fija banco 0 de la memoria
#DEFINE Banco1 bsf STATUS,RP0 ; Fija banco 1 de la memoria
;=======================================================
; Definicion de variables, constantes y puertos
;=======================================================
Z equ 2
C equ 0
IR equ 4 ; Entrada 4 de PuertoA
CMCON equ 0x1f ; Posicion de los comparadores
TMR0 equ 0x01 ;
OPTION_REG equ 0x81 ; Registro OPTION
ESTADO equ 0x03 ; Registro ESTADO
;******* Definición de las teclas del Control Remoto
;Power equ 0x15
;ChanelL equ 0x11
;ChanelP equ 0x10
;TvVtr equ 0x4A
;Rew equ 0x1B
;Play equ 0x1A
;FF equ 0x1C
;Stop equ 0x18
;Pause equ 0x19
PtoA equ 0x05 ; Puerto A
PtoB equ 0x06 ; Puerto B
CBLOCK 0x20
Tempo
Cont_Ba ; Contador de tiempo (low byte)
Cont_Med ; (middle byte)
Cont_Alt ; (high byte)
ContaBit ; Contador de bits
Tecla ; Ultimo comando recibido
; Comando ; Ultimo comando recibido
Conta
Ciclo1
Ciclo2
Temp0
Temp1
Temp2
ENDC
;=======================================================
ORG 0x000 ; vector reset del procesador
goto INICIO ; ir a comienzo del programa
;**********************************************************************
; Delay
; Espera por aproximadamente W mseg y retorna
;**********************************************************************
Delay clrf Tempo
d1 nop
decfsz Tempo,F ; Lazo 255 * 4uS
goto d1
movwf Tempo ; repita el lazo W veces
decfsz Tempo,W
goto Delay
retlw 0
;**********************************************************************
; BYTE espera hasta 2 segundos por 14 bits. Los datos
; Daewoo son enviados como 7 bits de direccion y 7 bits
; del cómando, en ambos casos los LSB
; primero. Sólo necesitamos el comando de 7 bit al cual
; agregamos un octavo bit puesto a cero para completar
; un byte
;**********************************************************************
BYTE Banco0
clrf Cont_Ba ; reset contadores
movlw 0x80
movwf Cont_Med
clrf Cont_Alt
BYTE1 incf Cont_Ba,F ; Espera por una señal
btfsc ESTADO,Z
incf Cont_Med,F
btfsc ESTADO,Z
incf Cont_Alt,F
movlw D'3' ; pero no mas de 2 seg
subwf Cont_Alt,W ; (2.5*256*256*12us ~ 2seg)
btfsc ESTADO,C
goto PPAL ; aborte si el tiempo se excede
btfss PtoA,IR ; sino cheque a ver si hay señal
goto BYTE1 ; y sino, loop
; Hay señal
;
call CABECERA ; ver si es un encabezado
btfss ESTADO,C
goto BYTE1
;
; Es un encabezado...continue
; Lee 7 bit Código del dipositivo pero los ignora
;
movlw D'7'
movwf ContaBit ; Preparado para recibir 7 bits
BYTE3 call VR_BIT
decfsz ContaBit,F
goto BYTE3
call _550microS
call _4mSeg
; Lee los 7 bits del comando. Resultado en Tecla
movlw D'7' ; preparado para recibir 7 bits
movwf ContaBit
clrf Tecla
BYTE2 call VR_BIT
rrf Tecla,F
decfsz ContaBit,F
goto BYTE2
rrf Tecla,F ; agrega un 8 bit
bcf Tecla,7 ; puesto a cero
; Como test final, asegurese que son solo 14 bits los recibidos
call _550microS
clrf Cont_Ba ; Reset contadores
clrf Cont_Med
BYTE4 btfss PtoA,IR ; Chequee que no hay señal por el
; resto de la transmision del CR
goto PPAL ; Si hay aborte
incf Cont_Ba,F
btfsc ESTADO,Z
incf Cont_Med,F
movlw D'4' ; Cheque cuanto he esperado
subwf Cont_Med,W ; (4*256*10us = 10ms)
btfss ESTADO,C
goto BYTE4 ; loop hasta que los 10ms expiren
retlw 0
;**********************************************************************
; VR_BIT Determina el valor del bit que se esta recibiendo.
; Retorna con carry = 1 si el bit = 1 y carry = 0 si el bit = 0
; Los bits Daewoo son codificados como 550us sin portadora (low) seguido
; de 450us de portadora (high) para un "0" o 1450us para un "1".
;**********************************************************************
VR_BIT clrf Cont_Ba ; Reset contador
BIT1 incf Cont_Ba,F ; determne tiempo de no portadora
movlw D'125'
subwf Cont_Ba,W ; permite hasta 1000us (125*8us)
btfsc ESTADO,C
goto PPAL ; aborte si es mayor
btfsc PtoA,IR ; mantengase contando portadora viene
goto BIT1
; Un espacio menor que 800us fue recibido
;
movlw D'25' ; Asegurese que es mas grande que
subwf Cont_Ba,W ; 25*8us = 200us
btfss ESTADO,C
goto PPAL ; aborte si es menor
; Determine la longitud del pulso IR que esta siendo recibido
clrf Cont_Ba
BIT2 incf Cont_Ba,F ; Cuente este pase
movlw D'250'
subwf Cont_Ba,W ; Permita hasta 2000us (250*8us)
btfsc ESTADO,C
goto PPAL ; Aborte si es mayor
btfss PtoA,IR ; siga contando hasta final pulso
goto BIT2
; Señal presente
movlw D'52' ; Asegurese que es mayor que
subwf Cont_Ba,W ; 69*8us = 552us
btfss ESTADO,C
goto PPAL ; Si no aborte
; Que es: un 1 o un 0
movlw D'125' ; Compare con un ancho de 1000us
subwf Cont_Ba,W ; Carry 1 o 0
retlw 0
;**********************************************************************
;
; Detecta encabezado > 1.8 ms low
; Retorna con carry = 1 si es un encabezado y carry = 0 si no lo es.
;
;**********************************************************************
CABECERA call _8mSeg ; _550microS
call _4mSeg
clrf Tempo ; Chequee para un encabezado de aprox. 2.5 ms de longitud
CAB1 incf Tempo,F ; Cuente cada pase a traves del loop
bsf PtoA,IR
Banco1 ; Banco 1
movlw B'00100000' ;
movwf PtoA ; Reset schmitt
movlw B'00110000' ; Entrada a la deriva debido a la
movwf PtoA ; luz ambiental
Banco0 ; Banco 0
tiempo movlw .2
movwf Ciclo1
uno decfsz Ciclo1,1
goto uno
nop
movlw D'175' ; Chequee para un encabezado de
subwf Tempo,W ; aprox. (175*19us ~4.05 ms)
; call _4mSeg
btfsc ESTADO,C
goto CAB2 ; Aborte si es muy largo
btfss PtoA,IR ; Chequee si la señal esta aun ahi
goto CAB1 ; y si esta mantengase looping
; Un pulso de menos de 3ms de duración ha sido recibido
;
movlw D'153' ; Asegurese que es mayor que
subwf Tempo,W ; 138*13us ~ 1.8ms
retlw 0 ; C = 1 si T>1.8ms
CAB2 clrw
addwf Tempo,W ; Agregando 0 a cualquier numero C=0
retlw 0
;**********************************************************************
;
; Programa Principal
;
;**********************************************************************
Banco0
INICIO clrf PtoA ; Clear registro PtoA
clrf PtoB ; Clear registro PtoB
movlw 0x07
movwf CMCON ; Apaga comparadores
Banco1 ; Banco 1
movlw B'00110000' ; RA4 - RA5 como input
movwf PtoA ; Configure TRISA
movlw 0x00 ; Puerto B todos Salidas
movwf PtoB ; configura TRISB
; banco0
PPAL call BYTE ; Tomar un byte de Comando
movf Tecla,0
movwf PtoB ; Muestre comando por Puerto B
goto PPAL
;=====================================================================
; TIEMPOS
;=====================================================================
; Rutina de 9.6 mS para detectar estado bajo en la cabecera de la
; tecla pulsada
;=======================================================
_8mSeg clrf Temp0
clrf Temp1
clrf Temp2
movlw .3
movwf Temp0
alto2 movlw .250 ; Rutina de 8 mSeg.
movwf Temp1
alto1 movlw .2
movwf Temp2
btfss PtoA,IR
goto fin
alto0 decfsz Temp2,1
goto alto0
decfsz Temp1,1
goto alto1
decfsz Temp0,1
goto alto2
fin retlw 0
;=======================================================
; Rutina de tiempo de aprox 4000 mS
;=======================================================
_4mSeg clrf Temp0
clrf Temp1
clrf Temp2
movlw .2
movwf Temp0
bajo2 movlw .180 ; Rutina de 4 mSeg.
movwf Temp1
bajo1 movlw .2
movwf Temp2
btfsc PtoA,IR
goto fin2
bajo0 decfsz Temp2,1
goto bajo0
decfsz Temp1,1
goto bajo1
decfsz Temp0,1
goto bajo2
fin2 retlw 0
;=======================================================
_550microS clrf Temp0
clrf Temp1
movlw .10 ; Rutina de 550 mSeg
movwf Temp0
alto3 movlw .17
movwf Temp1
nop
btfss PtoA,IR
goto fin3
alto4 decfsz Temp1,1
goto alto4
decfsz Temp0,1
goto alto3
fin3 retlw 0
;=====================================================================
END ; FIN DEL PROGRAMA
Subo tambien una imagen del control remoto Daewoo, le he hecho variaciones de valores al programa pero no he logrado que funcione, el control remoto esta bien, por que lo revise con un osciloscopio para pc que utiliza la tarjeta de sonido del computador y la grafica muestra que el CR esta transmitiendo; quisiera saber si es que este control remoto maneja otro tipo de protocolo y su grafica de tiempos o valores de los bits para poderlos modificar en el programa, o si hay algo en lo que este fallando, por favor recibo gustosamente cualquier observacion al respecto.
Adjuntos
Última edición por un moderador: