Title | Ee3954 spring 16 08 interrup Notes |
---|---|
Course | Microprocessors and Microcontrollers |
Institution | Ohio University |
Pages | 44 |
File Size | 1.4 MB |
File Type | |
Total Downloads | 100 |
Total Views | 122 |
Download Ee3954 spring 16 08 interrup Notes PDF
Microprocessors and Microcontrollers
Interrupts
EE3954 by Maarten Uijt de Haag, Tim Bambeck, Harsha Chenji Interrupts.1
Interrupts Definitions
• Polling and interrupts are used when interfacing and communicating with internal and external devices and programs • Polling: – Internal or external devices are checked on a regular basis to find out if they need service; if they require a particular function to be executed.
• Interrupts: – An event from either an internal or external source where a processor will suspend the execution of its current process (program) and switch to a different instruction sequence. Interrupts.2
Polling If the switch is closed, Then turn the LED on!
VDD R
RB4
Polling the Button
Set up the I/O pins
RB0 Switch Closed ?
N
Y PIC16F877
Turn LED on
Turn LED off
VSS VSS
Interrupts.3
Polling
PORTB TRISB STATUS RP0 RP1
INIT:
POLL: LED_OFF LED_ON:
Source Code + Comments
equ equ equ equ equ
0x06 0x06 0x03 d’5’ d’6’
; in Bank 0 & 2 ; in Bank 1 & 3 ; in all Banks
org nop bcf bsf bsf bcf bcf bcf btfss goto bcf goto bsf goto end
0x000
; program starts at address 0
STATUS, RP1 STATUS, RP0 TRISB, 0 TRISB, 4 STATUS, RP0 PORTB, 4 PORTB, 0 LED_ON PORTB, 4 POLL PORTB, 4 POLL
; access Bank 1… ; … so we can get to TRIS Regs. ; set pin 0 of PORTB to input ; set pin 4 of PORTB to output ; access bank 0 ; initially, turn the LED off ; check if PORTB pin 0 is ‘0’ or ‘1’ ; goto TURN LED on ; Turn LED off, (set RB4=‘0’) ; go back and keep polling ; Turn LED on, (set RB4=‘1’) ; go back and keep polling
Interrupts.4
Interrupt Usage of a System
“Push Button” Interrupt
=
“Timer Interrupts” ”
“Serial Interrupt”
Main Program Loop
Interrupts.5
Interrupts If the switch is closed, Then turn the LED on!
Some Main Program
Interrupt Service Routine
Set up the I/O pins
Set up the I/O pins
VDD R
RB4
Set up Interrupts
RB0
Switch Closed ?
N
Y Process A
Turn LED on
Turn LED off
PIC16F877 Go Back to Process A (RETFIE)
VSS VSS
Interrupts.6
Interrupts
Transfer of Control Instruction N
Interrupt Occurs
Instruction N+1 Return of the program Control from the end of the ISR to the next (N+1) instruction of The main program
End main program
Program control is transferred to the first instruction of the interrupt service routine (ISR)
Instruction ISR-1 Interrupt Service Routine (ISR) Return from Interrupt Interrupts.7
PIC Microcontroller Microcontroller has various on-chip peripheral devices that can interrupt the main program
• • • •
Analog-to-Digital Converter (ADC), Timers and counters (8-bit, 16-bit), Parallel port, Serial communication, – RS232 (UART), I2C, SSP
• Comparator, • Pulse-Width-Modulation (PWM) • External signal or interrupt Interrupts.8
Signal: on-change ADC Signal: edge
Parallel port UART
Comparator, PWM
SSP Parallel port Multiplexing of I/O Pins
Pin Diagram from Datasheet
Interrupts.9
Example:
Signal: on-change
On-change interrupt (RB4, RB5, RB6, RB7): If the input on the pin is changed (“0” => “1” or “1” => “0”) an interrupt will occur
Interrupts.10
Interrupt
So what happens when an interrupt occurs
Interrupt Vector 0 0000 0000 0100 (13bit) ( = 0x0004 ) In other words, the current value of the PC is stored on the STACK and 0x0004 is put into PC: next instruction is at 0x0004
Interrupts.11
Interrupt
So what happens when an interrupt occurs
INIT: MAIN:
ISR:
org goto org goto … … … … goto … … retfie
0x000 INIT 0x004 ISR
Remember from the Labs
Interrupt Vector
MAIN
instead of ‘return’
Interrupt Service Routine (ISR) Works just like a subroutine
Interrupts.12
Interrupt
Returning from an ISR
Put the value on top of the STACK back into the Program Counter (PC); in other words, return to whatever the main program was doing.
Interrupts.13
Interrupt Service Routine Example
INIT: MAIN:
SUMISR:
NXT:
org goto org goto … … goto … movlw movwf movlw xorwf incf btfss goto movwf retfie
0x000 INIT 0x004 SUMISR
MAIN 0x20 FSR 0x00 INDF,W FSR,F FSR,6 NXT PORTE
Suppose that we want to write an ISR that XORs the values stored in memory locations 0x20 through 0x3f and write the result to PORTE.
Interrupts.14
Interrupts • • • • • • • • •
INT Pin Interrupt (external interrupt-RB0) Timer overflow interrupt, Comparator change interrupt, PORTB change interrupt (RB4-RB7), Receive (communication) interrupt, Transmit (comm.) interrupt, A/D conversion complete interrupt, Parallel slave port interrupt, Etc. Interrupts.15
Interrupts • INTCON (address 0x0B, 0x8B, 0x10B, 0x18B) – Control and Status of interrupts
Ending with an E indicates an enable bit: if the bit is set the corresponding interrupt is enabled
Ending with an F indicates a flag: if the bit is set, the corresponding interrupt has Interrupts.16 occurred
rrupts.17
Interrupts
Control Registers Used for: Configuration for Peripherals
• PIE1 & PIE2 (address 0x8C and
0x8D respectively
)
– Contain bits to enable/disable peripheral interrupts for use
• PIR1 & PIR2 (address 0x0C and
0x0D respectively
)
– Contain bits to identify which interrupt occurs (flags): – Corresponding bits are set when the interrupt occurred; Interrupts.18
PIE & PIR
from PIC16F877 datasheet
From page 15 and 16 of PIC16F877 datasheet (DS)
Interrupts.19
in: INTCON
in: PIE1, PIE2 PIR1, PIR2
For PIC16F877 (See section 12 of DS) Interrupts.20
In General for Mid-range devices
pts.21
Let’s Look at an Example VDD
• Use the PORTB on-change interrupt to turn on the LED.
R
RB1
RB4
PIC16F877
VSS VSS
Interrupts.22
Step 1 Set up the interrupt in main program INTCON Register ( 0x0B in all Banks ):
Interrupts.23
Step 1
Set up the interrupt in main program INTCON TRISB PORTB
INIT:
equ equ equ
0x0B 0x06 0x06
org goto org goto clrf bsf bsf bcf bcf bsf bcf … …
0x000 INIT 0x004 ISR STATUS STATUS,5 TRISB, 4 TRISB, 1 STATUS,5 INTCON,3 INTCON,0
; access ; bank 1 ; pin 4 of PORTB: input ; pin 1 of PORTB: output ; access bank 0 ; enable PORTB on-change interrupt ; YOU MUST CLEAR THE FLAG
(see next slide)
Interrupts.24
Step 2
Write the ISR MAIN:
ISR: LED_OFF:
LED_ON:
… … goto btfss goto bcf bcf retfie bsf bcf retfie
MAIN PORTB, 4 LED_ON PORTB, 1 INTCON,0 PORTB, 1 INTCON,0
; check if pin 4 changed from “0” to “1” ; if not so, turn on LED (“1” to “0”) ; otherwise, turn off LED ; YOU MUST CLEAR THE FLAG ; return to whatever you were doing ; turn on LED ; YOU MUST CLEAR THE FLAG ; return to whatever you were doing
The flag is the only indication for the microcontroller that the interrupt occurred, if you do not clear it in the ISR the interrupt condition will remain!!!
Interrupts.25
Step 3
Enable the Global interrupt in main program INTCON TRISB PORTB
INIT:
MAIN:
equ equ equ
0x0B 0x06 0x06
org goto org goto clrf bsf bsf bcf bcf bsf bcf bsf … …
0x000 INIT 0x004 ISR STATUS STATUS,5 TRISB, 4 TRISB, 0 STATUS,5 INTCON,3 INTCON,0 INTCON,7
; access ; bank 1 ; pin 4 of PORTB: input ; pin 0 of PORTB: output ; access bank 0 ; enable PORTB on-change interrupt ; YOU MUST CLEAR THE FLAG ; enable all interrupts Interrupts.26
Interrupt Latency Time from interrupt event (the interrupt flag bit gets set) to the time that the instruction at address 0x004 starts execution
Synchronous (typical internal) events: latency is 3TCY Asynchronous (typical external) events: latency is 3TCY to 3.75TCY with the instruction cycle time
In general: see the individual sections of the peripheral devices for the exact latency
Interrupts.27
Interrupt Latency
Interrupts.28
Oops What can go wrong with the combination of the following main program and ISR?
MAIN:
ISR:
movf addlw movwf … … goto
TEMP1, W 0x23 TEMP2
movlw movwf retfie
0x20 ISR_TMP,F
suppose that the interrupt occurs here
MAIN
Interrupts.29
Oops … Again What can go wrong with the combination of the following main program and ISR?
MAIN:
ISR:
movf sublw btfss … … goto
TEMP1, W 0x23 STATUS,Z
movlw addwf retfie
0x20 ISR_TMP,F
suppose that the interrupt occurs here
MAIN
Instruction alters the ‘Z’ bit
Interrupts.30
Context Saving During Interrupts
• Save the CONTEXT: – at least W and STATUS, – but also all Registers you plan to use in the ISR that are used in the Main Program.
• Save CONTEXT in RAM Common Area – 0x71 -0x7F (recall 0x70 used by ICD2) Interrupts.31
Common RAM Area
Advantage of this common area is that you DO NOT have to change banks
Remember this Data Memory area from Lab #1
Interrupts.32
Context Saving Why Not:
ISR:
movwf W_TEMP STATUS,W movf movwf STATUS_TEMP … … … movf STATUS_TEMP,W movwf STATUS movf W_TEMP,W
; DOES NOT affect STATUS ; DOES affect STATUS ; DOES NOT affect STATUS
; DOES affect STATUS ; DOES NOT affect STATUS ; DOES affect STATUS
So, while you are saving ‘W’ and ‘STATUS’ you actually changing the contents of STATUS. You do not want this to happen so you use SWAPF which does not affect any flags in STATUS Example: suppose STATUS = 0x00?
Interrupts.33
Context Saving Why Not:
Contents After Execution Label
Instr.
Argument
ISR:
movwf
W
STATUS
W_TEMP
STATUS_TEMP
W_TEMP
0x12
0x00
0x12
-
movf
STATUS,W
0x00
0x04
0x12
-
movwf
STATUS_TEMP
0x00
0x04
0x12
0x00
… … …
0x04
movf
STATUS_TEMP, W
0x00
0x04
0x12
0x00
movwf
STATUS
0x00
0x00
0x12
0x00
movf
W_TEMP,W
0x12
0x00
0x12
0x00
Before this program segment: W = 0x12 and STATUS = 0x00
Interrupts.34
Context Saving Why Not:
Contents After Execution Label
Instr.
Argument
ISR:
movwf
W
STATUS
W_TEMP
STATUS_TEMP
W_TEMP
0x00
0x12
0x00
-
movf
STATUS,W
0x12
0x12
0x00
-
movwf
STATUS_TEMP
0x12
0x12
0x00
0x12
movf
STATUS_TEMP, W
0x12
0x??
0x00
0x12
movwf
STATUS
0x12
0x12
0x00
0x12
movf
W_TEMP,W
0x00
0x16
0x00
0x12
… … …
Before this program segment: W = 0x00 and STATUS = 0x12
Interrupts.35
So … What instruction moves to/from register without affecting any flags?
swapf Problem is that this instruction swaps the nibbles of the byte
Solution: Just swap them back
Interrupts.36
Context Saving Contents After Execution Label
Instr.
Argument
ISR:
movwf
W
STATUS
W_TEMP
STATUS_TEMP
W_TEMP
0x00
0x12
0x00
-
swapf
STATUS,W
0x21
0x12
0x00
-
movwf
STATUS_TEMP
0x21
0x12
0x00
0x21
swapf
STATUS_TEMP, W
0x12
-
0x00
0x21
movwf
STATUS
0x12
0x12
0x00
0x21
swapf
W_TEMP,F
0x12
0x12
0x00
0x21
swapf
W_TEMP,W
0x00
0x12
0x00
0x21
… …
Before this program segment: W = 0x00 and STATUS = 0x12
Interrupts.37
Context Saving During Interrupts
ISR:
movwf swapf movwf … … … swapf movwf swapf swapf
W_TEMP
; Copy W to a Temporary Register ; regardless of current bank STATUS,W ; Swap STATUS nibbles and place ; into W register STATUS_TEMP ; Save STATUS to a Temporary register ; in Bank0
STATUS_TEMP,W ; Swap original STATUS register value ; into W (restores original bank) STATUS ; Restore STATUS register from ; W register W_TEMP,F ; Swap W_Temp nibbles and return ; value to W_Temp W_TEMP,W ; Swap W_Temp to W to restore original ; W value without affecting STATUS Interrupts.38
Multiple Interrupts What to do when the Microcontroller has to deal with interrupts for multiple sources, e.g. timer and PORTB change interrupt?
Check for the flags
Interrupts.39
Multiple Interrupts Example:
suppose we could get an interrupt for 1) a PORTB pin level change, 2) a TIMER 0 overflow (0xFF -> 0x00)
Interrupts.40
Multiple Interrupts
INIT: MAIN: RB_ISR:
T0_ISR:
org goto org btfsc goto btfsc goto retfie … … … … … … … retfie … … retfie
0x0000 INIT 0x0004 INTCON, RBIF RB_ISR INTCON, T0IF T0_ISR
Interrupts.41
Multiple Interrupts Or
INIT: MAIN:
RB_ISR:
T0_ISR:
org goto org btfsc goto goto … … … … … … … retfie … … retfie
0x0000 INIT 0x0004 INTCON, RBIF RB_ISR T0_ISR
Interrupts.42
Multiple Interrupts Or
INIT: MAIN:
ISR: T0_ISR:
RB_ISR:
org goto org goto … … … … … btfsc goto … … retfie … … retfie
0x0000 INIT 0x0004 ISR
INTCON, RBIF RB_ISR
Interrupts.43
Example in the Timer Section
Interrupts.44...