Hola:
Junto con saludarles, expongo este Mi dilema:
Pasa que en assembler los pics aparentemente me andaban bien (realicé cosas simples)
Pero decanté por C (sdcc).
Realicé un programa que hace parpadear un led verde durante el la función main(),, mientras un led rojo que copia el estado de INTF permanece apagado
Cuando presiono un botón, debiera saltar al método de interrupción, apagar el led verde y prender el rojo (copiando de INTF) y luego apagar el rojo (copiando INTF) y retornar al main()....
EL asunto es que cuando ejecuto el programa en el pic, lo primero que hace es ejecutar la función de interrupción y luego el main... cuando presiono el botón, con suerte se ejecuta una vez mas la interrupción y luego ya nunca mas, por mas que presione el botón.... Solo sigue eternamente ejecutando el While del main...
Este es el programa:
¿que estoy configurando mal en los GPIO (puertos) ? según el SDCCman.pdf la declaración de la función de interrupción está correcta.
#include <pic12f675.h>
#include <stdint.h>
static __code unsigned long int __at (0x2007) config = _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _CP_OFF & _CPD_OFF;
unsigned long int conteo;
void delay(unsigned long int); //pre declaracion de un metodo.
void Intr(void) __interrupt 0
{
GP5 = 0; //Led verde que solo enciende en el main()
GP4 = INTF; //Led rojo que permite ver el flag de INTE
delay(20000); //espero un poco... solo por comodidad visual
INTF = 0; //apago el flag de INTE
GP4 = INTF; //muestro el estado del flag de INTE con led rojo
}
void main(void)
{
TRISIO = 0;
INTF=0;
INTE=1;
GIE=1;
INTEDG = 0;
ANSEL = 0; //deshabilitar entradas analogicas
CMCON = 0x07; //apago el comparador (por si a caso)
GP4 = INTF; //muestro el estado del flag de INTE con led rojo (debe estar apagado)
while ( 1 )
{
GP5 = GP5 ^ 1; // bandera led verde parpadeant que indica que estoy en el main GP5 = (GP5 XOR 1)
delay(10000);
}
}
void delay(unsigned long int valor)
{
conteo = 0;
while ( conteo < valor )
{
conteo++;
}
}