Hola, estoy trabajando con el PIC16F873, estaba probando un simple programita para manejar adecuadamente el tema de las interrupciones. En el proyecto mayor que voy a hacer, requiero de varias de ellas, y de distinta naturaleza.
la cosa es que estaba probando con este sencillo programa:
#include <stdio.h>
#include <stdlib.h>
#use delay(clock=4000000)
#fuses NOWDT
#USE STANDARD_IO (C)
#byte portb=0x06
#byte trisb=0b11110001
#int_ext
algo(void)
{
output_c(0b00000010);
delay_ms(1000);
return 0;
}
#int_RB
RB_isr()
{
output_b(input_b());
clear_interrupt(int_RB);
output_b(0x00);
output_c(0b00000001);
delay_ms(1000);
disable_interrupts(global);
return 0;
}
void main()
{
portb=0;
enable_interrupts(int_ext);
ext_int_edge(l_to_h);
enable_interrupts(int_RB);
enable_interrupts(global);
while(true)
{
output_c(0x00);
enable_interrupts(global);
}
}
Básicamente, utilizo dos pulsadores para prender 2 Leds en el puerto C. El que está conectado a la interrupción por RB0 funciona bien. El problema se genera cuando intento ejecutar la interrupción por cambios en el puerto b(B4-B7). La cosa es así: simulándolo en Proteus, el programa ingresa a la rutina de interrupción, pero nunca regresa o sale de ella, por más que reseteo los registros, las entradas, o deshabilito las interrupciones, como pueden ver.
Una vez pulsado el botón, nada más del programa responde. ¿Cómo puedo hacer para solucionar esto?, ¿ Por qué no regresa de la interrupción al programa principal?
Muchas Gracias
la cosa es que estaba probando con este sencillo programa:
#include <stdio.h>
#include <stdlib.h>
#use delay(clock=4000000)
#fuses NOWDT
#USE STANDARD_IO (C)
#byte portb=0x06
#byte trisb=0b11110001
#int_ext
algo(void)
{
output_c(0b00000010);
delay_ms(1000);
return 0;
}
#int_RB
RB_isr()
{
output_b(input_b());
clear_interrupt(int_RB);
output_b(0x00);
output_c(0b00000001);
delay_ms(1000);
disable_interrupts(global);
return 0;
}
void main()
{
portb=0;
enable_interrupts(int_ext);
ext_int_edge(l_to_h);
enable_interrupts(int_RB);
enable_interrupts(global);
while(true)
{
output_c(0x00);
enable_interrupts(global);
}
}
Básicamente, utilizo dos pulsadores para prender 2 Leds en el puerto C. El que está conectado a la interrupción por RB0 funciona bien. El problema se genera cuando intento ejecutar la interrupción por cambios en el puerto b(B4-B7). La cosa es así: simulándolo en Proteus, el programa ingresa a la rutina de interrupción, pero nunca regresa o sale de ella, por más que reseteo los registros, las entradas, o deshabilito las interrupciones, como pueden ver.
Una vez pulsado el botón, nada más del programa responde. ¿Cómo puedo hacer para solucionar esto?, ¿ Por qué no regresa de la interrupción al programa principal?
Muchas Gracias