//timer02.c // use atmega timer2 as main system timer instead of timer0 // timer0 is used for fast pwm (OC0B output) // original OVF handler is disabled #include #include #include uint8_t timer02_pwm0 = 0; void timer02_set_pwm0(uint8_t pwm0) { if (timer02_pwm0 == pwm0) return; if (pwm0) { TCCR0A |= (2 << COM0B0); OCR0B = pwm0 - 1; } else { TCCR0A &= ~(2 << COM0B0); OCR0B = 0; } } void timer02_init(void) { //save sreg uint8_t _sreg = SREG; //disable interrupts for sure cli(); //mask timer0 interrupts - disable all TIMSK0 &= ~(1<> 3) #define FRACT_MAX (1000 >> 3) extern volatile unsigned long timer0_overflow_count; extern volatile unsigned long timer0_millis; unsigned char timer0_fract = 0; ISR(TIMER2_OVF_vect) { // copy these to local variables so they can be stored in registers // (volatile variables must be read from memory on every access) unsigned long m = timer0_millis; unsigned char f = timer0_fract; m += MILLIS_INC; f += FRACT_INC; if (f >= FRACT_MAX) { f -= FRACT_MAX; m += 1; } timer0_fract = f; timer0_millis = m; timer0_overflow_count++; }