I have used RB state change interruption to turn on two LED connected to portA (pin4 and 5). The probem is when interruption occurs LED on pin5 turn on, but not LED on pin4. When I change pin4 to pin3 it works normally, but I can't use this pin, because my circuit is already printed.
I've read the datasheet, and I understand that PORTA pin4 is multiplexed with Timer0, is that causing the problem? How do I disable that?
XC8 compiler code:
#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
}
}