Microcontrollers
Class 4: Timer/Counters
March 28, 2011
Outline
Timer/Counter Introduction
Timers as a Timebase
Timers for PWM
Outline
Timer/Counter Introduction
Timers as a Timebase
Timers for PWM
Outline
Timer/Counter Introduction
Timers as a Timebase
Timers for PWM
Review
The story so far...
I Bits and shifting
I Analog and Digital input and output
I Serial stuffies
I Interrupts
I Now we get to give our programs a sense of timing
Timer/Counter Overview
The big picture
I Weve been using lots of software counters:
for(i=0; i<8; i++)...
I The Mega88 chip has 3 built-in hardware counters that we
can use instead
I Why? Theyre more efficient, reliable, and they free up our
software to do other things
I Why timer/counter? Well, internally theyre really counters
but if you hook them up to a clock, counting clock pulses,
youve got a timer.
I They can also count hardware events (pin toggling, etc) but I
wont run any examples of that here. Bother me by e-mail if
youre interested.
Timer/Counter Hardware Block Diagram
Timers
Setup
I Timers are my least-favorite thing to configure on the AVR,
but its not so bad once youve got the basics down.
I First need a source: what youre counting
well use built-in clocks, and will need to set a prescaler
I Hardware compares the contents of two special memory
registers (OCR0A and OCR0B) to the current counter value
I When the counter equals TOP, three things can happen:
reset the timer
fire an OC interrupt
set, clear, or toggle a dedicated output pin
I What happens depends on which mode youre in
I In addition to the OCRs, there is also an interrupt available
for when the timer overflows (wraps back around to 0)
Modes
What can we do with these timers?
I Normal mode: just counts up from 0 to 255. Boring, but
useful for a quick-and-dirty timebase using the overflow
interrupt.
I Clear Timer on Compare (CTC) mode: Count up to value in
OCR0A (not necessarily 255), then go back to zero. Provides
different timing cycle durations.
I Fast PWM mode: Counts 0..255, does things on output pins
when counter hits the OCR0A/B values
I Phase-correct PWM mode: first counts up, then counts down
Modes
Configuration
Putting the right bits in the right registers
I Control registers: TCCR0A, TCCR0B
selects clock source, counting mode, and pin-output
I Interrupt mask register: TIMSK0
selects which interrupts to fire (overflow, compare)
I Output compare registers: OCR0A, OCR0B
put your compare-values in here,
changes duty-cycle (both, in some modes) or frequency
(OCR0A only)
I Examples for details!
Waveform Select Modes (p. 108)
Clock Select (p. 110)
Output Mode (p. 106)
Outline
Timer/Counter Introduction
Timers as a Timebase
Timers for PWM
Simple Clock
Tick, tick, tick
I Im surprised by the number of times I see people buy clock
modules for their hardware projects
I Add in a crystal (next class) and youll have a pretty-darn
accurate timebase
I The basics:
Set up global time-keeping variables
Set up a CTC timer to interrupt once every (howeverlong)
In the interrupt, increment your various counters (lightweight!)
In the mainloop, use the time variables
I Initialization for the timer: mode, clock prescale, interrupt
enables
I See the example: counterClock.c
Outline
Timer/Counter Introduction
Timers as a Timebase
Timers for PWM
Timer-based PWM
Dimming LEDs in hardware
I Pins labelled OCxxx are directly connected to the output
compare logic
I Result: you can set OCR0A, OCR0B and get PWM done for
you automatically
I Timer1 is a 16-bit timer: has enough resolution for easy servo
driving
I Setup:
Select PWM mode (well use fast)
Set up the output pin modes
I See example: counterPWM.c
Next Class
Odds and Ends
I Special requests??
I PROGMEM, EEPROM, and funny memory types
I Moving past the classboard: how to wire up your own circuits
from the ground up
I Turn your classboard into a bare-chip programmer! (Optional)
The End
Outline