#define HAVE_TICK static union { uint32_t u32; uint8_t u8[4]; } systick = { .u32 = 0 }; ISR(TIMER1_COMPA_vect) { systick.u32++; // dbg_dump_ret(); } static void uart_puttick(void) { uint16_t frac = TCNT1; _uart_putch('@'); uart_puthex(systick.u8[3]); uart_puthex(systick.u8[2]); uart_puthex(systick.u8[1]); uart_puthex(systick.u8[0]); _uart_putch('.'); uart_puthex16(frac); #if DEBUG_SP _uart_putch('~'); uint8_t spl, sph; asm ("\n\ in %[spl], 0x3d\n\ in %[sph], 0x3e\n\ " : [spl] "=r" (spl), [sph] "=r" (sph)); uart_puthex(sph); uart_puthex(spl); #endif _uart_putch(' '); } static void tick_init(void) { TCCR1A = 0; TCCR1B = (1 << WGM12) | (1 << CS12) | (0 << CS11) | (0 << CS10); // 8 MHz / 256 = 31250 Hz asm volatile ("" ::: "memory"); TCNT1 = 0; OCR1A = 31249; // 1 Hz asm volatile ("" ::: "memory"); TIFR1 = (1 << OCF1A); TIMSK1 = (1 << OCIE1A); }