Arduino AVR中断掩码清除

Arduino AVR中断掩码清除,arduino,avr,arduino-uno,firmata,Arduino,Avr,Arduino Uno,Firmata,我正在使用firmata协议构建一些软件,在arduino上提供一些功能,并通过USB管理板 我用零交叉连接arduino调光器,并编写自定义协议命令来更改调光器的状态。所有工作正常,但灯有时会闪烁 我认为问题在于firmata正在使用AVR cli宏清除中断掩码,然后指示灯闪烁 是否有任何方法来阻止清除中断掩码安全吗? 是否有任何方法可以在不中断的情况下实现调光器?您不能阻止特定指令的执行 我不知道提到的任何图书馆,但可以根据原则回答: 通常,cli和sei指令对用于确保在某些中断干扰例程时中

我正在使用firmata协议构建一些软件,在arduino上提供一些功能,并通过USB管理板

我用零交叉连接arduino调光器,并编写自定义协议命令来更改调光器的状态。所有工作正常,但灯有时会闪烁

我认为问题在于firmata正在使用AVR cli宏清除中断掩码,然后指示灯闪烁

是否有任何方法来阻止清除中断掩码安全吗?
是否有任何方法可以在不中断的情况下实现调光器?

您不能阻止特定指令的执行

我不知道提到的任何图书馆,但可以根据原则回答:

通常,cli和sei指令对用于确保在某些中断干扰例程时中断的代码段的原子执行

通常不会丢失中断,因为中断标志仍然设置,并且ISR在sei指令之后执行。但由于没有中断队列,每种中断只能保留一个

如果您的ISR逻辑期望立即调用,也可能出现一些小故障-例如,因为在管脚更改中断上检查当前管脚状态,或者因为它期望某些计时器计数器的计数不超过几个周期,并在比特角调制的情况下设置新的比较值,例如,在这种情况下,计时器可能在ISR开始之前已经计数超过新的比较值,并产生小故障

如果是这种情况,我认为您只有很少的选择:

查看firmata驱动程序的源代码,并尝试缩小cli和sei`之间的源代码,以减少中断被锁定的时间。 尝试修复调光器库以处理ISR延迟执行的情况。也许可以消除对这些事件的视觉感知 但是,也许可以考虑以下事项之一:

这两个库的设计不兼容 AVR在适当处理这两个方面的速度都很慢,因此它总是会丢失一些ISR
如果您坚持使用AVRs-可能将外部协议解码保留在一个上,并使用非常简单的协议构建一个UART/SPI通道,然后在另一个上运行调光灯控制逻辑。

我认为调光器的外部协议是最佳解决方案: