Skip to content
Arduino/Avr compatible libraries to control timers
C
Latest commit 7030364 May 24, 2011 @jvalencia80 added C++ compatibility
Failed to load latest commit information.
example updated Readme.md May 20, 2011
Readme.md added C++ compatibility May 24, 2011
atmega-timers.c added some speed improvements May 23, 2011
atmega-timers.h added C++ compatibility May 24, 2011

Readme.md

atmega-timers

atmega-timers is an Arduino/Avr compatible library to control timers 0, 1 and 2.

Description

This library contains several functions to use the timers in different ways.

  • One way is using the timers to execute a function on a defined period, indefinitely.

    void timer0(uint8_t prescaler, uint8_t ticks, void (*f)())
    void timer1(uint8_t prescaler, uint16_t ticks, void (*f)())
    void timer2(uint8_t prescaler, uint8_t ticks, void (*f)())
    
    void timer0_stop()
    void timer1_stop()
    void timer2_stop()
    
    • prescaler are predefined constants in the header file. For example:

      TIMER0_PRESCALER_8
      TIMER0_PRESCALER_64
      ...
      
    • ticks are the number of steps the timer will count. Current limits are:

      timer0: 0 - 255
      timer1: 0 - 65535
      timer2: 0 - 255
      
    • f is the function to execute after all ticks are consumed. Must be declared void with no parameters:

      void sample() {
          ...
      }
      
    • timerX_stop() disables that timer by setting prescaler to "none". Energy saving feature.

    • You can disable interrupt definition if you want to use that timer for your own purposes. Just comment or delete one of those lines inside atmega-timers.h file:

      #define ENABLE_TIMER0
      #define ENABLE_TIMER1
      #define ENABLE_TIMER2
      
  • Other way is implementing the traditional delay routine. The function will block-wait until the count is done.

    void wait0(uint8_t prescaler, uint8_t ticks)
    void wait1(uint8_t prescaler, uint16_t ticks)
    void wait2(uint8_t prescaler, uint8_t ticks)
    
    • prescaler are predefined constants in the header file. For example:

      TIMER0_PRESCALER_8
      TIMER0_PRESCALER_64
      ...
      
    • ticks are the number of steps the timer will count. Current limits are:

      timer0: 0 - 255
      timer1: 0 - 65535
      timer2: 0 - 255
      

Usage

You need to know your CPU clock frequency before setting the timers.

  1. Divide CPU clock by selected prescaler:

    16000000 / 64 = 250000 Hz
    
  2. Get timer period:

    1 / 250000 = 4 us
    
  3. Divide your desired period by timer period, for example 20 milliseconds:

    20000 us / 4 us = 5000 ticks
    
  4. Use timer1, as timer0 and timer2 can't support more than 256 ticks:

    timer1(TIMER1_PRESCALER_64, 5000U, do_something);
    
  5. Enable global interrupts:

    sei();
    

Sample Code

  • Using wait* functions:

    #include <avr/io.h>
    #include "atmega-timers.h"
    
    // toggle PORTB status
    void toggle() {
        static uint8_t output = 0xff;
    
        PORTB = output;
        output = !output;
    }
    
    void main() {
        // set all pins of PORTB as output
        DDRB = 0xff;
    
        // toggle PORTB every 500ms (using 16Mhz clock)
        while(1) {
            toggle();
            wait1(TIMER1_PRESCALER_1024, 7812U);
        }
    }
    
  • Using timer* functions:

    #include <avr/io.h>
    #include "atmega-timers.h"
    
    // toggle PORTB status
    void toggle() {
        static uint8_t output = 0xff;
    
        PORTB = output;
        output = !output;
    }
    
    void main() {
        // set all pins of PORTB as output
        DDRB = 0xff;
    
        // toggle PORTB every 500ms (using 16Mhz clock)
        timer1(TIMER1_PRESCALER_1024, 7812U, toggle);
    
        // enable global interrupts
        sei();
    
        while(1) {
            // your code goes here
        }
    }
    

Both examples have the same result.

Running it in Arduino

  1. Download the source code by using the Download Button on this page
  2. Rename and install the library as: {arduino_path}/libraries/AtmegaTimers
  3. Open Arduino and go to "Import Library" option. Choose AtmegaTimers from menu.

Atmel Model Support

It should work with a long range of devices, for example:

  • atmega48, 88, 168, 328
  • atmega164, 324, 644, 1284
  • atmega640, 1280, 1281, 2560, 2561
  • atmega325, 645
  • ...
Something went wrong with that request. Please try again.