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/////////////////////////////// 
'-------------------------------------------------------------------------------



1 comentario:

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