BEC405A - Module 4&5 - 8051 INTERRUPTS AND INTERFACING APPLICATIONS - Updated
BEC405A - Module 4&5 - 8051 INTERRUPTS AND INTERFACING APPLICATIONS - Updated
Module – 4
Interrupt Programming
Interrupt is one of the most important and powerful concepts and features
in microcontroller/processor applications. Almost all the real world and real time systems built around
microcontrollers and microprocessors make use of interrupts.
What is an Interrupt?
An interrupt refer to a notification, communicated to the controller, by a hardware device or software,
on receipt of which controller momentarily stops and responds to the interrupt. Whenever an interrupt
occurs the controller completes the execution of the current instruction and starts the execution of
an Interrupt Service Routine (ISR) or Interrupt Handler.
ISR is a piece of code that tells the processor or controller what to do when the interrupt occurs. After
the execution of ISR, controller returns back to the instruction it has jumped from (before the interrupt
was received). The interrupts can be either hardware interrupts or software interrupts.
Need of interrupts
An application built around microcontrollers generally has the following structure. It takes input from
devices like keypad, ADC etc; processes the input using certain algorithm; and generates an output
which is either displayed using devices like seven segment, LCD or used further to operate other devices
like motors etc. In such designs, controllers interact with the inbuilt devices like timers and other
interfaced peripherals like sensors, serial port etc. The programmer needs to monitor their status
regularly like whether the sensor is giving output, whether a signal has been received or transmitted,
whether timer has finished counting, or if an interfaced device needs service from the controller, and
so on. This state of continuous monitoring is known as polling.
In polling, the microcontroller keeps checking the status of other devices; and while doing so it does
no other operation and consumes all its processing time for monitoring. This problem can be addressed
by using interrupts. In interrupt method, the controller responds to only when an interruption occurs.
Thus in interrupt method, controller is not required to regularly monitor the status (flags, signals etc.)
of interfaced and inbuilt devices.
To understand the difference better, consider the following. The polling method is very much similar
to a salesperson. The salesman goes door-to-door requesting to buy its product or service. Like
controller keeps monitoring the flags or signals one by one for all devices and caters to whichever needs
its service. Interrupt, on the other hand, is very similar to a shopkeeper. Whosoever needs a service or
product goes to him and apprises him of his/her needs. In our case, when the flags or signals are
received, they notify the controller that they need its service.
1. RESET interrupt – This is also known as Power on Reset (POR). When the RESET interrupt is
received, the controller restarts executing code from 0000H location. This is an interrupt which is not
available to or, better to say, need not be available to the programmer.
2. Timer interrupts – Each Timer is associated with a Timer interrupt. A timer interrupt notifies the
microcontroller that the corresponding Timer has finished counting.
3. External interrupts – There are two external interrupts EX0 and EX1 to serve external devices.
Both these interrupts are active low. In AT89C51, P3.2 (INT0) and P3.3 (INT1) pins are available for
external interrupts 0 and 1 respectively. An external interrupt notifies the microcontroller that an
external device needs its service.
4. Serial interrupt – This interrupt is used for serial communication. When enabled, it notifies the
controller whether a byte has been received or transmitted.
When an interrupt is received, the controller stops after executing the current instruction. It transfers
the content of program counter into stack. It also stores the current status of the interrupts internally
but not on stack. After this, it jumps to the memory location specified by Interrupt Vector
Table (IVT). After that the code written on that memory area gets executed. This code is known as
the Interrupt Service Routine (ISR) or interrupt handler. ISR is a code written by the programmer to
handle or service the interrupt.
Programming Interrupts
While programming interrupts, first thing to do is to specify the microcontroller which interrupts must
be served. This is done by configuring the Interrupt Enable (IE) register which enables or disables the
various available interrupts. The Interrupt Enable register has following bits to enable/disable the
hardware interrupts of the 8051 controller.
To enable any of the interrupts, first the EA bit must be set to 1. After that the bits corresponding to
the desired interrupts are enabled. ET0, ET1 and ET2 bits are used to enable the Timer Interrupts 0,
1 and 2, respectively. In AT89C51, there are only two timers, so ET2 is not used. EX0 and EX1 are
used to enable the external interrupts 0 and 1. ES is used for serial interrupt.
EA bit acts as a lock bit. If any of the interrupt bits are enabled but EA bit is not set, the interrupt will
not function. By default all the interrupts are in disabled mode.
Note that the IE register is bit addressable and individual interrupt bits can also be accessed.
Note that the IE register is bit addressable and individual interrupt bits can also be accessed.
For example –
IE = 0x81; enables External Interrupt0 (EX0)
IE = 0x88; enables Serial Interrupt
Setting the bits of IE register is necessary and sufficient to enable the interrupts. Next step is to specify
the controller what to do when an interrupt occurs. This is done by writing a subroutine or function
for the interrupt. This is the ISR and gets automatically called when an interrupt occurs. It is not
required to call the Interrupt Subroutine explicitly in the code.
An important thing is that the definition of a subroutine must have the keyword interrupt followed
by the interrupt number. A subroutine for a particular interrupt is identified by this number.
Setting the IT0 and IT1 bits make the external interrupt 0 and 1 edge triggered respectively. By default
these bits are cleared and so external interrupt is level triggered.
Note: For a level trigger interrupt, the INTx pin must remain low until the start of the ISR and should
return to high before the end of ISR. If the low at INTx pin goes high before the start of ISR, interrupt
will not be generated. Also if the INTx pin remains low even after the end of ISR, the interrupt will be
generated once again. This is the reason why level trigger interrupt (low) at INTx pin must be four
machine cycles long and not greater than or smaller than this.
Example 5.2
//Edge trigger external interrupt
void main()
{
IE = 0x84;
IT1 = 1;
while(1);
}
void ISR_ex1(void) interrupt 2
{
<body of interrupt>
}
Programming Serial Interrupt
To use the serial interrupt the ES bit along with the EA bit is set. Whenever one byte of data is sent or
received, the serial interrupt is generated and the TI or RI flag goes high. Here, the TI or RI flag needs
to be cleared explicitly in the interrupt routine (written for the Serial Interrupt).
Example 5.3
Send ‘A’ from serial port with the use of interrupt
// Sending ‘A’ through serial port with interrupt
// XTAL frequency 11.0592MHz
void main()
{
TMOD = 0x20;
TH1 = -1;
SCON = 0x50;
TR1 = 1;
IE = 0x90;
while(1);
}
void ISR_sc(void) interrupt 4
{
if(TI==1)
{
SBUF = ‘A’;
TI = 0;
}
else
RI = 0;
}
Example 5.4
// Receive data from serial port through interrupt
// XTAL frequency 11.0592MHz
void main()
{
TMOD = 0x20;
TH1 = -1;
SCON = 0x50;
TR1 = 1;
IE = 0x90;
while(1);
}
void ISR_sc(void) interrupt 4
{
unsigned char val;
if(TI==1)
{
TI = 0;
}
else
{
val = SBUF;
RI = 0;
}
}
Stepper Motor Interfacing:
Stepper motor is a widely used device that translates electrical pulses into mechanical movement.
Stepper motor is used in applications such as; disk drives, dot matrix printer, robotics etc,. The
construction of the motor is as shown in figure below.
It has a permanent magnet rotor called the shaft which is surrounded by a stator. Commonly used
stepper motors have four stator windings that are paired with a center – tapped common. Such motors
are called as four-phase or unipolar stepper motor. The stator is a magnet over which the electric coil
is wound. One end of the coil are connected commonly either to ground or +5V. The other end is
provided with a fixed sequence such that the motor rotates in a particular direction. Stepper motor
shaft moves in a fixed repeatable increment, which allows one to move it to a precise position.
Direction of the rotation is dictated by the stator poles. Stator poles are determined by the current sent
through the wire coils.
Step angle: Step angle is defined as the minimum degree of rotation with a single step.
No of steps per revolution = 360° / step angle Steps per second = (rpm x steps per revolution) / 60
Example: step angle = 2° No of steps per revolution = 180
Switching Sequence of Motor: As discussed earlier the coils need to be energized for the rotation.
This can be done by sending a bits sequence to one end of the coil while the other end is commonly
connected. The bit sequence sent can make either one phase ON or two phase ON for a full step
sequence or it can be a combination of one and two phase ON for half step sequence. Both are
tabulated below.
Full Step: Two Phase ON
The following example 1 to example 6 shown below will elaborate on the discussion done above:
Example 1: Write an ALP to rotate the stepper motor clockwise / anticlockwise continuously with full
step sequence.
Program:
MOV A, #66H
BACK: MOV P1, A
RR A
ACALL DELAY
SJMP BACK
DELAY: MOV R1, #100
UP1: MOV R2, #50
UP: DJNZ R2, UP
DJNZ R1, UP1
RET
The R-2R ladder DAC, which is a binary weighted DAC that uses a repeating cascaded structure of
resistor values R and 2R. This improves the precision due to the relative ease of producing equal valued
matched resistors (or current sources). However, wide converters perform slowly due to increasingly
large RC-constants for each added R-2R link.
The first criterion for judging a DAC is its resolution, which is a function of the number of binary
inputs. The common ones are 8, 10, and 12 bits. The number of data bit inputs decides the resolution
of the DAC since the number of analog output levels is equal to 2n, where n is the number of data bit
inputs. DAC0808: The digital inputs are converter to current Iout, and by connecting a resistor to the
Iout pin, we can convert the result to voltage. The total current Iout is a function of the binary numbers
at the D0-D7 inputs of the DAC0808 and the reference current Iref , and is as follows:
Usually reference current is 2mA. Ideally we connect the output pin to a resistor, convert this current
to voltage, and monitor the output on the scope. But this can cause inaccuracy; hence an opamp is
used to convert the output current to voltage. The 8051 connection to DAC0808 is as shown in the
figure below.
Figure: 8051 connection to DAC0808
The following examples 9, 10 and 11 will show the generation of waveforms using DAC0808.
Analog-to-digital converter (ADC) interfacing:
ADCs (analog-to-digital converters) are among the most widely used devices for data acquisition. A
physical quantity, like temperature, pressure, humidity, and velocity, etc., is converted to electrical
(voltage, current) signals using a device called a transducer, or sensor We need an analog-to-digital
converter to translate the analog signals to digital numbers, so microcontroller can read them. ADC804
chip: ADC804 IC is an analog-to-digital converter. It works with +5 volts and has a resolution of 8
bits. Conversion time is another major factor in judging an ADC. Conversion time is defined as the
time it takes the ADC to convert the analog input to a digital (binary) number. In ADC804 conversion
time varies depending on the clocking signals applied to CLK R and CLK IN pins, but it cannot be
faster than 110μs.
D0-D7: The digital data output pins. These are tri-state buffered. The converted data is accessed only
when CS =0 and RD is forced low. To calculate the output voltage, use the following formula
Analog ground and digital ground: Analog ground is connected to the ground of the analog Vin and
digital ground is connected to the ground of the Vcc pin. To isolate the analog Vin signal from transient
voltages caused by digital switching of the output D0 – D7. This contributes to the accuracy of the
digital data output.
Vin(+) & Vin(-): Differential analog inputs where Vin = Vin (+) – Vin (-). Vin (-) is connected to
ground and Vin (+) is used as the analog input to be converted.
RD: Is “output enable” a high-to-low RD pulse is used to get the 8-bit converted data out of ADC804.
INTR: It is “end of conversion” When the conversion is finished, it goes low to signal the CPU that
the converted data is ready to be picked up.
WR: It is “start conversion” When WR makes a low-to-high transition, ADC804 starts converting the
analog input value of Vin to an 8- bit digital number.
CS: It is an active low input used to activate ADC804.
The following steps must be followed for data conversion by the ADC804 chip:
1. Make CS= 0 and send a L-to-H pulse to pin WR to start conversion.
2. Monitor the INTR pin, if high keep polling but if low, conversion is complete, go to next step.
3. Make CS= 0 and send a H-to-L pulse to pin RD to get the data out
The following figure shows the read and write timing for ADC804.
The following figures shows the self-clocking with the RC component for frequency and the external
frequency connected to XTAL2 of 8051.
ADC0808/0809 chip: ADC808 has 8 analog inputs. It allows us to monitor up to 8 different
transducers using only single chip. The chip has 8-bit data output just like the ADC804. The 8 analog
input channels are multiplexed and selected according to the values given to the three address pins, A,
B, and C. that is; if CBA=000, CH0 is selected; CBA=011, CH3 is selected and so on. The pin details
of ADC0808 are as shown in the figure below. (Explanation can be done as is with ADC0804).
Command codes
LCD timing diagram for reading and writing is as shown in the below figures.
Sending Data/ Commands to LCDs with Time Delay: To send any of the commands to the LCD,
make pin RS=0. For data, make RS=1. Then send a high-to-low pulse to the E pin to enable the internal
latch of the LCD.