Embedded 为什么在更改中断方法时我的输入信号定时会发生变化?
正在使用的AVR是ATmega2560 我得到了一个脉冲宽度为1秒的输入信号 此信号连接到我的AVR(INT0)上的外部中断引脚 INT0的初始化如下所示: 代码:Embedded 为什么在更改中断方法时我的输入信号定时会发生变化?,embedded,interrupt,avr,atmega,Embedded,Interrupt,Avr,Atmega,正在使用的AVR是ATmega2560 我得到了一个脉冲宽度为1秒的输入信号 此信号连接到我的AVR(INT0)上的外部中断引脚 INT0的初始化如下所示: 代码: DDRD&=~(1来自第15.2.2节,第114页 注: 1.n=3、2、1或0。更改ISCn1/ISCn0位时,必须通过清除EIMSK中的中断启用位来禁用中断 寄存器。否则,位更改时可能会发生中断 编辑: EIFR–外部中断标志寄存器 •位7:0–INTF7:0:外部中断标志7-0 当INT7:0引脚上的边缘或逻辑变化触发中断时
DDRD&=~(1来自第15.2.2节,第114页
注:
1.n=3、2、1或0。更改ISCn1/ISCn0位时,必须通过清除EIMSK中的中断启用位来禁用中断
寄存器。否则,位更改时可能会发生中断
编辑:
EIFR–外部中断标志寄存器
•位7:0–INTF7:0:外部中断标志7-0
当INT7:0引脚上的边缘或逻辑变化触发中断时
请求时,INTF7:0变为set(一)。如果SREG中的I位和
在EIMSK中设置相应的中断启用位INT7:0(一个),
MCU将跳转到中断向量。当
中断程序被执行。或者,该标志可以
通过向其写入逻辑1来清除
尝试清除中断中的标志
EIFR = (1 << INT0);
EIFR=(1我添加了EIMSK&=~(1@user791953)您也可以通过向其写入1来尝试清除该标志。嗯,我已经在else if中添加了EIFR=(1),不需要清除ISC00位,就像您在上面一行上执行赋值(从而清除其余内容)一样。所做的只是再次重新分配EICRA。
ISR(INT0_vect)
{
if(EICRA == 0x02)
{
// falling edge detected
doFallingEdgeFunction_lightLED0();
// quickly change the trigger to capture opposite edge
EICRA |= (1 << ISC00) | (1 << ISC01); // trigger on rising edge
}
else if(EICRA == 0x03)
{
doRisingEdgeFunction_lightLED1();
// change trigger on falling edge
EICRA = (1 << ISC01);
EICRA &= ~(1 << ISC00);
}
}
EIFR = (1 << INT0);
EIFR |= (1<< INT0); // DO NOT USE