Tengo un controlador de interrupciones para mi PIC 16 que debería modificar una variable global. Luego, la variable global se lee con main()
en un bucle infinito.
Por alguna razón, parece que la variable global se está modificando dentro del controlador de interrupción, pero que las modificaciones no persisten fuera del controlador de interrupción. Estoy seguro de que:
- El controlador de interrupción se llama correctamente
- El controlador modifica la variable global dentro del controlador
- El código en
main()
que lee la variable global es correcto
Finalmente, he tenido cuidado de declarar la variable global como volatile
como se recomienda aquí .
¿Qué podría explicar que el cambio de variable global en el controlador de interrupción no persista en main()
?
[Nota: Mi código C está compilado por XC8. A continuación se muestra el código completo de mi caso de prueba reducido.]
#include <pic16f1824.h>
#include <xc.h>
volatile unsigned char buttonPress = 0b0;
void interrupt InterruptServiceRoutine(void) {
// Update the button press value
buttonPress = 0b1;
}
void main(void) {
// Make RA4 an output
TRISAbits.TRISA4 = 0b0;
// Turn off status LED
LATAbits.LATA4 = 0b0;
// Enable interrupts
INTCONbits.GIE = 0b1;
// Enable interrupt-on-change to wake from sleep
INTCONbits.IOCIE = 0b1;
// Make the RA2 pin a digital input
TRISAbits.TRISA2 = 0b1;
ANSELAbits.ANSA2 = 0b0;
// Interrupt on RA2 negedges
IOCANbits.IOCAN2 = 0b1;
while(1) {
if(buttonPress == 0b1) {
// Turn on LED <-- Never turns on
LATAbits.LATA4 = 0b1;
}
}
}