Trouble with Timer 0
return 0
resets the device. Use while(1);
instead, to make it wait indefinitely.
Returning from main
does not reset the device (it would start up again and do it all over in that case). It calls exit
which turns interrupts off and loops indefinitely.
00000068 <__ctors_end>:
68: 11 24 eor r1, r1
6a: 1f be out 0x3f, r1 ; 63
6c: cf ef ldi r28, 0xFF ; 255
6e: d8 e0 ldi r29, 0x08 ; 8
70: de bf out 0x3e, r29 ; 62
72: cd bf out 0x3d, r28 ; 61
74: 0e 94 52 00 call 0xa4 ; 0xa4 <main>
78: 0c 94 61 00 jmp 0xc2 ; 0xc2 <_exit>
...
000000a4 <main>:
a4: 80 e2 ldi r24, 0x20 ; 32
a6: 84 b9 out 0x04, r24 ; 4
a8: f8 94 cli
aa: 8f ef ldi r24, 0xFF ; 255
ac: 87 bd out 0x27, r24 ; 39
ae: 82 e0 ldi r24, 0x02 ; 2
b0: 80 93 6e 00 sts 0x006E, r24
b4: 84 bd out 0x24, r24 ; 36
b6: 78 94 sei
b8: 85 e0 ldi r24, 0x05 ; 5
ba: 85 bd out 0x25, r24 ; 37
bc: 80 e0 ldi r24, 0x00 ; 0
be: 90 e0 ldi r25, 0x00 ; 0
c0: 08 95 ret
000000c2 <_exit>:
c2: f8 94 cli
000000c4 <__stop_program>:
c4: ff cf rjmp .-2 ; 0xc4 <__stop_program>
You can see at address 0x74 it calls main, and then jumps to exit. exit
turns off interrupts.
With interrupts off your ISR will not toggle pin 13.