// Timer für mehrere unabhängige Wartezeiten // Timer0 setup fehlt hier, muss nach eigenen Wünschen auf z.B. 1ms oder 10ms erstellt werden // CTC-Mode, Prescale, Compare Match A interrupt für die gewünschte Basiszeit volatile uint16_t timer_unit; /*************************************************************************/ ISR(TIMER0_COMPA_vect) // ISR für CTC { timer_unit++; // time steps according to timer setup } /*************************************************************************/ uint16_t get_atomic_time() { uint16_t timeticks_ret; ATOMIC_BLOCK(ATOMIC_FORCEON) // Interruptsperre wg. 16-Bit-Zugriff { timeticks_ret = timer_unit; } return timeticks_ret; } /*************************************************************************/ uint8_t time_expired(uint16_t time, uint16_t *time_alt) // für max. 65535 * timer_unit { // time_alt wird übergeben für mehrere unabhängig laufende Zeiten uint8_t time_exp=0; int temp; uint16_t time_actual = get_atomic_time(); temp = (time_actual - *time_alt); if ( temp >= time) { *time_alt = time_actual; time_exp=1; } return time_exp; } /*************************************************************************/ // in main dann: wait = 50; if(time_expired(wait, &tim1_old)) {...} // tue dies wait = 120; if(time_expired(wait, &tim2_old)) {...} // tue jenes wait = 210; if(time_expired(wait, &tim3_old)) {...} // tue drittes if(time_expired(wait, &tim3_old)) {...} // und nochmal nach erneuten 210 Ticks // Maximale Zeit: Tickperiode * 65535