0

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

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

我认为问题是firmata 正在使用AVR cli() 宏来清除中断掩码(代码),然后灯闪烁。

有什么方法可以阻止清除中断掩码(安全吗?)?有什么方法可以在没有中断的情况下实现调光器吗?

4

1 回答 1

1

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

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

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

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

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

如果是这种情况,我认为你只有几个选择:

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

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

  • 两个库的设计不兼容
  • AVR 处理这两者的速度很慢,因此它总是会丢失一些 ISR

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

于 2018-04-10T07:33:35.437 回答