struct pwm_s { int port; int interval_len; int interval_done; } pwm_s g_pwm[3]; void irq_handler(int msec_elapsed) { controll_handler(msec_elapsed); for (int i = 0; i < 3; i++) pwm_handler(i, msec_elapsed); } void controll_handler(int msec_elapsed) { // handle fades, set pwm intervals } void pwm_handler(int i, int msec_elapsed) { g_pwm[i].interval_done += msec_elapsed; if (g_pwm[i].interval_done >= g_pwm[i].interval_len) { flip_port(g_pwm[i].port); g_pwm[i].interval_done = 0; } }