0

[我在Arduino Stack Exchange上问过这个问题,我等了一会儿没有得到答案,所以我想我会在这里问它!]

我想将 Pololu 的vl53l0x 飞行时间距离传感器集成到我的项目中。他们创建了一个来通过 I2C 与 vl53l0x 交互,这在我的 Uno 上运行良好。唯一的问题是 Wire.h 在 ATtiny85 上不起作用。

TinyWireM是我认为兼容的 Wire 替代库。我的问题是:如何用 TinyWireM 替换 Wire?是否像用 TinyWireM 替换所有 Wire 实例一样简单?为了使库 ATtiny85 兼容,我还需要做些什么吗?

我确实尝试将“Wire”重新定义为 TinyWireM,如下所示:

#include "TinyWireM.h"
#define Wire   TinyWireM

一切都编译并上传到我的 ATtiny85 就好了。然而,传感器似乎只输出了大约 7600mm 的值,而且相当一致。

谢谢!

4

1 回答 1

1

线库在 ATTiny 上不起作用,因为它只有一个 USI(通用串行接口),它与 Arduino Uno 中的硬件不同。TinyWireM 库显示出与 Uno 上的 Wire 库几乎相同的行为,但与移植到 ATTiny 的库不同。我完全不明白,为什么要将 TinyWireM 库重命名为 Wire。如果您只是想假装它确实是 Wire 库,这可能不是一个好的编码实践,因为这在某种程度上隐藏了您的代码中的事实,即您使用的不是 Wire 库,而是不同的库。如果您想创建可在 Uno 和 ATTiny 上重复使用的代码,我建议您使用#defineand#ifdef的组合#ifndef#endif指令,以便根据定义的标志仅编译相应的代码。据我所知,ArduinoIDE 也使用这些来包含每个目标的正确头文件。如果可以在头文件中找到对应的定义,就可以使用这个。但是在文件开头使用您自己的定义更容易。

提示:如果您曾经尝试使用 TinyWireM 通过 I2C 建立多主机通信(这对我来说非常有效),您必须在传输后释放总线,以便另一个主机可以使用它。我已经通过禁用 USI 硬件来完成此操作, USICR&= 0b11001111; pinMode(0,INPUT); pinMode(2,INPUT); 库不会为您执行此操作。(如果您不这样做,总线将保持占用状态,并且没有其他主机可以通信)要直接使用 USICR 寄存器,您也有至#include <USI_TWI_Master.h>

于 2017-03-16T14:38:53.613 回答