He utilizado la interrupción de cambio de estado RB para encender dos LED conectados al puerto A (pin4 y 5). El problema es cuando se produce una interrupción. El LED en pin5 se enciende, pero no el LED en pin4. Cuando cambio pin4 a pin3, funciona normalmente, pero no puedo usar este pin porque mi circuito ya está impreso.
He leído la hoja de datos y entiendo que PORTA pin4 se multiplexa con Timer0, ¿eso es lo que causa el problema? ¿Cómo desactivo eso?
Código del compilador XC8:
#define _XTAL_FREQ 20000000
#include <xc.h>
// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial
Programming Enable bit (RB3 is digital I/O, HV
on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data
EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write
protection off; all program memory may be
written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code
protection off)
//END CONFIG
int main()
{
TRISA = 0x00; //set portA as output
TRISB = 0xFF; //set portB as input
TRISD = 0xFF; //set portD as input
TRISC = 0xFF; //set portC as input
ADCON0 = 0x00; //disable AD converter
ADCON1 = 0b10000110; //disable AD converter
OPTION_REG = 0b00000000; //disable AD converter
INTCON = 0b11001000; //enable port b pullups
PORTA = 0x00; //turn off LEDs
while(1)
{
}
return 0;
}
void interrupt isr(void)
{
if (INTCONbits.RBIF) {
if (PORTB) {
asm("nop");
}
INTCONbits.RBIF = 0; //clear interrupt flag
PORTAbits.RA4 = 1; // turn on bottom LED
PORTAbits.RA5 = 1; // turn on top LED
}
}