thtio 发表于 2011-9-16 00:44:32

菜鸟求助 AVR外部中断问题

闲来无事 拿起书本学习AVR 用M16做关于中断的实验时 有个问题需要请教一下大家
void interrupt_init(void)
{
GICR|=0xC0;
MCUCR=0x0A;
MCUCSR=0x00;
GIFR=0xC0;
}

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
// INT2: Off
SIGNAL(SIG_INTERRUPT0)
{
int m;
for(m=0;m<8;m++)
{
PORTD=~(0x01<<m);
delay_ms(500);
    }
}

main()
{
DDRD=0xff;
PORTD=0xff;
SREG|=0x80;
……}

现象是PORTD的LED一直处于流水状态 一直在执行中断程序 是不是因为中断程序使用了PD2做输出 触发INT0导致死循环不过这样也解释不通 中断我用的是SIGNAL
资料说宏INTERRUPT 的用法与SIGNAL 类似,区别在于SIGNAL 执行时全局中断触发位被清除、其他中断被禁止,INTERRUPT 执行时全局中断触发位被置位、其他中断可嵌套执行。

而当我在中断程序中不使用PD2时 就不会出现这个情况 请教高手们这到底是神马情况呢

machao 发表于 2011-9-16 15:43:07

仔细看手册:
http://cache.amobbs.com/bbs_upload782111/files_45/ourdev_676873SRR21W.jpg
(原文件名:未标题-1 拷贝.jpg)

thtio 发表于 2011-9-16 19:05:26

哦 原来如此 还是要仔细看看手册 谢谢马老师 顺便赞一下你的书 里面的问题很有意思

thtio 发表于 2011-9-16 19:14:32

不过马老师 这个我理解 不管PD2是输出或者输入 只要引脚电平发生变化就能触发INT0 但是在中断服务程序中 我使用了SIGNAL来写中断服务程序 那么在执行终端服务程序的时候 全局中断触发标志是被清0的呀 应该是在程序一进入中断时 MCU自动完成程序的跳转 应该也包括自动把全局中断触发标志清0的过程呀

machao 发表于 2011-9-16 20:17:52

进入中断把全局中断允许(叫触发不太合适)标志清0,同时也把INT0的中断标志位清0,注意,标志位是第1次的。

你在中断中,把I/O输出从0为1,改变了一次,因此产生了又一次的INT0中断标志位,这个标志位是不会清除的,但此时不会响应,因为全局中断允许标志还是0

当第1次中断完成后,退出中断,程序会把全局中断允许标志置1,保证后面可以响应中断。

此时由于INT0的中断标志已经为1,所以再一次进入INT0的中断,然后又..........

建议你参考我的教程认真学习。

thtio 发表于 2011-9-16 22:36:52

哟西 明白了 谢谢你的解答
页: [1]
查看完整版本: 菜鸟求助 AVR外部中断问题