         g_transition_steps = transition_steps;
 
         // start the transition and get last color
-        evaluate(g_cur_pattern, millis() - g_pattern_start, &g_begin_color);
+        evaluate(g_cur_pattern, cmillis() - g_pattern_start, &g_begin_color);
 
         // get the first color of the new pattern
         evaluate(g_next_pattern, 0, &g_end_color);
 
-        g_transition_end = millis() + (uint32_t)transition_steps;
+        g_transition_end = cmillis() + (uint32_t)transition_steps;
         return;
     }
     next_pattern();

    uint8_t  i;
    color_t  col;

    t = millis() % (ERROR_DELAY * 2);
    if (t > ERROR_DELAY)
    {
        switch(g_error)

// ---- prototypes -----
void next_pattern(void);

#if F_CPU == 16000000UL
#define    TIMER1_INIT         0xF82F
#else
#define    TIMER1_INIT         0xFC17
#endif
#define    TIMER1_FLAGS        _BV(CS11); // 8Mhz / 8 = 1us per tick.

volatile uint32_t g_time = 0;
uint16_t g_timer_init = TIMER1_INIT;

ISR (TIMER1_OVF_vect)
{
    g_time++;
    TCNT1 = g_timer_init;
}

uint32_t cmillis(void)
{
    uint32_t temp;

    noInterrupts();
    temp = g_time;
    interrupts();

    return temp;
}

void show_color(color_t *col)
{
    uint8_t j;
