RC5 de philips decodificación y control

Oye puedes decirme como hacerlo en picBasic es que ese programa ya lo tengo instalado en mi maquina y he estado trabajándolo junto con visual basic, trate de hacer el programa pero creo que necesito un archivo extra porque solo puedo trabajar con el pic 18f4550 y no aparece otro y que compilador debo elegir??

La operación Xor me refería a la instrucción
command = command ^ %01111111111111 ; invierte el estado del bit 0 de B0
endif

Según yo cuando colocas "^" es porque quieres aplicar la operación XOR, pero puedo equivocarme. Esta instrucción no la comprendo del todo, porque hacerla?que función tiene?
y si no la hago tendrá alguna consecuencia?

El código que pase EN Mplab utilizando el compilador ccs es el siguiente.
Me basé en tu lógica o en la parte de programa que pusiste anteriormente.

Código:
struct empaquetado {                    ///Todo esto es para tratar de hacer lo mismo que tu
    unsigned int bit0:1;         /// con la variable comando, creo una estructura 
    unsigned int bit1:1;                  /// empaquetado con 14 variables las cuales 
    unsigned int bit2:1;                  /// corresponden a cada bit de la señal del control
    unsigned int bit3:1;
    unsigned int bit4:1;
    unsigned int bit5:1;
    unsigned int bit6:1;
    unsigned int bit7:1;
    unsigned int bit8:1;
    unsigned int bit9:1;
    unsigned int bit10:1;
    unsigned int bit11:1;
    unsigned int bit12:1;
    unsigned int bit13:1;
    
    
} paquete;

///////////////////////////Dentro de la funcion principal tengo el sig. codigo basado en el tuyo

    Senal:                              //Etiqueta del goto
    paquete = 0;                    //Todas las variables de la estructura a cero
    if (!input(IR_RECEPTOR))    // Pregunto si la entrada del pin es cero
    {
    paquete.bit13=1;              // Pongo el bit13=1,,para acceder a cada bit de la 
                                          // estructura debo poner paquete.bitx=
    delay_us(1330);               //primer pausa para ke kede en medio del sig bit
    if(paquete.bit13)              //segun yo el valor es 1330 en el retardo y no 2066
    {
            codigo(); //función donde pregunto por los demás bits



              }

///////////////////////////////Función código
//Esta parte del código va checando la trama mandada por el control de tal forma que checa cada bit de
// la trama compuesta por 14 bits, los retardos son los adecuados para que separe a cada bit 
// si al checar cae en un uno es porque es un uno y en caso contrario si cae en un cero corresponde a un cero, en esto según yo como estoy tomando la salida de un receptor donde
// la señal de salida siempre sera un uno al recibir la señal de control se hace cero
// y obtendremos una señal invertida de como la muestran normalmente
/////////////////////////////////////////////////////////////////////////////////////////////////
//
    
int codigo()
{
if (input(IR_RECEPTOR)){     paquete.bit12 = 1;}//Asigno valor a cada bit dependiendo de la
else{                        paquete.bit12 = 0;}// entrada
delay_us(pausa);

if (input(IR_RECEPTOR)){    paquete.bit11 = 1;}
else{            paquete.bit11 = 0;}
  delay_us(pausa) ;

if (input(IR_RECEPTOR)){    paquete.bit10 = 1;}
else{            paquete.bit10 = 0;}
  delay_us(pausa);

if (input(IR_RECEPTOR)){    paquete.bit9 = 1;}
 else{                     paquete.bit9 = 0 ;}
 delay_us(pausa);

if (input(IR_RECEPTOR)){    paquete.bit8 = 1;}
 else {            paquete.bit8 = 0;}
delay_us(pausa);

if (input(IR_RECEPTOR)){    paquete.bit7 = 1;}
 else {            paquete.bit7 = 0;}
delay_us( pausa) ;

if (input(IR_RECEPTOR)){    paquete.bit6 = 1;}
else{            paquete.bit6 = 0;}
delay_us (pausa );

if (input(IR_RECEPTOR)){    paquete.bit5 = 1;}
else {            paquete.bit5 = 0;}
delay_us( pausa );

if (input(IR_RECEPTOR)){    paquete.bit4 = 1;}
else         {    paquete.bit4 = 0;}
delay_us( pausa );

if (input(IR_RECEPTOR)){    paquete.bit3 = 1;}
 else{            paquete.bit3 = 0;}
delay_us( pausa );

if (input(IR_RECEPTOR)){    paquete.bit2 = 1;}
else {                     paquete.bit2 = 0;}
delay_us( pausa );

if (input(IR_RECEPTOR)){    paquete.bit1 = 1;}
else {            paquete.bit1 = 0;}
delay_us (pausa) ;

if (input(IR_RECEPTOR)){    paquete.bit0 = 1;}
else {            paquete.bit0 = 0; }

///////////En esta parte no se como hacer la operacion que hiciste la de invertir los bits
/////lo puedo hacer uno por uno pero es muy largo 
if (paquete.bit12) ;//Si la señal viene invertida la arregla

if (paquete.bit13){     paquete.bit13 = 0;}//Por ejemplo para invertir el estado del bi13
else{                        paquete.bit13 = 1;}//pregunto si es uno si es cierto lo pongo a 
                                                                    // cero y si es cero lo pongo a uno y asi para 
                                                                    // todos los bits bit12,bit11,bit10,....bit0
// Depués regresaríamos a donde fue llamada la función tecla y en ese espacio checaría los 
// últimos bits para saber la tecla que fue presionada y hacer algo por ejemplo mostrarlo en 
// el lcd prender un led con el peso correspondiente a la tecla o activar un motor,etc.
Bueno hasta aqui mis problemas espero y puedas ayudarme o seguir aconsejándome como lo
has hecho, esperando que comprendas lo que trato de hacer en mi código y las explicaciones que en el doy. Sin nada mas me despido

Perdóname, ni me acuerdo porque puse esa operación OR.
El otro día revisando el código, me preguntaba; ¿para que puse eso?
 
Última edición por un moderador:
Otra preguntilla, tubiste problemas con los tiempos?, quiero decir al comparar los tiempos del protocolo teorico con el practico, para dar los retardos con el valor que pusiste.
He estado probando un control philips y el tiempo que tiene la señal varia un poco el ciclo alto dura mas que el bajo que el periodo es el mismo. En mis mediciones el ciclo alto es de 1ms aprox y el bajo como de 725us aprox. Quiciera saber si tubiste un problema asi
 
Otra preguntilla, tubiste problemas con los tiempos?, quiero decir al comparar los tiempos del protocolo teorico con el practico, para dar los retardos con el valor que pusiste.
He estado probando un control philips y el tiempo que tiene la señal varia un poco el ciclo alto dura mas que el bajo que el periodo es el mismo. En mis mediciones el ciclo alto es de 1ms aprox y el bajo como de 725us aprox. Quiciera saber si tubiste un problema asi

En este protocolo un 1 es una señal asi.. 1-0 y un cero es 0-1, osea que midiendo el tiempo que esta en cero no se puede decodificar bien porque si tenes por ejemplo un cero y un uno, la señal seria 0110, si medis el tiempo va a parecer un 1 largo, pero en verdad la mitad de ese 1 es de un bit y la otra mitad del bit siguiente.
 
En este protocolo un 1 es una señal asi.. 1-0 y un cero es 0-1, osea que midiendo el tiempo que esta en cero no se puede decodificar bien porque si tenes por ejemplo un cero y un uno, la señal seria 0110, si medis el tiempo va a parecer un 1 largo, pero en verdad la mitad de ese 1 es de un bit y la otra mitad del bit siguiente.



MMMMMMMMMM eso me ha llevado a cambiar de control y me he decidido por un sony ya que sy protocolo es mas facil de decodificar segun yo.Ahora solo intento medir el tiempo que dura el estado alto ya que este protocolo un 1 se define como un nivel bajo de 600us y un nivel alto de 1200us, el 0 se define como un nivel bajo de 600us y un nivel alto de 600us.
EL nivel alto es la clave ya que si es 1200us es un 1 y si es 600us es un cero.
Mis pruebas ahora estan concentradas en eso ahora gracias por los consejos que me has dado me han hayudado :aplauso:
 
cordial saludo,,,
dado que esto de los protocolos y los tiempos de duracion de los pulsos y bits son tan rapidos se ve uno en la necesidad de visualizarlos,, por casualidad saben de un programita que vaya acompañado de un circuito para hacer un analizador digital, pues los que venden son costositos,,,
gracias.......
 
cordial saludo,,,
dado que esto de los protocolos y los tiempos de duracion de los pulsos y bits son tan rapidos se ve uno en la necesidad de visualizarlos,, por casualidad saben de un programita que vaya acompañado de un circuito para hacer un analizador digital, pues los que venden son costositos,,,
gracias.......

Compra el TSOP1738, conectalo a la placa de sonido y grabalo con el GoldWave, yo hice asi y me ayudo muchisimo.

Tambien podes hacer el circuito para conectarlo al puerto serial y usar el winlirc
 
Última edición:
Holas a todos.

He estado leyendo este hilo e intente adaptar el código de Moyano a Proton IDE, pero me ha resultado muy dificil, bueno es mas que nada por que no me manejo muy bien en ccs y el tema de las interupciones no las se usar. Entonces me preguntaba si es que me podrian ayudar a corregir los errores que cometo, si es con ejemplos mejor aun.

Bueno el codigo que he escrito:

Código:
 '****************************************Configuración inicial************************************
 
 Device = 16F877                'Usamos el pic16f877a
 Xtal = 4                       'Con un cristal de 4 mhz
 
 OPTION_REG = %00000000
 INTCON = %10010000
 
 '*********************************Definimos la conexión del lcd***********************************
 
 LCD_DTPin = PORTB.4       
 LCD_RSPin = PORTB.3
 LCD_ENPin = PORTB.1
 LCD_Interface = 4
 LCD_Lines = 2
 LCD_Type = 0
 
 '*************************************Declaramos variables****************************************
 
 Dim Datos As Word
 Dim i As Byte
 Dim D0 As Byte
 Dim D1 As Byte
 Dim Resultado As Byte
 Dim flag As Bit
 
 '*************************************Constantes del sistema**************************************
 
 Symbol Cuartodebit = 440
 Symbol Mediobit = 880
 Symbol Receptor = PORTB.0
 Symbol Ledtrama = PORTC.5
 
 '****************************************Seteamos puertos*****************************************
 
 TRISB.0 = 1
 TRISC.5 = 0
 
 '***********************************Inicializamos interrupción************************************
 
 On Interrupt GoTo Decodifica_rc5
 
 '******************************Comienza el lazo de funcionamiento*********************************
 
 Lazo:
 
  DelayMS 1
  
  Ledtrama = 0
  If Resultado > 0 Then
   Datos = Resultado
   Datos = Datos & $007F
  End If
  Ledtrama = 0
  If flag = 0 Then
   Cls
   flag = 1
  End If
  Print At 1, 1, "Comando ", Dec Datos
  
  GoTo Lazo
  
 '*************************************Rutina de interrupción**************************************
 
 Disable
 Decodifica_rc5:
 
  D0 = 0
  D1 = 65535
  
  While Receptor = 0
   DelayUS Cuartodebit
   For i = 0 To 13
    DelayUS Mediobit
    D1 = D1 * 2 + Receptor
    DelayUS Mediobit
    D0 = D0 * 2 + Receptor
   Next
  Wend
  If (D0 ^ D1) = $3FFF Then
   Resultado = (D1 & $3FFF)
   Ledtrama = 1
  Else
   Resultado = 0
  End If
  
  INTCON = %10010000
 
 Resume
 Enable

Nota: Cuando lo pruebo en el pic 16f877 real, el programa no hace nada solo muestra en la lcd el número 65

Estoy usando un IRM8601 conectado al pin RB0 y el led de trama esta conectado al pin RC5
 
Hola a todos he estado trabajando en el código de Moyano y lo he simulado en Proteus y todo ha funcionado de maravillas, pero el codigo en ccs asi como esta no me sirve, necesito pasarlo a Proton IDE para poder implementarlo en otro codigo de un pre-digital.

Bueno, lo he pasado a Proton IDE pero ese no me hace nada. Es este:
Código:
Device = 16F877
Xtal = 20

Symbol Cuartodebit = 440
Symbol Mediobit = 880
Symbol GIE = INTCON.7          ' Global Interrupt Enable
Symbol INTEDG = OPTION_REG.6   ' Interrupt Edge Select bit
Symbol INTE = INTCON.4         ' RB0/INT External Interrupt Enable bit
Symbol INTF = INTCON.1         ' RB0/INT External Interrupt Flag bit 

Dim Decodifica_rc5 As Word

On_Hardware_Interrupt GoTo Ext_isr

GoTo Main

Ext_isr:
        GoSub FDecodifica_rc5
        PORTA.0 = 1
        INTF = 0
        Context Restore
        
FDecodifica_rc5:
                Dim D0 As Word
                D0 = 0
                Dim D1 As Word
                D1 = 65535
                Dim i As Byte
                If PORTB.0 = 0 Then
                   DelayUS Cuartodebit
                   For i = 0 To 13
                       DelayUS Mediobit
                       D1 = D1 * 2 + PORTB.0
                       DelayUS Mediobit
                       D0 = D0 * 2 + PORTB.0
                   Next i
                   If (D0 ^ D1) = 65535 Then
                      Decodifica_rc5 = (D1 & $3fff)
                   Else
                      Decodifica_rc5 = 0
                   End If
                EndIf
                Return
                
Main:
     TRISB = %00000001
     TRISA = %00000000
     TRISC = %00000000
     PORTA.0 = 0
     GIE = 0
     INTEDG = 0
     INTE = 1
     GIE = 1
     PORTC = 0
     
Loop:
           Dim Dato As Word
           Dato = Decodifica_rc5
           Dato = Dato & $007f
           If Dato = 1 Then PORTC = $01
           If Dato = 2 Then PORTC = $02
           If Dato = 3 Then PORTC = $04
           If Dato = 4 Then PORTC = $08
           If Dato = 12 Then PORTC = $00
           PORTA.0 = 0
           GoTo Loop

Es caso es que no se que es lo que me esta faltando para que funcione, o se si es que estoy implementado mal la interrupción o otra cosa.

Nota: la estructura del programa la saque de la ayuda de Proton IDE
 

Adjuntos

  • Practicas control remoto rc5.rar
    28.5 KB · Visitas: 105
Última edición:
tengo una pregunta para que utilizan exactamente el comando XOR en el primer ejemplo?
es algo asi como para comprobar que se allan tomado bien las muestras de señal osea todo tiene que ser contrarios entre si?
 
Hola a todos he estado trabajando en el código de Moyano y lo he simulado en Proteus y todo ha funcionado de maravillas, pero el codigo en ccs asi como esta no me sirve, necesito pasarlo a Proton IDE para poder implementarlo en otro codigo de un pre-digital.

Mirate estos 2 hilos:

http://www.mikroe.com/forum/viewtopic.php?t=5497

http://www.mikroe.com/forum/viewtopic.php?t=6996

tengo una pregunta para que utilizan exactamente el comando XOR en el primer ejemplo?
es algo asi como para comprobar que se allan tomado bien las muestras de señal osea todo tiene que ser contrarios entre si?

Exacto el comando sirve para detectar muestras erroneas comprobando el contenido de 2 buffers.
 
Hola compañeros. Dejo aquí como utilizar en proton la FUNCION SONYIN:

Esta función viene implementada en la versión 3.5.2.7


Código:
'****************************************************************
'*  Name    : DECSONYIR.BAS                                      *
'*  Author  : Miguel Angel Borbolla Bonomi                      *
'*  Notice  : Copyright (c) 2012 CIBERTLAN                      *
'*          : All Rights Reserved                               *
'*  Date    : 06/03/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

Device = 18F2550 
Xtal = 48 

Declare Sonyin_Pin = PORTB.0  ' se asigna el pin RB0 (pin 21) para recibir datos del receptor Infrarojo
Dim SONYIN_WORD As Word ' Se crea una variavle de "palabra completa" para recibir el tren de datos
' Se hace un ALIAS de el BYTE BAJO que contiene los comandos de la variable SONYIN_WORD
Dim SONY_COMMAND As SONYIN_WORD.LowByte
' Se hace un ALIAS de el Byte ALTO que contiene el tipo de systema de la variable SONYIN_WORD
Dim SONY_SYSTEM As SONYIN_WORD.HighByte

' Se crean alias del puerto B (Pin 22 al 28) con el nombre LEDX respectivamente

Symbol LED1 PORTB.1
Symbol LED2 PORTB.2
Symbol LED3 PORTB.3
Symbol LED4 PORTB.4
Symbol LED5 PORTB.5
Symbol LED6 PORTB.6
Symbol LED7 PORTB.7



All_Digital = On ' se asignas todas las entradas como digitales

While 1 = 1 ' Se crea un Loop Infinito
Repeat
SONYIN_WORD = SonyIn ' Se recive el tren de datos del receptor infrarojo
Until SONY_COMMAND<> 255 ' Se queda repitiendose la recepcion hasta que el byte bajo (comandos) sea diferente a 255

'Se procesa la informacion del comando recibido y se prende el led correspondiente

If SONY_COMMAND=0 Then High LED1
If SONY_COMMAND=1 Then High LED2
If SONY_COMMAND=2 Then High LED3
If SONY_COMMAND=3 Then High LED4
If SONY_COMMAND=4 Then High LED5
If SONY_COMMAND=5 Then High LED6
If SONY_COMMAND=6 Then High LED7

DelayMS 1000  ' espera 1 segundo
PORTB=0       ' Se borra el contenido del puerto B y se repite el Loop para recibir otro dato.
Wend




Reciban Saludos.



Nota.- Por otro lado, en Proton existe la función RC5in que es el protocolo en comento de este post, yo en particular no la he utilizado ya que no cuento con algún transmisor con el protocolo RC5, sin embargo es muy similar al programa que comparto y el circuito seria el mismo, recuerden que este programa sirve para controles SONY o un universal programandolo como si fuera para un televisor SONY. Estas funciones (SONYIN y RC5in vienen implementadas en la versión de proton 3.5.2.7)
 
Última edición por un moderador:
Quiero decirles que a todos lo que quieran decodificar los protocolos IR usando BASIC o similares...van a tener que hacerlo por timer's e interrupciones...por que las rutinas de delay de dichos compiladores no genera tiempos exactos..por lo que les va a resultar muy complejo tratar de portar mi programa de manera directa...

Un saludo !

PD: Si no hagan lo que dice miborbolla:
Estas funciones (SONYIN y RC5in vienen implementadas en la version de proton 3.5.2.7)
 
Hola Moyano, al igual que tu, estoy mudando el código que expones a un AVR, tu código el cual me ha funcionado muy bien en PIC´s no a sido tanto rollo, aunque ando aprendiendo, todavía yo lo estoy mudando a codevision que se me hace un excelente compilador y tengo mis detalles que a bien no entiendo que sucede, la idea es hacer una libreria .H que se pueda incluir en cualquier programa, si lo logro compartiré esta librería y como se usa con todos ustedes.

Saludos
 
cordial saludo, quisiera preguntar,,
este protocolo tambien lo manejan los controles de los radios instalados en los carros?? de marcas como sony pionner jvc kenwwood etc,,
gracias de antemano...
 
cordial saludo, quisiera preguntar,,
este protocolo tambien lo manejan los controles de los radios instalados en los carros?? de marcas como sony pionner jvc kenwwood etc,,
gracias de antemano..

No precisamente, para poder decodificar ese tipo de protocolo, vas a tener que leer este articulo:
http://picmania.garcia-cuervo.net/experimentos_ir.php#RecTramas
http://picmania.garcia-cuervo.net/experimentos_ir.php#DecoProt
http://picmania.garcia-cuervo.net/experimentos_ir.php#ProcCom

Saludos !
 
Agradezco ampliamente el que te hayas tomado la molestia de reponderme, estudiare los enlaces,, crees que por este medio puedas ayudarme con mi proposito, hago pequeños programas en ASM.
lo que intento es con un pic reemplazar el contro de estos radios de carro.
saludos...y gracias.
 
crees que por este medio puedas ayudarme con mi proposito, hago pequeños programas en ASM.
Yo te puedo ayudar con los programas para C. En ASM no lo manejo de manera fluida; ahora para que podamos ayudar, vas a tener que ponerte a investigar como es el protocolo de tu control y ver la forma de poder decodificarlo. Luego te podremos ayudar con dudas puntuales.
Saludos !
 
Hola comapñeros dejo aqui como utilizar en proton la FUNCION SONYIN:

Esta función viene implementada en la version 3.5.2.7


'****************************************************************
'* Name : DECSONYIR.BAS *
'* Author : Miguel Angel Borbolla Bonomi *
'* Notice : Copyright (c) 2012 CIBERTLAN *
'* : All Rights Reserved *
'* Date : 06/03/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************

Device = 18F2550
Xtal = 48

Declare Sonyin_Pin = PORTB.0 ' se asigna el pin RB0 (pin 21) para recibir datos del receptor Infrarojo
Dim SONYIN_WORD As Word ' Se crea una variavle de "palabra completa" para recibir el tren de datos
' Se hace un ALIAS de el BYTE BAJO que contiene los comandos de la variable SONYIN_WORD
Dim SONY_COMMAND As SONYIN_WORD.LowByte
' Se hace un ALIAS de el Byte ALTO que contiene el tipo de systema de la variable SONYIN_WORD
Dim SONY_SYSTEM As SONYIN_WORD.HighByte

' Se crean alias del puerto B (Pin 22 al 28) con el nombre LEDX respectivamente

Symbol LED1 PORTB.1
Symbol LED2 PORTB.2
Symbol LED3 PORTB.3
Symbol LED4 PORTB.4
Symbol LED5 PORTB.5
Symbol LED6 PORTB.6
Symbol LED7 PORTB.7



All_Digital = On ' se asignas todas las entradas como digitales

While 1 = 1 ' Se crea un Loop Infinito
Repeat
SONYIN_WORD = SonyIn ' Se recive el tren de datos del receptor infrarojo
Until SONY_COMMAND<> 255 ' Se queda repitiendose la recepcion hasta que el byte bajo (comandos) sea diferente a 255

'Se procesa la informacion del comando recibido y se prende el led correspondiente

If SONY_COMMAND=0 Then High LED1
If SONY_COMMAND=1 Then High LED2
If SONY_COMMAND=2 Then High LED3
If SONY_COMMAND=3 Then High LED4
If SONY_COMMAND=4 Then High LED5
If SONY_COMMAND=5 Then High LED6
If SONY_COMMAND=6 Then High LED7

DelayMS 1000 ' espera 1 segundo
PORTB=0 ' Se borra el contenido del puerto B y se repite el Loop para recibir otro dato.
Wend




Reciban Saludos



Nota.-Por otro lado, en PRoton existe la función RC5in que es el protocolo en comento de este post, yo en particular no la he utilizado ya que no cuento con algún transmisor con el protocolo RC5, sin embargo es muy similar al programa que comparto y el circuito seria el mismo, recuerden que este programa sirve para controles SONY o un universal programandolo como si fuera para un televisor SONY. Estas funciones (SONYIN y RC5in vienen implementadas en la version de proton 3.5.2.7)



me puedes pasar el diagrama del proyecto la verdad me interesa y me gustaria implementarlo muchas gracias
 
Mi estimado david23: implementarlo es de lo mas simple, sin embargo y a petición tuya dejo anexado un pequeño tutorial que realice para otro foro, pero al ser de mi autoria los comparto por aquí sin mas...espero te sirva

http://www.4shared.com/office/Hu146NmS/decodificador_sony.html

Solo te comento que el programa listado en el archivo pdf tiene una pequeña linea o comando, y que es:

Declare PROTON_START_ADDRESS = $1000

Debes quitarla, ya que en el ejemplo que dejo anexado, esta pensada para usarse con el bootloader de microchip, así que simplemente elimina esta linea y te funcionara de maravilla o puedes usar el ejemplo que deje anexado en este foro y al que haces referencia.....que finalmente es el mismo listado sin la linea en comento. De la misma manera puedes omitir el conector USB que encontraras en el diagrama, ya que en este ejemplo no se utiliza para nada.


Saludos
 

Adjuntos

  • decodificador sony.pdf
    42.8 KB · Visitas: 70
Última edición:
hola a todos se me olvidaba decir que yo también implemente mi propia rutina para decodificar protocolo rc5, esta escrita con el compilador proton ide y solo necesita conectar el receptor de infra-rojos a la patita de interrupción externa del pic:

Código:
'****************************************************************
'*  Name    : Control remoto .BAS                               *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 20-11-2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

Optimiser_Level = 2              ' Activa la optimización de código en Proton IDE
                                 ' 0 = Desactivado ; 1 = pic12f family ; 2 = pic16f family ; 3 = pic18f family
Device = 16F88
Xtal = 10

Symbol INTF   = INTCON.1         ' RB0 External Interrupt Flag
Symbol INTE   = INTCON.4         ' RB0 External Interrupt Enable
Symbol GIE    = INTCON.7         ' Global Interrupt Enable
Symbol INTEDG = OPTION_REG.6     ' Flag = 0 Flanco bajada. Flag = 1 Flanco subida.

Symbol Pausa = 888
Symbol Espacio = 88

On_Interrupt GoTo Interrupcion   ' Interrupción por Hardware (es la más rápida).

GIE    = 1                       ' Activa interrupciones generales.
INTE   = 1                       ' Activa la interrupción externa RB0/INT.
INTEDG = 0                       ' Hace que inicialmente la interrupción se dispare
                                 ' por flanco de bajada.

TRISA = 0                                                                              
TRISB.0 = 1
DelayMS 500 'Espero medio segundo
           
Dim decodifica_rc5 As Word
Dim dato As Byte
 
While 1=1                        ' |------ Programa Principal ------|
   
   GoSub conversion
   If dato = 1 Then
      PORTA = $01
      decodifica_rc5 = 0
      dato = 0
   End If
   If dato = 2 Then
      PORTA = $02
      decodifica_rc5 = 0
      dato = 0
   End If
   If dato = 3 Then
      PORTA = $03
      decodifica_rc5 = 0
      dato = 0
   End If
   If dato = 4 Then
      PORTA = $04
      decodifica_rc5 = 0
      dato = 0
   End If
   If dato = 12 Then
      PORTA = $00
      decodifica_rc5 = 0
      dato = 0
   End If
   

Wend                             ' |--------------------------------|

conversion:
           dato = decodifica_rc5
           dato = dato & $007f
           Return
             
End                              

    
Interrupcion:                 '-------- Decodificador de RC5 --------------
       
    Context Save              ' Salva en contexto de los registros antes de operar con la interrupción.

If INTE = 1 And INTF = 1 Then ' Nos aseguramos que la interrupción sea externa y no otra.

 While PORTB.0 = 0         'Start bits
  decodifica_rc5.13 = 1
  DelayUS (2 * Pausa)
  If PORTB.0 = 0 Then
   decodifica_rc5.12 = 1
   DelayUS Pausa
  End If                   'Toggle bit
  If PORTB.0 = 0 Then
   decodifica_rc5.11 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.11 = 1
  DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then      'MSB direction bit
   decodifica_rc5.10 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.10 = 1
   DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then
   decodifica_rc5.9 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.9 = 1
   DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then
   decodifica_rc5.8 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.8 = 1
   DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then
   decodifica_rc5.7 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.7 = 1
   DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then      'LSB direction bit
   decodifica_rc5.6 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.6 = 1
   DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then      'MSB command Bit
   decodifica_rc5.5 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.5 = 1
   DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then
   decodifica_rc5.4 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.4 = 1
   DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then
   decodifica_rc5.3 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.3 = 1
   DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then
   decodifica_rc5.2 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.2 = 1
   DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then
   decodifica_rc5.1 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.1 = 1
   DelayUS (2 * Pausa)
  End If
  If PORTB.0 = 0 Then      'LSB command Bit
   decodifica_rc5.0 = 0
   DelayUS (2 * Pausa)
  Else
   decodifica_rc5.0 = 1
   DelayUS (2 * Pausa)
  End If
  DelayMS Espacio   
 Wend
     
    INTF = 0                  ' Borra el "flag" de la interrupción RB0/INT
End If
     
                              ' para poder permitir la siguiente interrupción.
    Context Restore           ' Restablece el contexto de los registros tal como estaban antes de la
                              ' interrupción.
 
Atrás
Arriba