Arduino Timers
Reference: Russell Chapter 7
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering
Timers in Arduino
Arduinos wiring library has many useful time related built in
functions: delay(), millis() and micros() and delayMicroseconds(). also uses time related function.
The PWM analogWrite(), the tone() and the noTone() function Even the Servo library uses timers.
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering
Wiring delay() function
Pauses the program for the
amount of time (in miliseconds) specied as parameter. in a second.
There are 1000 milliseconds Syntax: delay(ms) Where ms is the number of
milliseconds to pause (unsigned long).
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering
Wiring analogWrite() function
Function analogWrite() writes an analog value (PWM wave) to a pin. Can be used to light a LED at varying brightnesses or drive a motor at
various speeds.
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering
Wiring analogWrite() function
After a call to analogWrite(), the pin will generate a steady square The frequency of the PWM signal is approximately 490 Hz. On the Arduino UNO, this function works on pins 3, 5, 6, 9, 10, and
11. You do not need to call pinMode() to set the pin as an output before calling analogWrite(). analog pins or the analogRead function.
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves (
[email protected]), College of Engineering
wave of the specied duty cycle until the next call to analogWrite().
The analogWrite function has nothing whatsoever to do with the
What is a timer?
A timer is a piece of hardware built-in the
Arduino controller. time events. registers.
It is like a clock, and can be used to measure The timer can be programmed by some special You can congure the pre-scalar for the timer,
ATmega328. the mode of operation and many other things.
The controller of the Arduino is the Atmel AVR
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves (
[email protected]), College of Engineering
What is a timer?
ATmega328 has 3 timers, called timer0,
timer1 and timer2. is a 16bit timer.
Timer0 and timer2 are 8bit timers, while timer1 More bits means higher timing resolution. Remember, 8bits has 256 different states while
16bit has 65536.
All timers depends on the system clock of your
Arduino system, which is 16MHz for the Arduino UNO.
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering
Timer0
Timer0 is a 8bit timer. In the Wiring libraries, timer0 is used for
the commonly used timer functions.
You know... delay(), millis() and micros(). Warning: If you change the timer0
registers, this may inuence the Arduino timings function. mess up a timer register, just upload a new program.
Changes are not permanent: If accidentally
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering
Timer1
Timer1 is a 16bit timer. In the Wiring libraries, this timer is used for the servo library.
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering
Timer2
Timer2 is a 8bit timer. In the Wiring libraries, this timer is
used for the tone() function.
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering
Frequency review (from wikipedia)
Frequency is the number of occurrences of a repeating event per
unit time.
The period is the duration of one cycle in a repeating event, so
the period is the reciprocal of the frequency.
f = 1 /T For example, if a newborn baby's heart beats at a frequency of Click for a neat frequency animation.
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering
120 times a minute, its period (the interval between beats) is half a second.
Prescaler or count-divider
A prescaler is an electronic counting circuit used to reduce a high frequency electrical signal to a lower frequency by integer division.
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering
How to dene your own timer
In the ATmega328 there are 6 important timer registers, that can be
interfaced with to adjust the Timer behavior.
TCCRx - Timer/Counter Control Register. Prescaler is congured here. TCNTx - Timer/Counter Register. The actual timer value is stored here. OCRx - Output Compare Register ICRx - Input Capture Register (only for 16 bit timer) TIMSKx - Timer/Counter Interrupt Mask Register. To enable/disable
timer interrupts. interrupt.
TIFRx - Timer/Counter Interrupt Flag Register. Indicates a pending timer
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves (
[email protected]), College of Engineering
Clock select and timer frequency
Different clock sources can be independently selected for each timer. To calculate the timer frequency (e.g. 2Hz using timer1) you need: CPU frequency: 16 MHz for Arduino UNO. Maximum timer counter value: 256 for 8bit timer, 65536 for 16bit. A prescaler value: either 256 or 1024. Divide CPU frequency with a prescaler (16000000 / 256 = 62500). Divide result through the desired frequency (62500 / 2Hz = 31250). Verify the result against the maximum timer counter value (31250 <
65536 success). If fail, choose bigger prescaler.
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves (
[email protected]), College of Engineering
Calculating the prescaler
This can be done on the website: http://www.et06.dk/atmega_timers/
As calculated on previous slide.
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves (
[email protected]), College of Engineering
Blinking LED with compare match interrupt
#define ledPin 13 void setup(){ pinMode(ledPin, OUTPUT); // initialize timer1 noInterrupts(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; //compare match OCR1A = 31250; TCCR1B |= (1 << TCCR1B |= (1 << TIMSK1 |= (1 << interrupts(); } //timer compare interrupt service routine // toggle LED pin ISR(TIMER1_COMPA_vect){ digitalWrite(ledPin, digitalRead(ledPin) ^ 1); } void loop() { // your program here... } // disable all interrupts
Timer1 is in CTC mode
(clear timer on compare match). frequency of 2Hz.
The timer is congured for a
register 16MHz/256/2Hz WGM12); CS12); OCIE1A); // // // // CTC mode 256 prescaler enable timer compare interrupt enable all interrupts
CPE 355 - Real Time Embedded Kernels - Spring 12 Nuno Alves ([email protected]), College of Engineering