Вы находитесь на странице: 1из 21

Interrupts, Counter and Timers

Interrupts (1)
Interrupt-driven I/O uses the

processors interrupt system to


interrupt normal program flow to
allow execution of an I/O service
routine
An interrupt is like a hardwareinitiated subroutine call
2

Interrupts (2)
Advantages
Immediate response to I/O service

request
Normal execution continues until it is
known that I/O service is needed
Disadvantages
Coding complexity for interrupt
service routines
Extra hardware needed
Processors interrupt system I/O

Basic Steps for an Interrupt (1)


An interrupt cycle begins at the next

fetch cycle if:


Interrupts are enable (GIE = 1)
Interrupt request is active (I=1)

Program counter (PC) is saved on the

stack
PC is loaded with address of interrupt
service routine (ISR)
Different schemes for determining this
address

Basic Steps for an Interrupt (2)


Interrupt service routine executes

Saves any registers that will be

altered so that normal program flow


is not disturbed
Performs input and/or output
operations to clear the interrupt
request
Restores saved registers
Returns

Program Flow for an Interrupt

Example Pseudo code for an ISR

ISR: save register(s)


if (IN_RDY == 1)
input data
if (OUT_RDY == 1)
output data
restore register(s)
return

Example Error if Registers are not


Saved before Executing ISR

16F84 INTCON Register

16F84 Interrupt Structure

10

Outline of 16F84 Interrupt Structure

11

16F84 Timer/Counter

12

16F84 OPTION Register

13

Relationship between TMR0 and Prescaler

14

Timing Diagram of TMRO Interrupt

15

Determining Timer Settings


Consider the wait for 500ms for LED
problem
Fosc = 4 MHz, internal timer can be driven
by Fosc/4 = 1MHz
To have a 500ms interrupt on overflow
interval, desired scale = 500ms/1s =
500,000
Maximum scale provided by Timer0 is
256*256=65,536
Probably we can set up an interrupt
interval shorter than 500ms, say M ms,
then toggle the LED after every N
interrupts, where M*N = 500.
16

The possible value of M has constraints. It is helpful to

Initialize the Timer0


Desired scale for 4ms timing is
4ms/1s = 4,000.
Play with the math we have
32*125 =4,000
In order to get an exact 4 ms timing, well need to set
the timer as follows:
PS2 PS1 PS0 =100
; set prescaler to 32
TMR0 = 256-125 =131 ; initialize TMR0
T0IF = 0
; clear timer0 interrupt flag
TOIE =1
; enable timer0 interrupt
17

Timer0 Initialization Code


InitTmr0
bcf
bsf
movlw

18

movwf
bcf
movlw
movwf
bcf
bsf
source
bsf
return

STATUS, RP1
;select bank 1
STATUS, RP0
B11010100 ; set up OPTION, prescaler and
timer0 resources
OPTION
STATUS, RP0
; select bank 0
D131
TMR0
; initialize TMR0
INTCON, T0IF
; clear Timer0 interrupt flag
INTCON, T0IE
; enable Timer0 interrupt
INTCON, GIE

; enable global interrupts

Wait for 500ms --- Use Timer


Since our Timer is set to overflow every 4ms, waiting 4ms

really means waiting until the timer overflows. We will write


an interrupt service routine to handle the timer overflow in a
future class. Now we assume that in the interrupt service
routine (ISR), BLNKCNT is decremented by 1 each time an
overflow occurs.
Waiting 500ms means waiting timer overflow 125 times,
which is counted by BLNKCNT.
Five00Ms
movlw 124
; initialize BLNKCNT to 124,
why???

19

movwf BLNKCNT ; BLNKCNT is a variable


wait500
btfss
BLNKCNT, 7
; wait for 00000000 to
11111111 change
goto
wait500
; wait if not

Put it All Together


- The Mainline Program
Mainline
call Initial
; Initialize PortB
call InitTmr0 ; Initialize Timer0
MainLoop
call Blink
; Blink LED
call Five00ms ; Insert 500ms
delay
goto MainLoop
Note: BLNKCNT will be
decremented in the interrupt
service routine which we will talk
20
about in the future!

Watchdog Timer
Free running counter with its own oscillator
Can be enabled or disabled through special

directives in the program


Usually used to reset the controller if the
program gets stuck or works incorrectly
Programmer needs to be careful when using it
so that it does not cause problems

21

Вам также может понравиться