【问题标题】:1k of Program Space, 64 bytes of RAM. Is 1 wire communication possible?1k 的程序空间,64 字节的 RAM。 1线通讯可以吗?
【发布时间】:2010-04-18 09:24:25
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

标签: c assembly communication avr freestanding


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • “你可以 [...] 摆脱使用 C 编译器” - 当然,例如 avr-gcc,它支持 所有 具有 RAM 的 AVR。跨度>
      【解决方案4】:

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

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

      【讨论】:

      • 我现在在我的 Arduino 上没有空间容纳整个 C 库,我可以在上面舒适地编程:P 虽然我喜欢做低级工作。另外,我将使用 avr-gcc。另外,在比较 x86 和 avr 代码时,我不确定机器代码的紧凑性。
      【解决方案5】:

      是的,很可能,不过如果你非常了解你的编译器,你也许可以摆脱 c。

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

      【讨论】:

      • 好吧,我相信 avr-gcc 带有一个简单的crt0,它会引导main,但很好。必须检查一下。
      • 是的,但是 crt0 可能还包含设置堆的代码,可能还有其他不必要的代码,因此使用它很可能会浪费空间。
      • 你确定吗?我认为任何 AVR 芯片都没有超过 128k 的程序空间,并且由于这些限制,没有 avr-libc(因此也没有 malloc 和 free)。
      • 不,我不确定(因此“可能”、“可能”;)!不过,检查 crt 的大小仍然是个好主意。
      • 用于微控制器的 C 编译器通常会生成简单的 cstartup 代码和任何必要的中断向量,仅此而已。如果你不使用 C 库函数,除了你自己的函数之外,生成的代码很少。
      【解决方案6】:

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

      【讨论】:

      • 是的,我确实看过这些并买了几个,但我需要大量的微控制器,所以我想尽可能便宜。
      • attiny13 散装约 1 美元,attiny25 散装约 1.10 美元。如果串行通信是您的主要目标,我认为您很可能会获得超过 10% 的更多功能。
      • 在哪里?在 sparkfun 我上次检查时,它们之间的差价约为 1.50 美元。
      • 这些是 mouser.com 的价格,一次购买 100 个单位。 Digikey 可能有类似的价格。如果您需要超过 1000 个芯片,请考虑直接从 Atmel 采购它们,我认为它们以 1060 个成卷。千万不要从 SparkFun 批量购买,1 件的价格有点高,更不用说 100 件了。
      【解决方案7】:

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

      【讨论】:

      • 简短的回答:因为我是菜鸟。
      【解决方案8】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-09-19
        • 2013-05-24
        • 2016-09-02
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        相关资源
        最近更新 更多