Buenas amigos,
vengo con un problema en un ejemplo sencillo de lo que sería el uso de las interrupciones utilizando el compilador XC8 en el entorno MPLABX de Microchip. Estoy utilizando el PIC16F876A también de Microchip.
Pues bien, lo que pretendo es cambiar el estado de un LED (D1) cada vez que se produzca una interrupción externa (RB0/INT). Mientras tanto el en el programa principal un LED (D2) se prende de manera intermitente. De esta forma cuando se produzca una interrupción D1 pasará a estado bajo si se encontraba en estado alto y a alto si se encontraba en estado bajo. Gracias al uso de la interrupción en ningún momento el diodo D2 dejará de parpadear puesto que la rutina de la interrupción se realiza de manera independiente a la rutina del programa principal.
Aquí os dejo el código del programa, y a continuación comentaré los resultados que obtengo:
PHP:
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "FUSES.h"
#include <stdint.h>
#define _XTAL_FREQ 4000000
int main (void)
{
TRISB = 0b00000001;
PORTB =0;
TRISA = 0;
INTCON = 0; // Limpiamos el registro INTCON
INTCONbits.INTE = 1; // Habilitamos la Int. externa hablitando el bit INTE
INTCONbits.GIE = 1; // Hablitamos la Int. global habilitando el bit GIE
OPTION_REGbits.INTEDG = 0; // Configuramos el flanco de alto a bajo para la interrupción externa
while(1)
{
PORTAbits.RA1=0;
__delay_ms(500);
PORTAbits.RA1=1;
__delay_ms(500);
}
return 0;
}
void interrupt isr (void)
{
if(INTCONbits.INTF)
{
if(PORTAbits.RA0)
{
PORTAbits.RA0=0;
}
else PORTAbits.RA0 = 1;
}
INTCONbits.INTF=0;
__delay_ms(10);
}
Pues bien, simulando este código en el circuito de la imagen adjunta con PROTEUS, observo como efectivamente D2 parpadea intermitentemente pero al pulsar el botón y forzar así la interrupción por RB0 el LED D1 sólo se prende si D2 está apagado y no mantiene el estado, es decir, una vez se enciende D2, D1 se apaga.
Me gustaría que le echaran un vistazo al código y me dijeran si ven algún fallo que a mi se me escapa.
Otra duda que tiene que ver con el compilador XC8:
He observado en foros y videos de youtube como gente utiliza comandos en XC8 para prender un led de manera intermitente y les funciona perfectamente, como por ejemplo:
PHP:
PORTAbits.RA0 =! PORTAbits.RA0;
PORTAbits.RA0 = ~PORTAbits.RA0;
Pues bien, si you utilizo estos comandos el programa compila pero no realiza lo que quiero, es decir, no prende el led de manera intermitente y tengo que usar la manera tradicional.
Algo similar me ocurre con los registros:
El programa me da error al compilar.
No se si todos estos errores se deben a nuevas actualizaciones o son error mío por algo que se me escapa. Me gustaría que me ayudaran tanto en el problema principal que os he expuesto y en las dudas que tengo acerca de dichos comandos. Gracias y un saludo a todos.