Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded 为什么在更改中断方法时我的输入信号定时会发生变化?_Embedded_Interrupt_Avr_Atmega - Fatal编程技术网

Embedded 为什么在更改中断方法时我的输入信号定时会发生变化?

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引脚上的边缘或逻辑变化触发中断时

正在使用的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引脚上的边缘或逻辑变化触发中断时 请求时,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