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 }
