6 * - no prescale: 59.595ns
7 * - prescale 64: 3.814us
8 * - prescale 256: 15.256us
9 * - prescale 1024: 61.025us
12 static void timer_intr(void);
14 void init_timer(int tm, unsigned long rate_hz, void (*intr)(void))
16 static const unsigned long clk[] = {F_CLK, F_CLK / 64, F_CLK / 256, F_CLK / 1024};
21 count = clk[pscl] / rate_hz;
22 } while(count >= 65536 && ++pscl < 4);
24 if(pscl >= 4) return; /* impossible rate */
27 REG_TMCNT_L(tm) = 65536 - count;
29 interrupt(INTR_TIMER0 + tm, intr);
30 unmask(INTR_TIMER0 + tm);
31 REG_TMCNT_H(tm) = TMCNT_IE;
33 REG_TMCNT_H(tm) |= TMCNT_EN | pscl;
36 void reset_msec_timer(void)
38 REG_TM0CNT_H &= ~TMCNT_EN;
39 interrupt(INTR_TIMER0, timer_intr);
41 REG_TM0CNT_L = 65535 - 16779;
42 REG_TM0CNT_H |= TMCNT_IE | TMCNT_EN;
46 void delay(unsigned long ms)
48 unsigned long end = timer_msec + ms;
49 while(timer_msec < end);
52 static void timer_intr(void)