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);
}
}
}