Bueno antes que nada hola a todos !! 
En esta ocación les traigo un proyecto que realizé esta tarde como respuesta a un proyecto más grande que tengo en mente...
Se trata de la decodificación del código RC5 de philips. Este código es el más usado en la actualidad por los experimentadores y desarrolladores debido a que es el más difundido y es ya un standar dentro de la industria.
Veamos algunas de sus características:
- Dirección de 5 bits y comando de 6 bits (7 bits de comando para RC-5X)
- Codificación de doble fase o bi-fase (Bi-phase, también llamada código Manchester)
- Frecuencia de portadora de 36 kHz
- Tiempo de bit constante de 1,778 ms (64 ciclos de 36 kHz)
Módulación:
El protocolo está basado en una modulación Manchester de doble fase sobre una portadora de 36 kHz. En esta codificación, todos los bits tienen la misma longitud, de 1,778 ms. La mitad del bit es un tren de pulsos de la portadora de 36 kHz, y en la otra mitad la señal está plana.
El cero lógico es representado por un tren de pulsos en la primera mitad del tiempo que corresponde el bit. El uno lógico es representado por un tren de pulsos en la segunda mitad de este tiempo. La relación entre pulso y pausa en la portadora de 36 kHz es de 1/3 o 1/4, lo que reduce el consumo de energía.
Veamos en un gráfico lo anteriormente dicho:
Protocolo:
Bueno este es un tren de pulsos correspondientes a un trama RC5. Como vemos son 14 bits en total de los cuales tenemos 2 bits de start + 1 de togle. Antes de que empieze la trama transcurre medio bit antes de que el receptor pueda detectarla. Luego de los bits de start comienza el bit de togle , este bit cambia de estado cada vez que nosotros presionamos un botón en el control remoto y soltamos la tecla. Su función es detectar cuando presionamos continuamente una tecla o cuando la presionamos varias veces de forma alternada.
Luego de este bit comienza el bit más significativo de la dirección del comando y se extiende 5 bits. A continuación comienza el bit más significativo del comando que se extiende 6 bits.
Haciendo la sumatoria nos dá : 2 bits de start + bit togle + 5 bits de dirección + 6 bits de datos = 14 bits que conforman una trama con una duración total de la trama de 25ms.
Mientras se mantenga presionada la tecla, el mensaje se repite cada 114 ms. El bit de conmutación mantendrá el mismo nivel lógico durante la repetición de un mensaje. Esto se hace así para que el programa de interpretación del receptor pueda detectar esta autorrepetición y no la confunda con sucesivas pulsaciones de una tecla.
Comandos predefinidos:
Acá se muestran algunos comandos predifinidos en la mayoría de los controles remotos.
Ya teniendo explicado esto podemos pasar a desarrollar un programa de control básico para usar en nuestros proyectos de control.
Para mis prácticas yo usé el siguiente control remoto pero pueden usar cualquiera que cumpla con la norma RC5:
En el siguiente video les muestro la aplicación básica implementada en un PIC16F88 y un sensor IRM8601.
El código fuente del programa es el siguiente:
Y el código del expansor de salidas con 74HC595:
En esta ocación les traigo un proyecto que realizé esta tarde como respuesta a un proyecto más grande que tengo en mente...
Se trata de la decodificación del código RC5 de philips. Este código es el más usado en la actualidad por los experimentadores y desarrolladores debido a que es el más difundido y es ya un standar dentro de la industria.
Veamos algunas de sus características:
- Dirección de 5 bits y comando de 6 bits (7 bits de comando para RC-5X)
- Codificación de doble fase o bi-fase (Bi-phase, también llamada código Manchester)
- Frecuencia de portadora de 36 kHz
- Tiempo de bit constante de 1,778 ms (64 ciclos de 36 kHz)
Módulación:
El protocolo está basado en una modulación Manchester de doble fase sobre una portadora de 36 kHz. En esta codificación, todos los bits tienen la misma longitud, de 1,778 ms. La mitad del bit es un tren de pulsos de la portadora de 36 kHz, y en la otra mitad la señal está plana.
El cero lógico es representado por un tren de pulsos en la primera mitad del tiempo que corresponde el bit. El uno lógico es representado por un tren de pulsos en la segunda mitad de este tiempo. La relación entre pulso y pausa en la portadora de 36 kHz es de 1/3 o 1/4, lo que reduce el consumo de energía.
Veamos en un gráfico lo anteriormente dicho:

Protocolo:

Bueno este es un tren de pulsos correspondientes a un trama RC5. Como vemos son 14 bits en total de los cuales tenemos 2 bits de start + 1 de togle. Antes de que empieze la trama transcurre medio bit antes de que el receptor pueda detectarla. Luego de los bits de start comienza el bit de togle , este bit cambia de estado cada vez que nosotros presionamos un botón en el control remoto y soltamos la tecla. Su función es detectar cuando presionamos continuamente una tecla o cuando la presionamos varias veces de forma alternada.
Luego de este bit comienza el bit más significativo de la dirección del comando y se extiende 5 bits. A continuación comienza el bit más significativo del comando que se extiende 6 bits.
Haciendo la sumatoria nos dá : 2 bits de start + bit togle + 5 bits de dirección + 6 bits de datos = 14 bits que conforman una trama con una duración total de la trama de 25ms.
Mientras se mantenga presionada la tecla, el mensaje se repite cada 114 ms. El bit de conmutación mantendrá el mismo nivel lógico durante la repetición de un mensaje. Esto se hace así para que el programa de interpretación del receptor pueda detectar esta autorrepetición y no la confunda con sucesivas pulsaciones de una tecla.
Comandos predefinidos:
Acá se muestran algunos comandos predifinidos en la mayoría de los controles remotos.

Ya teniendo explicado esto podemos pasar a desarrollar un programa de control básico para usar en nuestros proyectos de control.
Para mis prácticas yo usé el siguiente control remoto pero pueden usar cualquiera que cumpla con la norma RC5:

En el siguiente video les muestro la aplicación básica implementada en un PIC16F88 y un sensor IRM8601.
El código fuente del programa es el siguiente:
Código:
// Programa que recibe tramas RC5 del sensor IRM8601 - S las decodifica
// y muestra el comando y la dirección por un display LCD 2 x 16.
// El microcontrolador utilizado es un PIC16F88.
// Programador: Moyano Jonathan.
// Año: 2010.
#include <16f88.h> // Definiciones de registros internos del micro.
#fuses HS,NOWDT,NOPROTECT,PUT // Fuses del programador.
#use delay (clock=20000000) // Utilizamos un cristal de 20Mhz.
#use fast_io(b)
// Definiciones de hardware.
#define IR_RECEPTOR PIN_B0 // Pin donde estará conectado el receptor IR.
#define INDICADOR_TRAMA_RECIBIDA PIN_B1 // Led que indica cuando se recibe una trama RC5.
// Constantes del programa.
const int16 cuartodebit=440; // tiempo [µs] de 1/4 bit
const int16 mediobit=880; // tiempo [µs] de 1/2 bit
// Librerías de hardware externo:
#include <74HC595.c> // Expansor de 8 salidas.
int16 decodifica_RC5(); // Declaramos la variable.
// Interrupción por RB0 en la que recibimos los datos del sensor.
#int_EXT
EXT_isr() {
decodifica_RC5(); // Llama a la función de decodificación de trama de datos RC5.
output_high(INDICADOR_TRAMA_RECIBIDA);
}
// Función de decodificación de RC5:
int16 decodifica_RC5()
{
int16 D0=0, D1=65535; // Variables que contienen los datos.
int i; // Auxiliar.
while (input(IR_RECEPTOR)); // Espera la transición 1 a 0 para empezar e leer.
delay_us(cuartodebit); // Espera el bit de start de 440uS.
for(i=0;i<13;i++) // Recoje los 13 bits de datos y los guarda...
{
delay_us(mediobit); // espera el tiempo de medio bit 880uS.
D1=D1*2+input(IR_RECEPTOR); // lee los datos...
delay_us(mediobit); // espera el tiempo de medio bit 880uS.
D0=D0*2+input(IR_RECEPTOR); // lee los datos pero invertidos...
}
if ((D0^D1)==65535) return (D1 & 0x3FFF); else return (0);
// Acá chequea que el valor que devuelva la función OR_EXCLUSIVA entre
// D1 (código original) ^ D0 (código invertido) sea igual a 3FFF (por ser
// valores coindidentes pero invertidos) ...si ese es el caso entonces devuelve
// el valor de D1 ( datos originales ) para ser procesados...caso contrario retorna
// 0.
}
void main() {
set_tris_b(0x01); // RB0 como entrada , las demás como salidas.
output_low(INDICADOR_TRAMA_RECIBIDA); // Limpiamos el indicador de trama recibida.
enable_interrupts(int_ext); // Habilitamos la interrupción externa por RB0.
ext_int_edge(H_TO_L); // Activa la interrupción por flanco de bajada.
enable_interrupts(global); // Habilitamos las interrupciones globales.
output_74HC595(0x00); // Limpiamos las salidas.
while(1) // Bucle infinito.
{
long data;
data=decodifica_RC5(); // Leemos los datos RC5.
data=data & 0x007F; // Limpiamos los bits de start y el de togle.
// Determinamos cual es el comando recibido y actuamos en consecuencia.
if (data==1) output_74HC595(0x01);
if (data==2) output_74HC595(0x02);
if (data==3) output_74HC595(0x04);
if (data==4) output_74HC595(0x08);
if (data==5) output_74HC595(0x10);
if (data==6) output_74HC595(0x20);
if (data==7) output_74HC595(0x40);
if (data==8) output_74HC595(0x80);
if (data==12)
{
output_74HC595(0x00); // Limpiamos las salidas.
}
output_low(INDICADOR_TRAMA_RECIBIDA); // Limpiamos el indicador de trama recibida.
}
}
Código:
// Librería de control para el expansor de 8 salidas con 74HC595.
// Programador: Moyano Jonathan
// Versión: 1.0
// Fecha: 10/08/10
// Funciones:
// output_74HC595(valor); Muestra un valor de 0 a 255 en el puerto.
// Pines intercambiables según necesidades del usuario.
#define relog PIN_A3
#define datos PIN_A4
#define enable PIN_A2
void output_74HC595(int valor); // Definimos la función.
void output_74HC595(int valor) {
int contador; // Contador para escribir los datos al registro de desplazamiento.
output_low(relog);
output_low(enable);
output_low(datos);
for(contador=0;contador!=8;contador++) {
output_bit(datos,bit_test(valor,contador));
output_high(relog);
delay_cycles(1);
output_low(relog);
}
output_high(enable);
output_low(enable);
delay_ms(1);
}
Adjuntos
Última edición: