Tengo una mala conducta alucinante en mi PIC16F1825. Básicamente, estoy usando el pin 3 (RA4) para alternar un LED usando una Interrupción en Cambio. El problema es que, aunque se enciende el led cada vez que presiono el botón (que se presiona externamente), después de un segundo, el LED se vuelve a encender, lo que significa que se llamó nuevamente a la rutina de interrupción, y no debería, aunque lo borre. la bandera de entrada.
Aquí está el código (solo la función IOconfig_portA () y toggleLed () son importantes para el problema en cuestión:
#include <stdio.h>
#include <stdlib.h>
#include <PIC16F1825.h>
char temp=0;
void interrupt toggleLed() {
INTCONbits.GIE = 0;
if(INTCONbits.IOCIF == 1) {
temp = PORTA;
INTCONbits.IOCIF = 0;
LATC3 = ~LATC3;
for (int i = 0; i < 100000; i++);
}
INTCONbits.GIE = 1;
}
void CLOCKconfig() {
OSCCON = 0x6A; //Sets the internal oscillator fosc = 4 MHz
OSCSTAT = 0x00;
OSCTUNE = 0x00;
}
void IOconfig_portA() {
ANSELA = 0x00; // All ports set as DIGITAL
TRISAbits.TRISA4 = 1; // Set as input
//OPTION_REG &= 0x7F; // Clear bit 7, to enable the weak pull-up
//WPUA |= (1<<2); // Enable the WPU for RA2
CM1CON0 = 0x00;
CM1CON1 = 0x00;
IOCANbits.IOCAN4 = 1; // Generate Interrupt on Negedge
IOCAP = 0x00; // Disable Interrupt on Posedge
INTCON = 0x88; // Enable GIE and IoC interrupts
}
int main(int argc, char** argv) {
TRISC = 0;
CLOCKconfig();
ANSELC &= 0x00; // All bits on port C are set to Digital I/O's
TRISC &= 0x00; // All bits on Port C are set to Outputs
APFCON0 |= (1<<5); // Don't use special features on Pin RC3
APFCON1 |= (1<<2); // Don't use special features on Pin RC3
IOconfig_portA();
LATC |= (1<<3);
while(1) {
}
return (EXIT_SUCCESS);
}
Gracias de antemano!