本帖最后由 fcw 于 2015-12-19 11:44 编辑
我看中断只能进入一次,查看编译的汇编发现返回用了RET, 在中断结束加入SEI()就可以正常进入中断程序了,汇编代码如下
0000016a <__vector_23>:
void TIMER0_OVF_vect (void)
{
TCNT0 = 0x01; //reload counter value
16a: 81 e0 ldi r24, 0x01 ; 1
16c: 86 bd out 0x26, r24 ; 38
d++;
16e: 80 91 00 02 lds r24, 0x0200
172: 8f 5f subi r24, 0xFF ; 255
174: 80 93 00 02 sts 0x0200, r24
if(d==0x05)
178: 85 30 cpi r24, 0x05 ; 5
17a: 29 f4 brne .+10 ; 0x186 <__vector_23+0x1c>
{
PORTB ^= 1<<PB7; //PB7取反
17c: 85 b1 in r24, 0x05 ; 5
17e: 80 58 subi r24, 0x80 ; 128
180: 85 b9 out 0x05, r24 ; 5
d=0;
182: 10 92 00 02 sts 0x0200, r1
}
sei();
186: 78 94 sei
}
188: 08 95 ret
|