Saludos se que este tema ha sido muy tocado en este foro, pero he intentado varios métodos para poder salir de la interrupción y me vuelva a la función principal de mi programa, e intentado usar una variable auxiliar para leer y sobrescribir el puerto b y también he tratado e limpiar el registro RBIF dentro de la misma interrupción, y por ahora estoy intentando leer sobrescribir el puerto b con asm, pero no tengo éxito, una vez que hago la interrupción por el puerto b el programa ya no sale de ahí, este es parte de mi código, :
#include <16F873a.h>
#FUSES XT,NOWDT,NOPROTECT,NOPUT
#use delay(clock=4000000)
int16 distanciaf, tiempof;
int16 distanciat, tiempot;
int16 distanciad, tiempod;
int16 distanciai, tiempoi;
#define disparof PIN_C0
#define disparot PIN_C1
#define disparod PIN_C2
#define disparoi PIN_C3
#define ecof PIN_C4
#define ecot PIN_C5
#define ecod PIN_C6
#define ecoi PIN_C7
#BYTE TRIS_A = 0X85
#BYTE PORT_A = 0X05
#BYTE TRIS_B = 0X86
#BYTE PORT_B = 0X06
#BYTE TRIS_C = 0X87
#BYTE PORT_C = 0X07
#INT_RB
void CAMBIO_B(void){
#asm movf PORT_B,0 #endasm
if(PORT_B==0b00010000)
{
output_A(0b111010);
delay_ms(1500);
}
if(PORT_B==0b00100000){
output_A(0b110101);
delay_ms(1500);
}
if(PORT_B==0b01000000){
output_A(0b111001);
delay_ms(1500);
}
if(PORT_B==0b10000000){
output_A(0b110110);
delay_ms(1500);
}
}
void main()
{
setup_adc_ports(NO_ANALOGS);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
set_tris_A(0x00);
set_tris_B(0xF0);
set_tris_C(0b11110000);
PORT_A=0;
PORT_B=0b11110000;
PORT_C=0;
delay_ms(5000);
output_A(0b110101);
delay_ms(4500);
output_A(0x00);
while(1)
{
//............
}