# Interrupt AVR
# What is Interrupt ?
Interrupt are the powerful signal that interfere the main process being done inside the system .IT perform events that require immediate attention by the microprocessor.
When an interrupt occurs, the current program execution is stopped, the context is saved and the control jumps to ISR( Interrupt Control Routine ). At the end of ISR, the microcontroller returns to the task it had paused and continue its normal operations.
# What is Interrupt application ?
- Switching off the device when it get hang.
- Performing time Critical and time specific task(i.e alarm clock)
- Interrupts are used in type ahead feature for buffering events like keystrokes.
- Different device generate signal as interrupt to denote the state of work so the critical task can be performed on time
# What are Type of Interrupt and their number present ?
The AVR 8-bits microcontroller provide two type of interrupt
Internal interrupt sources : These interrupt signal are generated within microcontrollers by peripheral devices i.e Timer/Counter, Analog Comparator, Serial, ADC( Analog to Digital Converter),etc. They generally denote the state of work being performed by peripheral.
External interrupt sources: These Interrupt are generated as result of user activities such as pressing switch. There are 4 external interrupts.
- External interrupt 0 (INT0)
- External interrupt 1 (INT1)
- External interrupt 2 (INT2)
# How Does Interrupt work ?
Upon the triggering of an interrupt the following sequence is followed by the microcontroller providing that the both the specific interrupt and global interrupts are enabled in the microcontroller:
- Upon the generation of interrupt signal , microcontroller completes the execution of the current instruction, stores the address of the next instruction (the content of the PC) on the stack.
PC : A program counter is a memory that contains the address (location) of the instruction being executed at the current time. The CPU execute the instruction which address is contain in the PC
The function of the triggered interrupt signal is then loaded in the PC and the microcontroller starts execution from that point up until is reaches a end instruction.
Upon the end of execution of function , the address that was stored on the stack in step 1 is reloaded in the PC
The microcontroller then start executing instructions from that point. That is the point that it left off when the interrupt was triggered.
# Step to use Interrupt (for only external interrupt) ?
- Include necessary header file : Header file necessary for the interrupt is :
#include <avr/interrupt.h>
- Enable the global interrupt: Enabling global interrupt can be done by the below code
sei(); //enable global interrupt
- Enable Specific Interrupt : It can done by setting bits on the GICR register (General Interrupt Control Register)
GICR = 1<<INT0; //enable int0
GICR = 1<<INT1; //enable int1
GICR = 1<<INT2; //enable int2
2
3
- Specify the nature of the signal for interrupt generation (i.e rising edge , falling edge):
It is done by setting
ISC11
,ISC10
in MCUCR (MCU Control Register) forINT1
,ISC00
,ISC01
in MCUCR (MCU Control Register) forINT0
andISC2
in MCUCSR (MCU Control and Status Register) forINT2
MCUCR = 1<<ISC01 | 1<<ISC00; //rising edge for INT0
Make the interrupt pin as Input
Define Function for Interrupt
ISR(INTn_vect)
{
// work to be performed
}
2
3
4
# Demo Program
WAP to blink led when switch is pressed , it must be interrupt signal to Controller .
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
ISR(INT0_vect)
{
//turning on led only when switch is turned on
PORTC |= (1<<PC0);
_delay_ms(500);
PORTC &= ~(1<<PC0);
_delay_ms(500);
}
int main()
{
DDRD = 1<<PD2; //setting PD2 as input
PORTD = 1<< PD2; // pull up resistor
DDRC = 0xFF; //setting DDRC as output
GICR = 1<<INT0; //enable int0
MCUCR = 1<<ISC01 | 1<<ISC00; //rising edge
sei(); //enable global interrupt
while(1){
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Practise Question
- make use of interrupt 1?