TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: frankcr en 09 de Septiembre de 2010, 17:31:58

Título: Problemas para recibir datos por RS-232
Publicado por: frankcr en 09 de Septiembre de 2010, 17:31:58
Hola a todos tengo un problema con la recepcion de datos del PIC 18LF4550, pues si envia bien los datos pero cuando envio un caracter de la PC al PIC creo que no se activa la interrpcion RDA, pero no se porque no se activa..... Además el compilador me tira este warning

 Interrupts disabled during call to prevent re-entrancy:  (@PSTRINGC_159)

Este  es mi codigo y lo he cambiado varias veces con el mismo resultado:



#use rs232(baud=9600, parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=BT) //manejo del RS232

void recepcion_serial(void);
static char string [5];
int1 kbhit_rs232=1; // Para saber si llego dato desde la PC

#int_RDA
void RDA_isr(void)
{
   disable_interrupts(GLOBAL);
   recepcion_serial();
   enable_interrupts(GLOBAL);
}
   
void recepcion_serial(){

   string = fgetc(BT);

   if (string == 0x61){ //si es una "a"
   
      OUTPUT_HIGH(PIN_D1);
      printf("\n\rPassword correcto ");
      kbhit_rs232=0;
      
      }
   else {

      printf("\n\rError intente de nuevo ");
      kbhit_rs232=1;

      }

}

void main(void){

      setup_psp(PSP_DISABLED);
      setup_wdt(WDT_OFF);
      setup_timer_0(RTCC_INTERNAL);
      setup_timer_1(T1_DISABLED);
      setup_timer_2(T2_DISABLED,0,1);
      setup_timer_3(T3_INTERNAL|T3_DIV_BY_8);
      setup_comparator(NC_NC_NC_NC);
      setup_vref(FALSE);
      setup_oscillator(OSC_8MHZ|OSC_TIMER1|OSC_31250|OSC_PLL_OFF);  
      setup_adc_ports(AN0_TO_AN3|VSS_VDD);
      setup_adc(ADC_CLOCK_INTERNAL);
      set_timer3(2450);
      
      enable_interrupts(GLOBAL);
      enable_interrupts(INT_RDA);
   

while(kbhit_rs232){
   delay_ms(5000);
   printf("\n\rPassword: ");
      
   }
}
Título: Re: Problemas para recibir datos por RS-232
Publicado por: MLO__ en 10 de Septiembre de 2010, 17:52:54
Hola.

La función printf() toma mucho tiempo, así que no es bueno que este dentro de la rutina de interrupción. Prueba usar un flag de aviso y usar la función en el programa principal.

Saludos