You are on page 1of 21

Physics 120B: Lecture 11

Timers and Scheduled Interrupts

Timer Basics
The ATMega 328 has three timers available to it (Arduino Mega has 6)
max frequency of each is 16 MHz, on Arduino TIMER0 is an 8-bit timer, with 1, 8, 64, 256, 1024 prescaler options TIMER1 is a 16-bit timer, with 1, 8, 64, 256, 1024 prescaler options TIMER2 is an 8-bit timer with 1, 8, 32, 64, 128, 256, 1024 prescaler options

These timers, recall, are used for PWM pins 5&6, 9&10, 3&11, respectively
we saw that we could change the PWM frequency by messing with the frequency prescaler values but PWM frequency is not the same as clock frequency
Lecture 11 2

Prescaling& Frequency
The Arduino boards run the ATMega chip at 16 MHz
so a prescaler of 1 results in a 16 MHz clock a prescaler of 1024 results in 15.625 kHz

Recall the PWM table:


PWM pins
5, 6 9, 10 3, 11

Register
TCCR0B TCCR1B TCCR2B

scaler values
1, 2, 3, 4, 5 1, 2, 3, 4, 5 1, 2, 3, 4, 5, 6, 7

frequencies (Hz)
62500, 7812,977, 244, 61.0 31250, 3906, 488, 122, 30.5 31250, 3906, 977, 488, 244, 122, 30.5

the top frequency is not 16 MHz, off by 256 and 512 this is because PWM is (presumably) counting a certain number of clock cycles (256 or 512) between pulses

Lecture 11

Prescaling Implementation on-chip

From ATMega full datasheet


CS bits decide which tap to output (note orig. clock in pos. 1)
Lecture 11 4

Prescaling for TIMER2: more taps

CSn0:CSn2 = 0 selects this: no clock out

Lecture 11

Wrap Times
TIMER0 is 8-bit (0255)
when prescaler = 1, reaches full count in 16 ms when prescaler = 1024, full count in 16.384 ms

TIMER1 is 16-bit (065536)


when prescaler = 1, reaches full count in 4.096 ms when prescaler = 1024, full count in 4.194 seconds

TIMER2 is 8-bit (0255)


when prescaler = 1, reaches full count in 16 ms when prescaler = 1024, full count in 16.384 ms

These wrap times set limits on timed interrupts


makes TIMER1 attractive, for its 16 bits
Lecture 11 6

Timed Interrupts
Really handy to have timed action, despite whatever loop() is doing
could check for serial input on a regular basis could read analog signal for regular sampling could produce custom signal at specific frequency

Idea is to set up timer so when it reaches specified count, it creates an interrupt


and also resets counter to zero so cycle begins anew

Interrupt Service Routine (ISR) should be short and sweet

Lecture 11

CAUTION
Messing with timer configurations can compromise other timer-based functions like
PWM outputs: analogWrite() (diff. pins diff. timers) delay() (uses timer0, depends on counter wrap) millis() and micros() (uses timer0, dep. on wrap) Servo library (uses timer1) tone() (uses timer2) but delayMicroseconds()is okay (not timer-based) others?

Be cognizant of which timer each function uses


see http://letsmakerobots.com/node/28278
Lecture 11 8

TIMER1 as Example
Relevant registers for setting up timer:
TCCR1A: Timer/Counter1Control Register A
sets up mode of operation

TCCR1B: Timer/Counter1Control RegisterB


more mode control, and prescaler

OCR1A: Output Compare Register 1A (theres also a B)


value against which to compare

TIMSK1: Timer1Interrupt MaSK register


selects which OCR to use

TIFR1: Timer1Interrupt Flag Register


contains info on tripped interrupt status

TCNT1: actual 16-bit count TCNT1 and OCR1A break into, e.g., TCNT1H and TCNT1L high and low bytes (registers) to accommodate 16 bits
Lecture 11 9

Timer 1 Registers

From short datasheet


page reference is for full datasheet

Note 16-bit quantities need two registers apiece


H and L for high and low

Lecture 11

10

TCCR1A
Upper bits are Compare Output Mode
sets behavior of Compare Match condition can toggle, clear or set OCR bits on Compare Match condition

Lower bits are 2/4 Waveform Generation Mode controls


other two are in TCCR1B 16 possibilities, the ones were likely interested in:
CTC is Clear Timer on Compare match (so starts count all over)

Lecture 11

11

TCCR1B

Weve seen this before, for prescaling


two bits for Input Capture (noise cancel and edge sense) has upper two bits of WGM1 has three CS (Clock Select) bits for prescaling, or ext. clock

Lecture 11

12

OCR1A and TIMSK1

This is the value against which TCNT1 (L & H) is compared (also a OCR1B for alternate value)

TIMSK1 controls what generates interrupts


ICIE: Input Capture Interrupt Enable OCIE A/BOutput Compare Match Interrupt Enable TOIE: Timer Overflow Interrupt Enable: when counter wraps
Lecture 11 13

Finally, TIFR1

Timer1Interrupt Flag Register


ICF1 set if Internal Capture interrupt has occurred OCF1B set if Output Compare match occurs on OCR1B OCF1A set if Output Compare match occurs on OCR1A TOV1 set if OVerflow (wrap) occurs on counter (in certain modes)

Lecture 11

14

What Do We Do with this Power?


Lets set up an interrupt timer to change the state of an LED every 1.5 seconds Need TIMER1 to reach beyond 16 ms
prescale by 1024, so frequency is 15625 ticks/sec thus 1.5 seconds corresponds to 23437 ticks

Set up registers:
TCCR1A to 0 TCCR1B: set WGM12 (for CTC), CS12, CS10 OCR1A to 23437 (OCR1AH = 91, OCR1AL to 141) TIMSK1: set OCIE1A

Make ISR function: ISR(TIMER1_COMPA_vect){}


Lecture 11 15

Example: Interrupt-Driven LED blink


const int LED=13; volatile int state=0;
void setup(){ pinMode(LED,OUTPUT); TCCR1A = 0; TCCR1B = 0; TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS12); TCCR1B |= (1 << CS10); OCR1A = 23437; TIMSK1 |= (1 << OCIE1A); TCNT1 = 0; } void loop(){ delay(10000); }

// use on-board LED

// set up LED for OUTPUT // clear ctrl register A // clear ctrl register B // set bit for CTC mode // set bit 2 of prescaler for 1024x // set bit 0 of prescaler for 1024x // set L & H bytes to 23437 (1.5 sec) // enable interrupt on OCR1A // reset counter to zero

// provide lengthy task to interrupt

ISR(TIMER1_COMPA_vect){ // results in interrupt vector in asm code state += 1; state %= 2; // toggle state 1 --> 0; 0 --> 1 digitalWrite(LED,state); // export value to pin } Lecture 11

16

Comments on Code
The bit values WGM12, CS10, etc. are defined in, e.g., iom328p.h
in hardware/tools/avr/avr/include/avr/ for example:
#define CS10 0 #define CS11 1 #define CS12 2 #define WGM12 3 #define WGM13 4 #define ICES1 6 #define ICNC1 7 #define OCR1A _SFR_MEM16(0x88) #define OCR1AL _SFR_MEM8(0x88) #define OCR1AH _SFR_MEM8(0x89) #define TIMER1_COMPA_vect _VECTOR(11) // Timer1 Compare Match A

Lecture 11

17

Handling the Interrupt


The command ISR(TIMER1_COMPA_vect) creates a vector pointing to the program memory location of the piece that is meant to service the interrupt
near beginning of assembly code listing:
2c: 0c 94 80 00 jmp 0x100 ; 0x100 <__vector_11>

vector 11 is specially defined in ATMega 328 to correspond to a comparison match to OCR1A on timer 1 when this particular sort of interrupt is encountered, itll jump to program location 0x100, where:
various working registers are PUSHed onto the STACK
so the service function can use those registers for itself

the interrupt service functions are performed the STACK contents are POPped back into registers the program counter is reloaded with the pre-interruption value

The vector approach allows use of multiple interrupts


Lecture 11 18

A Custom PWM
ISR(TIMER1_COMPA_vect) { if (state) OCR1A = 31248; else OCR1A = 15624; state += 1; state %= 2; digitalWrite(LED,state); } // two seconds for OFF // one second for ON

When time is up:


if state == 1 (LED ON), set compare register to 2 seconds otherwise (LED OFF), set compare register to 1 second

In this way, you can customize a PWM-like signal arbitrarily


pretty sure this is what the Servo library is doing with TIMER1
Lecture 11 19

Nested Interrupts
Imagine you want to respond to an external interrupt, and perform some follow-up action 2 seconds later
external interrupt arranged via attachInterrupt() within service function, set up TIMER1 counter for timed interrupt in timer ISR, reset TIMER1 to normal mode
disable interrupt condition, or youll keep coming back

Lecture 11

20

References and Announcements


For more on timer interrupts:
http://www.instructables.com/id/Arduino-TimerInterrupts/ http://letsmakerobots.com/node/28278

Announcements
Will review proposals over weekend Offer feedback, redirect, order parts (some) early in week New Lab times:
M 36; T 26; W 36; Th 3:003:45 and 5:156:00; F 36 will have someone there, typically 2 out of the three of us

Light tracker demo/code/paragraphs due 2/12 or 2/13 Exam on Friday 2/15 in class time
Lecture 11 21

You might also like