Autor Tema: Ayuda urgente!! problema con la interrupcion RDA!!!  (Leído 1485 veces)

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

Desconectado marisela

  • PIC10
  • *
  • Mensajes: 5
Ayuda urgente!! problema con la interrupcion RDA!!!
« en: 29 de Junio de 2006, 16:09:49 »
hola a todos tengo un problemita con el manejo de interrupciones no se si es que no se usarlas, estoy recibiendo una cadena de caracteres con la interrupcion RDA, recibo perfectamente la primera vez y ha veces la segunda pero luego no osea desabilito y cuando vuelvo habialitar para recibir la siguiente palabra no lo hace!! aqui les envio el programa ojala me puedan ayudar. gracias de antemano.... :(

#include <18F4620.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,WDT128,XT, NOPROTECT, IESO, BROWNOUT, BORV21, NOPUT, NOCPD, NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOEBTR, NOCPB, NOEBTRB, NOWRTC, NOWRTB, NOFCMEN, NOXINST, NOPBADEN, NOLPT1OSC, NOMCLR
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#define RX_BUFFER_SIZE  4                       //el índice del buffer

 int RXdataIndex;
int RXbuffer[RX_BUFFER_SIZE] = {0,0,0,0};   //el buffer incializado en 0
 int checkCommFlag;

//------------------------------------------------------------------------------
//Funcion de recibir cadena de caracteres y el timer
//------------------------------------------------------------------------------
#int_RDA
void RDA_isr()
{
   RXbuffer[RXdataIndex] = getc();
   RXdataIndex++;

   if(RXdataIndex == RX_BUFFER_SIZE)
   {

         disable_interrupts(INT_RDA);
         checkCommFlag = 1;
       
   }
}

//------------------------------------------------------------------------------
//Funcion para activar el led correspondiente a la señal y el motor.
//------------------------------------------------------------------------------

int activar (unsigned int8 RXbuffer[])
{
   if (RXbuffer[0]=='m' && RXbuffer[1]=='o' && RXbuffer[2]=='d')
      {
       switch(RXbuffer[3])                      // depende de la señal detectada
       {
         case 'a':                                   // modulo a

            while(!input(PIN_B1))
               {
                  output_a(0x3e);               //prende el motor y el led
                  output_c(0x01);
               };
               delay_ms(100);

             if (input(PIN_B1)==1)              // interruptor de apagado
               {

                  output_a(0x3f);               // apago led y motor
     output_c(0x00);
        puts("apagar");               // envio señal ha detector
                  delay_ms(600);                //para que se apague
               }
           break;

        case 'b':                               // modulo b

           while(!input(PIN_B1))
               {
                  output_a(0x3d);
                  output_c(0x01);               //prende el motor y el led
               };
               delay_ms(100);

              if (input(PIN_B1)==1)             // interruptor de apagado
              {

                  output_a(0x3f);               // apago led y motor
      output_c(0x00);
         puts("apagar");               // envio señal ha detector
                  delay_ms(600);               //para que se apague
               }

        break;

        case 'c':                               // modulo C

     while(!input(PIN_B1))
               {
                  output_a(0x3b);
                  output_c(0x01);               //prende el motor y el led
               };
               delay_ms(100);

              if (input(PIN_B1)==1)             // interruptor de apagado
              {
                  output_a(0x3f);               // apago led y motor
   output_c(0x00);
                 puts("apagar");               // envio señal ha detector
                  delay_ms(600);               //para que se apague
               }

         break;
        }
      }
      return (0);
}
//------------------------------------------------------------------------------
//Programa principal
//------------------------------------------------------------------------------

void main()
{
   int x=0;
   output_a(0x3f);
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   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_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
    while(1)
   {
         if(checkCommFlag)                      //si se activa la bandera de buffer esta lleno
         {
            puts(RXbuffer);                         // solo lo  hago para probar

            x=activar(RXbuffer);

            puts("siretorno");                      // solo lo  hago para probar

            checkCommFlag = 0;
            RXdataIndex=0;

      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);
     }
   }
}

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Ayuda urgente!! problema con la interrupcion RDA!!!
« Respuesta #1 en: 30 de Junio de 2006, 03:45:43 »
Veo que en tu rutina principal esperas a llenar el buffer y haber desactivado la interrupción para hacer algo con el string leído.
Mientras estás haciendo cosas, la UART puede que siga recibiendo datos y tú tienes la interrupción desactivada. Es más, no sé qué efecto puede producir esto al volver a activar la interrupción, pero quizás sea la causa de que no te funcione bien.

Yo en tu bucle principal actuaría siempre que la variable RXdataIndex fuese mayor que 0, lo cual significa que ya habría leído algún carácter, incluso sin haber llenado el buffer. Así ganas tiempo y no tienes porqué desactivar la interrupción.


 

anything