Interrupts on AVR8

Aha! I’ve managed to setup interrupt vectors table manually, like this:

// NOTE: this must be the first function in the source!
export fn _vectors() void {
    asm volatile ("jmp main");
    asm volatile ("jmp 0");
    asm volatile ("jmp 0");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp __vector_13");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
    asm volatile ("jmp stub");
} 

....
export fn __vector_13() callconv(.Signal) void {
    flipLed();
    avr.tcnt1.* = one_second;
}

I used intblink.zig from here as my starting point. Original version just does not work because of the absence of that jump table.
And now the LED is cheerfully blinking, hooray!

5 Likes