desktop

[Aporte] - Librería para leer códigos de controles RF (PICs)

Así es DJ y DR...en mi caso no me resultan útiles o no me doy cuenta como darles utilidad a esas funciones...por ahí buscarle la vuelta con el ejemplo de DJT3...voy a ver si sale algo.
 
Buenas tardes a todos, perdón que no leí antes. Para aclarar las dudas, como bien ya comentaron antes, las nuevas funciones de deshabilitar y habilitar el receptor no necesariamente deben estar implementadas en su código, pero hay veces que es necesario, según la aplicación, ignorar la lectura del receptor por un lapso de tiempo, la razón más obvia es que la ejecución de lectura se hace en un tiempo muy breve para nosotros, por lo que es muy normal que se leea varias veces el código recibido y si se está implementando una aplicación tipo latch entonces en un segundo que apretes el botón del control vas a estar prendiendo/apagando tu dispositivo varias veces en un segundo, para ello se implementa la deshabilitación del receptor (supongamos por 2 segundos) una vez recibida una trama correcta e ignorar las subsiguientes, luego se vuelve a activar para volver a escuchar nuevas tramas. Para aclarar dudas, la deshabilitcion/habilitcion es por software no es por hardware, por lo que en la pata de datos del receptor siguen habiendo datos, solo que el micro no los lee.
Les pongo un pequeño ejemplo de como implementar las nuevas funciones.

C:
// Declaro el microcontrolador que voy a utilizar //

#include <12F683.H> // Directivas del PIC 12F683

// Declaro la palabra de configuración del microcontrolador //

#fuses INTRC_IO,noWdt,noBrownout,noProtect // Intrc_io(no clkout), noWatchDog, noBrownOut, noProtect
#fuses noMclr,noCpd,put,noIeso,noFcmen     // noMasterClear, noEEProtection, put, noIeso, noFcmen

// Configuro el cristal que voy a utilizar //
#use delay(clock=8000000) // Frecuencia de 8MHz interna

// Definiciones de los pines del micro

#define LED_VERDE            PIN_A1 // GP1 como salida de indicación de estado
#define DATOS                   PIN_A2 // GP2 como entrada de datos del control remoto
#define VALOR_TIKTOK     122

#use fast_io(A) // Asignación rápida de los pines del puerto A

// Llamo la libreria del receptor

#include <receptor.c>      // Llamo a la librería

// Variables
unsigned int codigo1[3];    // Vector donde se va a guardar el código 1 del control
unsigned int codigo2[3];    // Vector donde se va a guardar el código 2 del control
unsigned int tiktok = 0;

// Declaro las funciones utilizadas

void inicializacionDispositivo (); // Rutina de inicialicación del dispositivo
boolean compararCodigo(int codigo1[], int codigo2[]);

// Interrupción del timer0
#INT_TIMER0
void temporizador (void)             // Este timer es el encargado de manejar los tiempo del receptor
{
   while (++tiktok>VALOR_TIKTOK){   // Habilito receptor luego de 2 segundos
      tiktok = 0;
      habilitarRX ();
      disable_interrupts (INT_TIMER0);                         // Deshabilito la interrupción por timer 0
   }
}

void main (void){
   inicializacionDispositivo();
   configurarRx();
   for(;;){
      if(obtenerCodigo(&codigo1[0],&codigo1[1],&codigo1[2])){
         obtenerCodigo(&codigo2[0],&codigo2[1],&codigo2[2]);
         if(compararCodigo(codigo1,codigo2)){
            output_high (LED_VERDE);
            deshabilitarRX();
            clear_interrupt (INT_TIMER0);                                     // Borro la bandera de la interrupción del timer 0
            enable_interrupts (INT_TIMER0);                                   // Habilito la interrupción por timer 0
         }
      }
      else{
         if (tiktok == 0)
            output_low (LED_VERDE);
      }
   }
}

void inicializacionDispositivo(void)  // Rutina de inicialicación del dispositivo
{
   set_tris_a (0b00001101);                     // Pines como entrada: A0,A2,A3 - Pines como salida: A1,A4,A5
   output_a (0);                                // Borro las salidas del puerto A
   setup_timer_0 (T0_DIV_128);                  // Seteo el timer 0 para interrupciones cada 16,384 mseg
   enable_interrupts (GLOBAL);                  // Habilito las interrupciones globales
}

boolean compararCodigo (int codigo1[], int codigo2[]){
   if(codigo1[0] != codigo2[0]) return false;
   if(codigo1[1] != codigo2[1]) return false;
   if(codigo1[2] != codigo2[2]) return false;
   return true;
}

Este código hace lo siguiente, cuando inicia, el led se encuentra apagado hasta que recibe un código válido (cualquiera), ahí prende el led y deshabilita el receptor por 2 segundos y durante ese tiempo el led permanece prendido, luego se vuelve a habilitar el receptor y el led se apaga.
 
Última edición:
Buenísimo JUANMA...Yo había hecho algo asi, pero en lugar de esperar un tiempo, armé un contador de códigos válidos, si estos eran entre 1 y 3, hacía algo, si eran más de 3 lo contrario, pero solo para probar si servía. Como trabajo con un XTAL de 4MHZ, teniendo el pulsador apretado, le toma como segundo y medio interpretar un ON/OFF, así que no era un problema.

Después, como lo uso para controlar luces que no tengo a la vista, como para verificar si se encienden o no, decidí usar una trama para ON y otra para OFF, y entonces estoy seguro de que estoy PRENDIENDO o APAGANDO las luces, aún cuando no las vea, jaja...Me compré un control por ML que tiene 12 botones, así que tengo para 6 canales y anda "joya"...Por ahí hay otra manera de hacerlo, pero no me puse a pensar mucho sobre el tema, con el control de 12 botones me sobra, y lo mejor que tiene un alcance de + 250mts. que probé cuando saqué a pasear a RINGO (my dog)...Ahora estuve viendo que venden unos programables, que hacen varias funciones, latch, ON/OFF, repeticiones, y no se que cosas más, intentaré emular esos códigos a partir de tu librería.

NOTA: lo probé con unos viejos timbres inalámbricos que tienen enconder LP801B, recontra CHINO, si buscan la hoja de datos, tienen que ir a preguntarle al chino de la esquina que dice...El dato importante es que funciona con esta librería...!!!
 
Buenísimo JUANMA...Yo había hecho algo asi, pero en lugar de esperar un tiempo, armé un contador de códigos válidos, si estos eran entre 1 y 3, hacía algo, si eran más de 3 lo contrario, pero solo para probar si servía. Como trabajo con un XTAL de 4MHZ, teniendo el pulsador apretado, le toma como segundo y medio interpretar un ON/OFF, así que no era un problema.

Después, como lo uso para controlar luces que no tengo a la vista, como para verificar si se encienden o no, decidí usar una trama para ON y otra para OFF, y entonces estoy seguro de que estoy PRENDIENDO o APAGANDO las luces, aún cuando no las vea, jaja...Me compré un control por ML que tiene 12 botones, así que tengo para 6 canales y anda "joya"...Por ahí hay otra manera de hacerlo, pero no me puse a pensar mucho sobre el tema, con el control de 12 botones me sobra, y lo mejor que tiene un alcance de + 250mts. que probé cuando saqué a pasear a RINGO (my dog)...Ahora estuve viendo que venden unos programables, que hacen varias funciones, latch, ON/OFF, repeticiones, y no se que cosas más, intentaré emular esos códigos a partir de tu librería.

NOTA: lo probé con unos viejos timbres inalámbricos que tienen enconder LP801B, recontra CHINO, si buscan la hoja de datos, tienen que ir a preguntarle al chino de la esquina que dice...El dato importante es que funciona con esta librería...!!!
Les comparto el siguiente LINK donde muestro un receptor de 2 canales que realice utilizando dicha librería, utilizando un PIC 12F683 trabajando a 8MHz de reloj interno sin cristal, no les puedo compartir el código fuente de dicho receptor dado que los comercializo, pero para que tengan una idea de las cosas que se pueden hacer.
 
Siiiiii, eso es lo que ví que hacen, así que parece que otros te copiaron la idea, o todos venden tus artículos, jaja...para no volverme loco voy a intentar el modo seguidor nomás, el que prende y apaga sólo después de un tiempo...para el resto me compro uno ya programado, no creo que viva tantos años hasta lograr eso, jaja.
 
Si, si podés leer la parte fija de la trama tiene que funcionar...no sabía que tenían una parte fija, jaja, por eso ni los probé, pero siendo así, podría intentar con los controles de los autos.
Sí, el HCS KeeLoq tiene 32 bits fijos y 32bits Rolling-Code, KeeLoq, Dinámico... Etcétera (le llaman de varias maneras)

Por ejemplo:
Trama completa de un mando

2BE19C8A0825D226
2: es el número de pulsador
BE19C8A: es el número fijo
0825D226: es el Rolling-Code
 
Les comparto el siguiente LINK donde muestro un receptor de 2 canales que realice utilizando dicha librería, utilizando un PIC 12F683 trabajando a 8MHz de reloj interno sin cristal, no les puedo compartir el código fuente de dicho receptor dado que los comercializo, pero para que tengan una idea de las cosas que se pueden hacer.
Hola Juanma, tengo un código para recibir la trama de un mando HCS200, HCS201, HCS300, HCS301... uno para la parte fija y otro para la parte Rolling-Code (KeeLoq).
En asm y en C
Comparto código y, de paso me ayudas en unas mejoras del programa.
 
Atrás
Arriba