Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?
18/06/2012 #1


Problema para decodificar control remoto daewoo r48c04
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:
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.
24/06/2012 #2


Hola amigos, subo un PDF con la informacion de este protocolo y un programa para ver la traza de bits de cualquier marca de control remoto, es como un osciloscopío pero exclusivamente para ver la emision de los controles remotos. Espero que les sirva tanto como a mi.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.