Sistema RF con pic, se apaga solo

Buenas estimados.

No estoy seguro que pensar, estoy creando un sistema con 3 antenas, una emisora, la otra repetidora, y finalmente la receptora.

Las 3 antenas están creadas con el siguiente hardware:

pic16f628A
PIC-IO Tarjeta de desarrollo para Microcontroladores PIC de 18 P (de olimex)
y la antena: Módulo Transmisor/Receptor RF 433Mhz (500Mts) HAC-UM96

La primera, al hacerle un contacto seco envía un string, y al parecer funciona sin problemas.
La segunda y tercera antena son las que me dan dolor de cabeza.

Estas dos antenas al conectarle energía, hay veces que funcionan bien, y otras que no funcionan, hasta desconectarles la fuente de poder un par de veces.
Y también muchas veces luego de un par de horas funcionando bien, o aveces minutos en el caso de la receptora, deja de funcionar.

Ideas de lo que puede estar pasando por-favor ?. Es un tema de hardware, de código o que ?

Adjuntare el código de la receptora, los otros dos códigos son bastante parecidos.

Saludos.

Código:
#include<16f628a.h>
#include<string.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES PUT                      //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //No brownout reset
#FUSES NOCPD                    //No EE protection
#FUSES HS                       
#use standard_io(A)             
#use standard_io(B)
#use delay(clock=20000000)
#use rs232(baud=9600, parity=N, xmit=PIN_B2, rcv=PIN_B1, stream=a)
#byte portb=0x06
#byte rcsta=0x18
#byte rcreg=0x1A
#bit RCSTA_OERR=rcsta.1
#bit RCSTA_CREN=rcsta.4
#bit RCSTA_FERR=rcsta.2

#byte TRISA=0x85
#byte TRISB=0x86
#byte RCSTA=0X1A
//Funciones-------

void datos(void);
void clear_rda(void);
//----------------

#define bot_f4   pin_a4                             //reles y contactos de la placa PIC-IO Tarjeta de desarrollo para Microcontroladores PIC de 18 P
#define bot_f2   pin_b0
#define rele_1   pin_a0
#define rele_2   pin_a1
#define rele_3   pin_a2
#define rele_4   pin_a3

char received=0;
char dato[15];
int cta_recibido;

int i=0;
unsigned int16 seconds = 0;

#INT_RTCC                                    
clock_isr()                                  //Interrupcion del timer0 pensando en enviar un mensaje constante de buen funcionamiento de la placa
{                                
  set_timer0(19531);
  ++seconds;
  if(seconds==700)
  {
    //printf("RCV-RKG\r");                   //Al ver lo facil que se montan las señales, se decide dejar esta instruccion en silencio
    seconds=0;
  }   
                                           
}


#int_rda
void rda(void)                                           //Interrupcion para captar y almacenar los caracteres recibidos por puerto serial
{   
  received=fgetc();
  dato[cta_recibido]=received;
  cta_recibido++;
  if(received==0xD)
  {
  cta_recibido=0;
  }
 
}
void main(void)
{
      delay_ms(1000);
   printf("RCV-RKG\r");
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256 );
   set_timer0(19531);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   
   TRISA=0b11110000;
   TRISB=0b11010011;   
   enable_interrupts(GLOBAL); 
   enable_interrupts(int_rda);
   enable_interrupts(int_rda);
   delay_ms(500);
   //enable_interrupts(int_rda);
   output_bit(rele_1,0);
   output_bit(rele_2,0);
   output_bit(rele_3,0);
   output_bit(rele_4,0);
   clear_rda();
   
   
   
          //while(received=!0x00)
          while(1)                             //Al recibir datos por el puerto serial
        {
              if(dato[0]=='S'&&dato[1]=='U'&&dato[2]=='M'&&dato[3]=='A'&&dato[4]=='R'&&dato[5]=='_'&&dato[6]=='R'&&dato[7]=='P'&&dato[8]=='T')
               {
                  //printf("SUMAR_RPT_OK\r"); 
                  output_bit(rele_1,1);                    //Se activa el rele
                  delay_MS (1000);
                  output_bit(rele_1,0);
                  for(i=0; i<9; i++)                        //Se limpia string
                  dato[i]=0x00;
                  cta_recibido=0;
                  clear_rda();
               }
            if(dato[0]=='R'&&dato[1]=='E'&&dato[2]=='S'&&dato[3]=='T'&&dato[4]=='A'&&dato[5]=='R'&&dato[6]=='_'&&dato[7]=='R'&&dato[8]=='P'&&dato[9]=='T')
               {
                  //printf("RESTAR_RPT_OK\r"); 
                  output_bit(rele_4,1);                       //Se activa rele
                  delay_MS (1000);
                  output_bit(rele_4,0);
                  for(i=0; i<9; i++)                          //Se limpia string
                  dato[i]=0x00; 
                  cta_recibido=0;
                  clear_rda();
               }
            enable_interrupts(int_rda);
            delay_ms(500);
            RCSTA=0b10010000;
            //reset_cpu();
            }           

}
void clear_rda(void)
{

   int dummy;
      if(RCSTA_OERR==1)
      {
       RCSTA_CREN = 0;
         RCSTA_CREN = 1;
      }
      if(RCSTA_FERR==1)
      {
       dummy = RCREG;
        dummy = RCREG;
      }
}
 
Última edición:
No veo que estés desactivando los comparadores análogos del puerto A
Agrega setup_comparator(NC_NC_NC_NC); en el void main, y verifica si te funciona.

Suerte.
 
Atrás
Arriba