gpt4 book ai didi

c - 中断是由于中断使能之前发生的变化而发生的

转载 作者:行者123 更新时间:2023-11-30 16:59:15 26 4
gpt4 key购买 nike

我正在使用 Arduino Uno 和 Atmega328p 微 Controller 。我正在尝试使用 INT1 作为软件中断。我根据外部信息手动将 INT1 关联的 PORTD3 设置为高或低。我想要的是在设备启动时将引脚设置为高电平或低电平,然后在引脚上启用中断,如果我在启用中断之前将引脚设置为高电平,则不会导致中断。

我在哪里启用中断似乎并不重要——如果我在某个时刻更改了引脚的状态,那么一旦启用中断就会发生。这是代码片段:

int main(void)
{
DDRD |= (1<<DDD7)|(1<<DDD3);//7 for siren 3 for software int1
USART_Init(MYUBRR);//Initialize USART
while(door!='C' && door!='O'){//get door state on startup
door = getDoorState();
}
if(door=='O')
PORTD |= 1<<PORTD3;
else
PORTD &= ~(1<<PORTD3);
EIFR &= ~(1<<INTF1);//clear flag bit before enable, I'd heard this may help????
EIMSK |= (1<<INT1);//enable door switch interrupt
EICRA |= (1<<ISC00)|(1<<ISC10);//int1 and int0 set for any logical change

sei();//global interrupt enable

while (1)
{}
}

一旦通过调用 sei() 启用全局中断,如果 PORTD3 为高电平,则无论 PORTD3 在何处设置为高电平或 sei() 在何处,都会发生中断。理想情况下,调用 sei() 永远不会导致此代码中断。

最佳答案

4386427 是正确的。通过将该位设置为 1(而不是 0)来清除该位。对我来说似乎违反直觉,所以它让我失望,但现在它可以工作了。

EIFR |= (1<<INTF1);

关于c - 中断是由于中断使能之前发生的变化而发生的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38288474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com