Basics
Timers come in handy when you want to set some time interval like your alarm. This can be very precise to a few microseconds.
Timers/Counters are essential part of any modern MCU. Remember it is the same hardware unit inside the MCU that is used either as Timers or Counter. Timers/counters are an independent unit inside a micro-controller. They basically run independently of what task CPU is performing. Hence they come in very handy, and are primarily used for the following:
- Internal Timer: As an internal timer the unit, ticks on the oscillator frequency. The oscillator frequency can be directly feed to the timer or it can be pre-scaled. In this mode it used generate precise delays. Or as precise time counting machine.
- External Counter: In this mode the unit is used to count events on a specific external pin on a MCU.
- Pulse width Modulation(PWM) Generator: PWM is used in speed control of motors and various other applications.
Atmega32 has 3 timer units, timer 0, timer 1 and timer 2 respectively. Let us start our exploration with timer 0.
Timer 0
Timer 0 is a 8 bit timer. It basically means it can count from 0 to 255
Timer 0 Registers
TCNT0: Timer/Counter Register 0
TCNT0
|
Timer/Counter 0
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0
|
TCCR0: Timer/Counter Control Register
TCCR0
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0
|
FOC0 |
WGM00 |
COM01 |
COM00 |
WGM01 |
CS02 |
CS01 |
CS00
|
D2 |
D1 |
D0 |
Clock Source
|
CS02 |
CS01 |
CS00 |
Freq
|
0 |
0 |
0 |
No Clock (Stopped)
|
0 |
0 |
1 |
Clk
|
0 |
1 |
0 |
Clk/8
|
0 |
1 |
1 |
Clk/64
|
1 |
0 |
0 |
Clk/256
|
1 |
0 |
1 |
Clk/1024
|
1 |
1 |
0 |
Clk/T0-Falling edge
|
1 |
1 |
1 |
Clk/T0-Rising Edge
|
D6 |
D3 |
PWM
|
WGM00 |
WGM01 |
Mode
|
0 |
0 |
Normal
|
0 |
1 |
CTC (Clear timer on compare match)
|
1 |
0 |
PWM (Phase correct)
|
1 |
1 |
Fast PWM
|
TIFR: Timer/Counter Interrupt Flag Register
TIFR
|
Timer/Counter 0
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0
|
OCF2 |
TOV2 |
ICF1 |
OCF1A |
OCF1B |
TOV1 |
OCF0 |
TOV0
|
Timer 1
Timer 2