Arduino AVR中断掩码清除

时间:2018-04-06 10:47:23

标签: arduino avr arduino-uno firmata

我使用firmata协议(firmata protocol)构建一些软件,以便在arduino上提供一些功能并通过USB管理电路板。

我用零交叉连接到arduino调光器并编写自定义协议命令来改变调光器的状态(Dimmer library)。一切正常,但灯有时闪烁。

我认为问题是firmata正在使用AVR cli()宏清除中断屏蔽(code)然后指示灯闪烁。

是否有任何方法可以阻止清除中断屏蔽(是否安全?)? 有没有中断的方法来实现调光器?

1 个答案:

答案 0 :(得分:1)

您无法阻止执行特定指令。

我不知道任何提到的图书馆,但可以在原则基础上回答:

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

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

如果您的ISR逻辑需要立即调用,也会出现一些故障 - 例如因为检查引脚变化中断上的当前PIN状态,或者因为它期望某个定时器计数器没有计数超过几个周期并且设置新的比较值(例如在比特角度调制的情况下)。在这种情况下,定时器可能已经比ISR开始之前的新比较值计数得更远,并产生毛刺。

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

  • 查看firmata驱动程序的来源,并尝试缩小cli()和sei()之间的来源,以减少中断被锁定的时间。
  • 尝试修复调光器库以处理延迟执行ISR的情况。也许可以删除此事件的视觉感知

但也许可以考虑下列事项之一:

  • 两个库的设计不兼容
  • AVR要慢慢处理两者,以便它总是丢失一些ISR

如果您遇到AVR - 可能会将外部协议解码保留在一个上,并使用非常简单的协议构建一个小UART / SPI通道,并在其上运行Dimming Light控制逻辑。