Wednesday, May 27, 2020

Writing an interrupt service routine for timer 0

In the previous post, I use timer 0 overflow interrupt to blink an LED. In that post I use the main program loop to test the interrupt flag. It could produce program delay due to CPU cycle time consumption.

For mid-range PIC, there's only one interrupt vector locates at 0x04 of the program memory. Using the interrupt service routine (ISR), it is very fast and no need to do it in the main program loop.

In this example, I use the ISR to increase the value of PortD at every 325 milli seconds.

C source code:
#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 = OFF
// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
unsigned char cnt_0=0;
unsigned char cnt_1=0;
void main(){
    
    PORTD=0x00;
    TRISD=0x00;
    T0CS=0;
    PSA=0;
    T0IE=1;
    GIE=1;
    T0IF=0;
    TMR0=0;
    while(1){
        PORTD=cnt_1;
    }
}
void interrupt _ISR(void){
    if(T0IF){
        cnt_0+=1;
        T0IF=0;
    }
    /*325 milli seconds*/
    if(cnt_0>=5){
        cnt_0=0;
        cnt_1+=1;
    }
}

Schematic diagram.

Writing an interrupt service routine for timer 0
Schematic diagram while in simulating.
PortD output the counting increment ticks by
the timer 0 overflow interrupt.


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)