Autor Tema: Codigo NEC HX1838B + PIC16F876A  (Leído 1767 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado mimison3012

  • PIC10
  • *
  • Mensajes: 11
Codigo NEC HX1838B + PIC16F876A
« en: 29 de Noviembre de 2014, 20:14:57 »
Buenas tardes compañeros, en esta oportunidad estoy implementando un sistema para poder activar o desactivar cargas mediante control remoto; para ello estoy usando un PIC16F873A
y un hx1838b para que me recepcione los códigos y compare con la programación del pic y me active las diferentes cargas que tengo. PEro tengo un problema, el cual es que mi pic se comunica con la pc para decodificar los codigos y saber que codigo se ha pulsado, y poder comparar y activar la carga correspondiente a cada botin, el problema se presenta cuando con mi control remoto envio un comando pero el pic no lo lee y simplemente lo pasa como si fuera un codigo errado y no me permite ver el codigo del lo pulsado. Necesito que me apoyen para ver que estoy haciendo mal. Les dejo mi codigo para que lo revisen. Por sea hay rutinas que puse a manera de breakpoint para saber si enra o no en una rutina y guiarme hasta donde llega el programa. Gracias por su apoyo.

#include "D:\Proyectos con PIC16F873A\RECEPTOR NEC\main.h"


// Estados del autómata
#define IR_RESET    0
#define IR_INHIBIDO 127
#define IR_COMPLETO 32

// T0 = 1125us =  562 tics de TMR1
// T1 = 2250us = 1125 tics de TMR1
// Media = (T0+T1)/2 = 1687us = 843 tics de TMR1
// MAX y MIN son límites arbitrarios para detección de errores.
// AVERA es la media.
//
// Si MIN_T < lapso < AVERA   =>  0
// Si AVERA < lapso < MAX_T   =>  1
// En otro caso: error.
#define IR_MIN_T 400
#define IR_MAX_T 1500
#define IR_AVERA 843

unsigned char IR_Estado = IR_RESET;
unsigned int32 IR_comando;
unsigned int16 lapso;
short last_port_IR = 0;

#int_TIMER1
void  TIMER1_isr(void)
{
   // No borrará un comando que se haya recibido bien
   if (IR_Estado != IR_INHIBIDO && IR_Estado != IR_COMPLETO) {
      IR_Estado = IR_RESET;
      IR_comando = 0;
   }
}

#int_EXT
void  EXT_isr(void)
{
   short port_IR; // Estado del pin receptor IR

   // No usar input_a() aqui porque cambia a lectura
   // todos los pines del puerto.
   port_IR = input(PIN_B0);

   output_HIGH(Pin_a0);
   delay_ms(100);
   output_low(pin_A0);
   /* La interruptción la ha generado el modulo IR */
   // La Transición debe ser hacia 0, si es hacia 1 no hacemos nada
   if (last_port_IR && !port_IR && (IR_Estado != IR_INHIBIDO)){
     
      lapso = get_timer1();

      if (lapso > IR_MAX_T || lapso < IR_MIN_T) {
         // ERROR o inicialización
         IR_Estado = IR_RESET;
         IR_comando = 0;
      }
      else if   (lapso < IR_AVERA) {
         // Es un 0
         IR_comando <<= 1;
         bit_clear(IR_comando,0); // opcional
         IR_Estado++;
      }
      else if (lapso > IR_AVERA) {
         // Es un 1
         IR_comando <<= 1;
         bit_set(IR_comando,0); // opcional
         IR_Estado++;
      }   
      set_timer1(0);
   }

      last_port_IR = port_IR;
   clear_interrupt(INT_EXT);

   output_HIGH(Pin_a1);
   delay_ms(100);
   output_low(pin_A1);

}

////////////////// M A I N //////////////////////////////////////////////////////////

void main()
{
   /****************** INICIALIZAR **********************/

   IR_Estado = IR_RESET;
   
   // Deshabilitamos periféricos
   port_b_pullups(FALSE);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_ccp1(CCP_OFF);
   
   // Timer 1 controla el receptor IR.
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);


   enable_interrupts(GLOBAL);
   enable_interrupts(INT_TIMER1);    // reset estado IR
   enable_interrupts(INT_EXT);      // RX pulso IR
   ext_int_edge(H_TO_L);
   
   printf ("-- Preparado para recibir --\n");
   /****************** BUCLE PRINCIPAL **********************/
   while(true){
   

      if (IR_Estado == IR_COMPLETO) {
         /* Se han recibido 32 bits de comando IR */
         IR_Estado = IR_INHIBIDO;
         printf("Comando recibido: %LX\n", IR_comando);
         output_high(PIN_A2);
         delay_ms(100);
         output_Low(PIN_A2);
         /* Reseteamos la máquina de estados */
         IR_comando = 0;
         IR_Estado = IR_RESET;
      }

   }
}



 

anything