He visto varios temas con problemas en interrupciones para el 16f877, personalmente no he logrado trabajar bien con la interrupción por recepción del puerto serial (int_RDA), pero con el 16f873 me funciona perfectamente. Lo que quiero hacer con el programa es identificar el PIC en una red RS-485, si se recibe el protocolo correcto se empieza a recibir una trama de datos algo larga (aprox. 20 bytes). Lo primero que he hecho es tratar de recibir unos pocos caracteres (menos de 10) y devolverlos por el puerto serial, algunas veces el PIC se queda entrando a la interrupción infinitamente, otras se reinicia por el WDT y otras no hace nada. En Proteus funciona perfectamente pero en el proto no. Si alguien conoce la causa del problema le agradecía compartirla. Adjunto el código de prueba:
#include <16F877A.h>
#device adc=8
#FUSES WDT //Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=12000000,RESTART_WDT)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PC,enable=PIN_C5)
#int_RDA
RDA_isr()
{
if(kbhit()){
char String[30];
fgets(String,PC);
delay_ms(50)
fputs(String,PC);
}
}
void main()
{
port_b_pullups(TRUE);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL);setup_wdt(WDT_576MS);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_c(0b11000000);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
fprintf(PC,"Inicia"
;
while(1){
restart_wdt();
}
}