avr-task-scheduler

AVR mcu bare metal task scheduler
Index Commits Files Refs README LICENSE
src/millis.c (670B)
   1 #include "millis.h"
   2 
   3 #include <avr/io.h>
   4 #include <avr/interrupt.h>
   5 #include <stddef.h>
   6 
   7 static volatile uint32_t ms = 0;
   8 void (*callback)(void) = NULL;
   9 
  10 ISR(TIMER0_COMPA_vect) {
  11     ms++;
  12     if (callback != NULL) {
  13         callback();
  14     }
  15 }
  16 
  17 // normal mode, prescaler 64, max value 249: exactly 1 interrupt per ms
  18 void millis_init(void (*new_callback)(void)) {
  19     cli();
  20     TCCR0A = (1 << WGM01);
  21     TCCR0B = (1 << CS01) | (1 << CS00);
  22     TIMSK0 = (1 << OCIE0A);
  23     OCR0A = 249;
  24     sei();
  25 
  26     callback = new_callback;
  27 }
  28 
  29 uint32_t millis(void) {
  30     uint32_t ms_now;
  31     uint8_t sreg = SREG;
  32 
  33     cli();
  34     ms_now = ms;
  35     SREG = sreg;
  36 
  37     return ms_now;
  38 }