5

(如果您的懒惰请参阅TL;DR的底部)

您好,我正计划建立一个处理物理计算的新(原型)项目。基本上,我有电线。这些电线都需要同时读取它们的电压。每根电线的读数之间超过几百微秒的差异将完全搞砸。Arduino 大约需要 114 微秒。因此,在延迟会影响读数的准确性之前,我最多可以读取 2 或 3 根线。

所以我的计划是让一个 Arduino 作为一系列 ATTinys 的“主人”。arduino 的空间非常狭窄,但与 tinys 相比,它是一个巨大的游乐场。ATTiny13A 有 1k 的闪存 ROM(程序空间)、64 字节的 RAM 和 64 字节的(非耐用且慢速)EEPROM。(我选择这个是因为价格和尺寸)

我系统中的 ATTinys 不会做太多事情。基本上,他们所要做的就是等待来自主控的信号,然后读取 1 或 2 根线的电压并将其存储在 RAM 中(或者可能是 EEPROM,如果它那么狭窄的话)。然后仅使用 1 根数据线将其发送给主站。(没有更多空间!)。

到目前为止,我所要做的就是实现简单的电压读取代码(使用内置 ADC)。但我担心这个沟通位。您认为通信协议(仅使用 1 根线!)甚至可以在这样的约束下实现吗?

TL;DR:在不到 1k 的程序空间和 64 字节的 RAM(和 64 字节的 EEPROM)中,您认为有可能实现 1 线通信协议吗?我需要去组装以使其适合吗?

我知道目前我链接到 Wiring 库的 Arduino 程序超过 8k,所以我有点担心。

4

8 回答 8

9

由于您只需要发送数据(这比接收更简单)并且您可以选择自己的协议,因此将代码放入可用内存空间中应该不是问题。

我曾经为一个包含 8x14 段 LCD 显示器、一些 LED、一些按钮、一个串行 (I2C) EEPROM 和主机串行接口的工业控制面板创建软件。使用了 4 位处理器。该设备没有任何串行接口,因此 RS232C 接口和 I2C 总线都必须在软件中实现。最重要的是,还有 Modbus 协议(其中需要 CRC 计算一些精确的时间)和应用程序。

该设备有大约 128 x 4 位的 RAM 和 1kW、2kW、3kW 或 4kW 的 ROM(每字 10 位)。最终程序的大小约为 1100 字,因此不太适合最小的设备。当然,我使用了汇编程序。

但是,您可以考虑使用硬件解决方案,而不是使用多个微控制器。

您可以使用采样和保持电路。为此,您需要一组模拟开关和电容器,也许还有运算放大器。只需发出一个触发器即可将所有电压锁存到电容器中。然后,您可以根据需要使用主处理器读取电压的时间。

更新:忘了提到有现成的采样保持放大器需要很少或不需要外部元件。这可能是最简单的解决方案。

于 2010-04-18T12:09:09.277 回答
2

您可能可以不使用针对此架构的 C 编译器,但您必须创建自己的运行时环境,而不是依赖编译器提供的环境。这是可行的,但我不确定从本质上创建自己的迷你操作系统的额外工作是否超过了使用 C 而不是汇编程序的生产力优势。

于 2010-04-18T09:42:35.960 回答
2

1k 的程序空间应该足够了,考虑到您的协议只需要足够复杂,以便在触发时发送单个整数。查看曼彻斯特编码

于 2010-04-18T09:43:27.177 回答
1

您可以考虑升级到ATtiny25。它是一个功能更强大的 8 针 AVR,包括 Atmel 的通用串行接口。它能够在硬件中进行 1 线串行通信,只需几个字节的软件。

于 2010-05-28T19:06:32.703 回答
1

为什么不直接使用采样保持硬件,而不是一堆微控制器呢?

于 2010-05-28T19:11:10.267 回答
1

我最近使用 AT90USB646 主机和 ATtiny85 从机设计了一个主从系统。显然我有更多的记忆可以处理奴隶,但我想和你分享的是:

关于您的通信协议,请记住 ATtiny13 上未校准的内部振荡器的精度为 +/- 10%。这意味着您将无法使用例如 RS-232 通信。

我在我的系统中使用了 Dallas 1-Wire 协议的变体。包括全面支持从机枚举等,C源代码编译成1626字节。

编辑:哎呀,没有意识到这个问题太老了。希望这可能仍然有一些帮助。

于 2010-09-09T21:12:46.877 回答
1

我已经在类似的约束下完成了嵌入式编程。我在微型模型中使用了 Borland Turbo C(这是很久以前的事了)并获得了几乎不比我在汇编程序中可以完成的代码大,而且只需要很少的努力。我要说的是:使用 C 作为高级汇编程序是非常可行和明智的。

不过,就像我一样,您将面临为 C 提供(微小的)运行时环境的问题。理想情况下,您只需要设置堆栈和几个寄存器。此外,您将没有 C 库的空间,因此您需要自己编写任何需要的函数。

于 2010-04-18T09:27:51.813 回答
1

是的,可能,但如果您非常了解您的编译器,您可能能够摆脱 c。

可以做的是使用编译器基于 c 代码发出您需要的任何独立函数,然后将它们与您自己的一点点粘合在一起。(您当然必须自己进行 c 运行时设置 - 堆栈等)

于 2010-04-18T09:31:55.240 回答