Download presentation
Presentation is loading. Please wait.
Published byBrian Reynolds Modified over 11 years ago
1
Interrupts How to do 2 things at the same time
2
Need for interrupts Computers often have to deal with asynchronous events. That is to say events that occur times that are unpredictable relative to the rest of your program. Whilst a computer is busy running a program something unexpected may occur: –A packet may arrive on a communications line –A key may be pressed –A clock tic occurs
3
Alternative- Polling One alternative is to have your program running a loop checking for input/output events. This is called Polling. It is what all the examples so far have done. Polling wastes processor resources checking for events that rarely happen Polling makes it hard to get the computer to do any useful work.
4
Idea of interrupts Main program repeat Do this Do that Try something else For ages Interrupt handler Key pressed read input port store result return press
5
Interrupts occur between two instructions. Control is transferred by the hardware to an interrupt location. The interrupt routine does its stuff It then returns to the following instruction in the main program.
6
An interrupt is a procedure called by the hardware of the computer rather than by your program.
7
Interrupt control registers
8
Intcon global interupt enable INT pin interrupt TMR0 overflow interrupt GP port change interrupt INT pin interrupt TMR0 overflow interrupt FLAGS ENABLES
9
what happens When an interrupt is serviced: The GIE is cleared to disable any further interrupt The return address is pushed onto the stack The PC is loaded with 0004h Once in the Interrupt Service Routine, the source(s) of the interrupt can be determined by polling the interrupt flag bits. The interrupt flag bit(s) must be cleared in software before re-enabling interrupts to avoid GP2/ INT recursive interrupts.
10
Interrupts on the PIC Context Saving During Interrupts During an interrupt, only the return PC value is saved on the stack. Typically, users may wish to save key registers during an interrupt, e.g., W register and STATUS register. This must be implemented in software.
11
timing of interrupt
12
Vectors Reset vector, where we start on powerup Interrupt vector where we go on an interrupt Goto main Goto isr 0123401234 memory
13
Sample start of program ORG 0x000 ; processor reset vector goto Init ; go to beginning of program ORG 0x004 ; Interrupt vector location goto isr ; go to interrupt routine
14
Save context Registers that are used by the interrupt routine must always be saved. Program counter saved automatically but there are some you must save: W reg STATUS reg 3 PCLATH reg 10 FSR reg 4
15
Save registers Isr ;Interrupt Vector - Interrupt Sources Used: 1. TIMER0 Overflow ; 2. GP3 Pin-Change movwf WTEMP ;Save current W register movf STATUS,w clrf STATUS;Force to page0 movwf STATUSTEMP;Save STATUS in STATUSTEMP movf PCLATH,w movwf PCLATHTEMP;Save PCLATH movf FSR,w movwf FSRTEMP;Save FSR BANK1 ;select bank 1
16
Determine source We next need to inspect the interrupt flags to see what device caused the interrupt: TOIF Timer Overflow Interrupt Flag = bit 2 of INTCON GPIF Gpio interrupt flag= bit 0 of intcon
17
Check what is enabled We only need to test these flags if they are enabled. This means we must first check the relevant interrupt enable bits
18
Interrupt Source Checks ;**************************************************************************** Timer0InterruptCheck btfss INTCON,TOIE ;Is T0IE Set? gotoNext1;No ;Yes btfsc INTCON,TOIF ;Is TOIF Set? gotoTimer0Interrupt;Yes Next1 GPIFInterruptCheck btfss INTCON,GPIE ;Is GPIE Set? goto Next2;No btfsc INTCON,GPIF;Yes ;Is GPIF Set? goto GPIFInterrupt;Yes
19
Interrupt Source Code Timer0Interrupt callDisplay ;Update LED Array bcfINTCON,T0IF ;Clear TMR0 Interrupt Flag ; this prevents interrupt ; from occuring again ; spuriously gotoEndIsr
20
Restore old registers Finally we must restore any saved registers There is a particular problem with this because of the fact that our saving code may change the flags in the status register This requires care to get round
21
Cleanup code EndIsr clrfSTATUS;Select Bank0 movfFSRTEMP,w movwfFSR;Restore FSR movfPCLATHTEMP,w movwfPCLATH;Restore PCLATH movfSTATUSTEMP,w movwfSTATUS;Restore STATUS swapfWTEMP,f swapfWTEMP,w ;Restore W without ; corrupting STATUS bits retfie ;Return from interrupt
22
Swapf This is defined to do the following: SWAPFf,dSwap halves f f(0:3) f(4:7)->d It does not alter the z flag of the status register swapfWTEMP,f swap halves of wtemp swapfWTEMP,w swap again and store in W Net result is that W contains original form of wtemp
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.