Advertisement
Electgpl

PIC - Decodificador RC5

Jun 19th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.59 KB | None | 0 0
  1. // Programa que recibe tramas RC5 del sensor IRM8601 - S las decodifica
  2. // y muestra el comando y la direcci󮠰or un display LCD 2 x 16.
  3.  
  4. #include <16f88.h>                              // Definiciones de registros internos del micro.    
  5. #fuses HS,NOWDT,NOPROTECT,PUT                   // Fuses del programador.
  6. #use delay (clock=20000000)                     // Utilizamos un cristal de 20Mhz.
  7. #use fast_io(b)
  8.  
  9. // Definiciones de hardware.
  10. #define IR_RECEPTOR PIN_B0                      // Pin donde estarᠣonectado el receptor IR.
  11. #define INDICADOR_TRAMA_RECIBIDA PIN_B1         // Led que indica cuando se recibe una trama RC5.
  12.  
  13. // Constantes del programa.
  14. const int16    cuartodebit=440;                 // tiempo de 1/4 bit
  15. const int16    mediobit=880;                    // tiempo de 1/2 bit
  16.  
  17. // Librer� de hardware externo:
  18. #include <74HC595.c>                            // Expansor de 8 salidas.
  19. int16 decodifica_RC5();                         // Declaramos la variable.
  20.                                
  21. #int_EXT                                        // Interrupci󮠰or RB0 en la que recibimos los datos del sensor.
  22. EXT_isr() {
  23.   decodifica_RC5();                             // Llama a la funci󮠤e decodificaci󮠤e trama de datos RC5.
  24.   output_high(INDICADOR_TRAMA_RECIBIDA);
  25. }
  26. // Funcion decodificacion RC5:
  27. int16 decodifica_RC5()
  28. {
  29.    int16 D0=0, D1=65535;                        // Variables que contienen los datos.
  30.    int i;                                       // Auxiliar.
  31.       while (input(IR_RECEPTOR));               // Espera la transici󮠱 a 0 para empezar e leer.  
  32.       delay_us(cuartodebit);                    // Espera el bit de start de 440uS.  
  33.       for(i=0;i<13;i++){                        // Recoje los 13 bits de datos y los guarda...
  34.          delay_us(mediobit);                    // espera el tiempo de medio bit 880uS.
  35.          D1=D1*2+input(IR_RECEPTOR);            // lee los datos...
  36.          delay_us(mediobit);                    // espera el tiempo de medio bit 880uS.
  37.          D0=D0*2+input(IR_RECEPTOR);            // lee los datos pero invertidos...        
  38.       }
  39.       if ((D0^D1)==65535) return (D1 & 0x3FFF); else return (0);
  40.                                                 // Acᠣhequea que el valor que devuelva la funci󮠏R_EXCLUSIVA entre
  41.                                                 // D1 (c󤩧o original) ^ D0 (c󤩧o invertido) sea igual a 3FFF (por ser
  42.                                                 // valores coindidentes pero invertidos) ...si ese es el caso entonces devuelve
  43.                                                 // el valor de D1 ( datos originales ) para ser procesados...caso contrario retorna 0.
  44. }
  45. void main() {
  46.    set_tris_b(0x01);                            // RB0 como entrada , las dem᳠como salidas.
  47.    output_low(INDICADOR_TRAMA_RECIBIDA);        // Limpiamos el indicador de trama recibida.
  48.    enable_interrupts(int_ext);                  // Habilitamos la interrupci󮠥xterna por RB0.
  49.    ext_int_edge(H_TO_L);                        // Activa la interrupci󮠰or flanco de bajada.
  50.    enable_interrupts(global);                   // Habilitamos las interrupciones globales.
  51.    output_74HC595(0x00);                        // Limpiamos las salidas.
  52.    while(1){
  53.       long data;
  54.       data=decodifica_RC5();                    // Leemos los datos RC5.
  55.       data=data & 0x007F;                       // Limpiamos los bits de start y el de togle.
  56.                                                 // Determinamos cual es el comando recibido y actuamos en consecuencia.
  57.       if (data==1) output_74HC595(0x01);
  58.       if (data==2) output_74HC595(0x02);
  59.       if (data==3) output_74HC595(0x04);
  60.       if (data==4) output_74HC595(0x08);
  61.       if (data==5) output_74HC595(0x10);
  62.       if (data==6) output_74HC595(0x20);
  63.       if (data==7) output_74HC595(0x40);
  64.       if (data==8) output_74HC595(0x80);
  65.       if (data==12)                
  66.       {
  67.        output_74HC595(0x00);                    // Limpiamos las salidas.        
  68.       }
  69.        output_low(INDICADOR_TRAMA_RECIBIDA);    // Limpiamos el indicador de trama recibida.
  70.    }
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement