viernes, 16 de noviembre de 2012

CONTROL REMOTO IR -PIC : PROTOCOLO SIRC SONY Y RC5 PHILLIPS

Para los Alumnos de Microcontroladores y los  que deseen implementarlo...
Les dejo imágenes  y código de programa que les ayudara ha realizar un  Control Remoto Universal. Los protocolos que tienen que implementar se encuentran en este Enlace.
El control remoto que se implementado y simulado en ISIS PROTEUS simula los protocolos IR: SIRC  de SONY y RC5 PHILLIPS, con este ejemplo ya  pueden culminar su trabajo.
Tiene comunicación Serial por el se envía los comandos respectivos tiene el siguiente formato:
$Dirección-Comando.
La "Dirección" es de tres digitos al igual que el "Comando" Ejemplo: "$005053."






'*******************************************************************************
'Interupción del puerto USART
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_BAUD 2400
RCIF VAR PIR1.5 ' Alias RCIF (USART Receive Interrupt Flag)
OERR VAR RCSTA.1 ' Alias OERR (USART Overrun Error Flag)
CREN VAR RCSTA.4 ' Alias CREN (USART Continuous Receive Enable)
INTCON = %11000000 ' Enable interrupts
ON INTERRUPT GoTo PROTOCOLO ' Declare interrupt handler routine
PIE1.5 = 1 ' Enable interrupt on USART
'*******************************************************************************                 
'// Define variables
Ciclos   VAR BYTE     '// numero de ciclos 
Index    VAR BYTE     '// Index 
DBYTE    VAR BYTE     '// Byte de datos
ABYTE    VAR BYTE     '// 5-bit dirección  - protocolo SIRC
Cabecera var byte
Cero var byte
Uno var byte
RETARDO VAR word
RETARDO1 VAR byte
RET VAR byte
'*******************************************************************************
COMANDO VAR BYTE[7]
MARCA VAR BYTE : TIPO1 VAR BYTE : TIPO2 VAR BYTE : TIPO3 VAR BYTE
ACCION1 VAR BYTE : ACCION2 VAR BYTE : ACCION3 VAR BYTE : I var byte
TRISB.7 = 0             
TRISB.1 = 0             
portb.1=0
'*******************************************************************************
INICIO:
    pause 10
    PORTB.7 = 0                
GOTO INICIO
DISABLE
'*******************************************************************************
PROTOCOLO:      'SELECIONAR PROTOCOLO
    HSerin [WAIT ("$"),STR COMANDO \8\"."] 
    MARCA = COMANDO[0]  ' MARCA , SONY, LG ETC
   
    SELECT CASE MARCA
        CASE "A" ' MARCA SONY EJECUTAR PROTOCOLO SIRC
            Cabecera=96 '// Cabecera = (96 * 25uS) = 2.4mS de duración
            Cero=24     '// Cero = (24 * 25uS) = 0.6mS  de duración
            Uno=48      '// Uno = (48 * 25uS) = 1.2mS de duración
            ret=150
            FOR I=0 TO 100
                GOSUB SIRC
            NEXT I
    
        CASE "B"
            Cero=32     '// Cero = (32 * 28uS) = 0.889mS  de duración
            Uno=32    '// Uno = (32 * 28uS) = 0.889MS de duración
            RETARDO = 889
            ret=156
            FOR I=0 TO 100
                GOSUB RC5
            NEXT I
        CASE "C"
    
        CASE "D"
    
    END SELECT
    
RESUME
'*******************************************************************************   
'//////////////////////////////PROTOCOLO SIRC///////////////////////////////////
SIRC:
    DBYTE = (COMANDO[4]-48)*100 +(COMANDO[5]-48)*10+ COMANDO[6]-48
    ABYTE = (COMANDO[1]-48)*100 +(COMANDO[2]-48)*10+ COMANDO[3]-48
    GOSUB ENVIAR_SIRC
RETURN
'*******************************************************************************
   '// Send Cabecera Pulsos + 13-bit data/address packet on keypress
ENVIAR_SIRC:    
   Ciclos = Cabecera    
   CALL Pulsos         
   '// Enviar 7 bits de datos
   FOR Index = 0 TO 6 
    IF DBYTE.0[Index] = 0 THEN 
      Ciclos = Cero
      retardo=ret
    ELSE
      Ciclos = Uno
      retardo=ret
    ENDIF
    CALL Pulsos       
   NEXT Index         
  '// Enviar 5-bit de dirección
    FOR Index = 0 TO 4 
    IF ABYTE.0[Index] = 0 THEN
      Ciclos = Cero   
      retardo=ret
    ELSE
      Ciclos = Uno    
      retardo=ret
    ENDIF
    CALL Pulsos       
   NEXT Index         
   PAUSE  25          '// 25mS delay entre paquetes  
   return       
'*******************************************************************************
Pulsos:                '// Genera 40kHz                  ;
ASM 
Pulso   bsf PORTB, 7       ;// 1uS, LED=on [necesita 25uS total]
        goto $+1           ;// 3uS (2uS por goto $+1)
        goto $+1           ;// 5uS
        goto $+1           ;// 7uS
        goto $+1           ;// 9uS
        goto $+1           ;// 11uS
        goto $+1           ;// 13uS 
        bcf PORTB, 7       ;// 14uS, LED=off
        goto $+1           ;// 16uS
        goto $+1           ;// 18uS
        goto $+1           ;// 20uS
        goto $+1           ;// 22uS
        decfsz _Ciclos,f   ;// 23uS
        goto Pulso        ;// 25us 
        goto $+1          ;//2
salto   decfsz _RETARDO,f ;// 3
        goto salto        ;// 4 
ENDASM
RETURN             '// Retorna programa Enviar_SIRC
'*******************************************************************************   
'//////////////////////////////FIN PROTOCOLO SIRC///////////////////////////////
'-------------------------------------------------------------------------------
'//////////////////////////////PROTOCOLO RC5///////////////////////////////////
RC5:  
    DBYTE = (COMANDO[4]-48)*100 +(COMANDO[5]-48)*10+ COMANDO[6]-48
    ABYTE = (COMANDO[1]-48)*100 +(COMANDO[2]-48)*10+ COMANDO[3]-48 +192
    GOSUB ENVIAR_RC5
RETURN
'*******************************************************************************
   '// Send Cabecera Pulsos + 13-bit data/address packet on keypress
ENVIAR_RC5:                            
   '// Enviar 8 bits  direccion mas cabecera
   FOR Index = 7 TO 0 STEP-1 
    IF ABYTE.0[Index] = 0 THEN 
      Ciclos = Cero
      CALL FREC36
      ELSE
      Ciclos = Uno
      retardo1=ret
      CALL FREC36b
     ENDIF
    NEXT Index         
  '// Enviar 6-bit de datos
    FOR Index = 5 TO 0 STEP-1 
    IF DBYTE.0[Index] = 0 THEN
      Ciclos = Cero
      CALL FREC36
    ELSE
      Ciclos = Uno
      retardo1=ret
      CALL FREC36b    
    ENDIF 
    NEXT Index         
   PAUSE  25          '// 25mS delay entre paquetes         
   return
'*******************************************************************************
FREC36: ' GENERA FRECUENCIA DE 36KHZ APROX , BIT 0
ASM                   ;
FRE36   bsf PORTB, 7       ;// 1uS, LED=on [necesita 28uS total]
        goto $+1           ;// 3uS (2uS por goto $+1)
        goto $+1           ;// 5uS
        goto $+1           ;// 7uS
        goto $+1           ;// 9uS
        goto $+1           ;// 11uS
        goto $+1           ;// 13uS 
        bcf PORTB, 7       ;// 14uS, LED=off
        goto $+1           ;// 16uS
        goto $+1           ;// 18uS
        goto $+1           ;// 20uS
        goto $+1           ;// 22uS
        goto $+1           ;// 24uS
        NOP                ;// 25US
        decfsz _Ciclos,f   ;// 27uS
        goto FRE36        ;// 28us            
ENDASM
PAUSEUS RETARDO
RETURN             '// Retorna programa Enviar_RC5
'******************************************************************************
FREC36b:' GENERA FRECUENCIA DE 36KHZ APROX , BIT 1
ASM     
salto1  goto $+1           ;// 2uS
        decfsz _RETARDO1,f ;// 3us
        goto salto1        ;// 5us
        nop                ;// 6us                 ;
FRE     bsf PORTB, 7       ;// 1uS, LED=on [necesita 25uS total]
        goto $+1           ;// 3uS (2uS por goto $+1)
        goto $+1           ;// 5uS
        goto $+1           ;// 7uS
        goto $+1           ;// 9uS
        goto $+1           ;// 11uS
        goto $+1           ;// 13uS 
        bcf PORTB, 7       ;// 14uS, LED=off
        goto $+1           ;// 16uS
        goto $+1           ;// 18uS
        goto $+1           ;// 20uS
        goto $+1           ;// 22uS
        NOP                ;// 23uS
        decfsz _Ciclos,f   ;// 24uS
        goto FRE           ;// 26us            
ENDASM
RETURN                     '// Retorna programa Enviar_RC5
'*******************************************************************************   
'//////////////////////////////FIN PROTOCOLO RC5/////////////////////////////// 
'-------------------------------------------------------------------------------



2 comentarios:

Anónimo dijo...

Muy buena su pagina, y muy claros sus algoritmos ademas de que estan muy bien explicados.
He aprendido muchas cosas sobre PicBasic Pro, en su Blog.
Muchas Gracias por compartir su trabajo.
Luis Fernando Angel

eliecer dijo...

hola muy buenas, eso codigo si esta completo? no entiendo como envio la direccion y el comando?