AVR timer library
Simple AVR millisecond timer library for ATmega88/168/328.timer-example.cpp
#include <stdio.h> #include <avr/interrupt.h> #include "timer.h" #include "serial.h" volatile int counter; void timerFunc() { printf("timerFunc\r\n"); if (++counter == 5) { // Stop timer after 5 runs. stopTimer(); printf("stopping timer\r\n"); } } int main() { serialInit(); counter = 0; // Set timer to use function timerFunc setTimerCallback(timerFunc); // Start timer with an interval of 1.5 seconds setTimer(1000); // enable interrupts sei(); for (;;); // loop forever }
timer.h
#ifndef TIMER_H #define TIMER_H void setTimer(uint16_t milliseconds); void startTimer(); void stopTimer(); void setTimerCallback(void (*func)()); #endif
timer.cpp
#include <avr/interrupt.h> #include "timer.h" void (*timerCallback)(); volatile uint16_t millis; uint16_t targetMillis; void setTimer(uint16_t milliseconds) { targetMillis = milliseconds; startTimer(); } void startTimer() { // start timer with interrupt every millisecond. // Enable timer, CLKio/8, Clear Timer on Compare TCCR1A = 0; TCCR1B = (1 << WGM12) | (1 << CS11); uint16_t ticks = (F_CPU/8)/1000; // Set timer to 0 as starting value TCNT1 = 0; // Disable force output compare TCCR1C = 0; // Set timer compare to calculated value OCR1A = ticks; // Enable timer compare interrupt TIMSK1 = (1 << OCIE1A); } void stopTimer() { // disable timer interrupts TIMSK1 = 0; } void setTimerCallback(void (*func)()) { timerCallback = func; } ISR(TIMER1_COMPA_vect) { millis++; if (millis == targetMillis) { millis = 0; timerCallback(); } }