打印
[AVR单片机]

WINAVR 20100110 编译

[复制链接]
1345|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fcw|  楼主 | 2015-12-18 10:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
huangxz| | 2015-12-18 22:17 | 只看该作者
中断肯定是reti返回的,不知道楼主是如何知道不是用reti返回的。

使用特权

评论回复
板凳
fcw|  楼主 | 2015-12-19 11:42 | 只看该作者
本帖最后由 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


使用特权

评论回复
地板
fcw|  楼主 | 2015-12-22 10:51 | 只看该作者
把中断函数void TIMER0_OVF_vect (void)改为ISR(TIMER0_OVF_vect)就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

fcw

21

主题

66

帖子

1

粉丝