Wednesday, May 20, 2020

Programming the PortB interrupt on change of PIC16887

In the previous section, I introduce about the interrupt concept and the external interrupt programming of PIC16F887.
In this section, I wish to introduce about PortB interrupt on change of PIC16F887. If you wish to see about interrupt concept click here.

Beside external interrupt (INT) of at RB0, PortB could trigger an interrupt at any pin from RB0 to RB7.
This's called PortB interrupt on change (IOCB). 
You can you any pin of PortB to trigger an interrupt, or all of them.

To program the interrupt on change, we need to work with some register in the SFR.
  1. PORTB and TRISB
  2. ANSELH
  3. OPTION_REG (Optional)
  4. INTCON
  5. IOCB
  6. WPUB (Optional)   
First step, we need to set PortB as digital input.
In the INTCON set the RBIE to '1' enabling the PortB interrupt on change.

 BIT 7 BIT 0
 GIEPEIET0IEINTERBIET0IFINTFRBIF

Setting any bit of the IOCB (interrupt on change port B register) to enable the specific interrupt on change pin.

BIT 7 BIT 0
 IOCB7IOCB6IOCB5IOCB4IOCB3IOCB2IOCB1IOCB0

In the ISR, check to RBIF to identify the Port B interrupt on change. To check for any pin change, test the RB pin one by one.

Programming the PortB interrupt on change of PIC16887
Schematic diagram.
SW1 to SW9 connect to PortB, triggering the interrupt on change
from high to low. PortB input is programmed to weakly pull up.
PortD connects to output LEDs.
PortD will toggle LEDs whenever interrupt
on change occurred.

Source code is written in XC8.

#include<xc.h>
// PIC16F887 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = XT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config IESO = ON
#pragma config FCMEN = ON
#pragma config LVP = ON
// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
/*Interrupt service routine*/
void interrupt _ISR(void){
    /*looking for portB interrupt
     on change by checking RBIF*/
    if(RBIF){
        /*Test individual pin*/
        if(RB0==0)  RD0^=1;
        if(RB1==0)  RD1^=1;
        if(RB2==0)  RD2^=1;
        if(RB3==0)  RD3^=1;
        if(RB4==0)  RD4^=1;
        if(RB5==0)  RD5^=1;
        if(RB6==0)  RD6^=1;
        if(RB7==0)  RD7^=1;
        RBIF=0;
    }
}
void main(){
    /*clear PortB*/
    PORTB=0x00;
    /*clear PortD*/
    PORTD=0x00;
    /*PortD as output*/
    TRISD=0x00;
    /*PortB as input*/
    TRISB=0xFF;
    /*disable all analog input of portB*/
    ANSELH=0;
    /*turn on global weak pull up*/
    nRBPU=0;
    /*Turn on all pull up resistor of portB*/
    WPUB=0xFF;
    /*enable portB interrupt on change
     of all pins*/
    IOCB=0xFF;
    RBIE=1;
    /*enable global interrupt*/
    GIE=1;  
    /*program main loop does nothing
     our could be anythings*/
    while(1);
}

I took a screen shot of the running program.

Programming the PortB interrupt on change of PIC16887
screen shot of the running program
Any pin of PortD toggle due to the corresponding
interrupt on change of PortB.


No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (56) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (47) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (71) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (3) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (31) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)