如何从 Arduino 毕业直接使用微控制器?

电器工程 Arduino 微控制器
2022-01-03 07:35:22

我一直在做一个 Arduino 项目。在我使用 Arduino 完成所有工作后,我想转向不使用 Arduino 的解决方案。也就是说,我想在不涉及 Arduino 板的情况下使用微控制器。这将允许单板,无屏蔽解决方案。

我知道有一些方法可以在面包板上制作我自己的 Arduino,但这并不是我真正想要做的。

我不太确定如何做到这一点。

除非有更好的选择,否则我倾向于使用 Arduino 使用的 ATmega328。我知道开发工具是免费的,或者至少不是很贵。

出于这个问题的目的,假设我的电路可以得到 +5V。

我的第一个问题是如何对 MCU 进行编程。我相信有两种选择:

  1. 买一个编程器,给 MCU 编程,然后把芯片放到我的电路中。
  2. 设计我的电路以包括对在线编程的支持。

我假设如果我选择选项#1,它就像在我的电路中插入一个编程芯片一样简单;我不需要其他任何东西。当然,更换软件会很不方便。

但是对于选项#2,我不确定我需要什么。从我所做的阅读来看,我认为我需要一根编程电缆和我板上的连接器(什么类型的?)。然后我想我(正确地)将连接器连接到 ATmega 上的某些引脚。

无论哪种方式,我都需要 Atmel 工作室。

其次,除了电源,Arduino 上还有什么我绝对需要的吗?我想也许是一个重置开关?

4个回答

欢迎来到 Atmel 的精彩世界。让我根据我的爱好和专业经验为您提供一些问题的答案。

除了在线编程之外,不要打扰任何事情。除非你是一个完美的程序员,否则每次你想要编程时移除芯片都是一场噩梦。我推荐 AVRISPmkII 作为入门级编程工具。缺点是不支持硬件调试。另一种选择是龙,但我没有这方面的经验。我可以说 JTAGICEmk3 是一个很好的调试工具。

Atmel studio 非常适合编程。它实际上是我最喜欢的嵌入式开发环境。您可以使用 AVRDUDE 和 AVR-GCC 等 CLI 工具,但 IDE 会为您处理这些。

总之:

购买仅用于编程的 AVRISP(更简单,即插即用)或 DRAGON(我无法提供建议)。

在您的电路板上,将 ICSP 引脚引出到 6 引脚双排 0.100" 接头——连接在本数据表中进行了描述。

不需要复位开关。

你不必一次“毕业”。以下是我的转换方式:

首先,我一直使用 Arduino,但将对 Arduino 库的调用转换为寄存器读取和写入,一次一行,看看我的程序是否仍然有效。这样我就习惯了使用寄存器,并发现它们与 Arduino 的做事方式并没有完全不连续。像 digitalWrite() 这样的 Arduino 函数只是简单地操作寄存器——你可以直接在你的草图中自由地读写它们。

我的下一步是将 ATTiny 85 放在面包板上,并使用 Arduino 作为 ISP ( http://highlowtech.org/?p=1695 ) 对其进行编程。如果您购买面包板电源并使用 ATTiny 的内部振荡器,这需要可笑的很少接线。我使用 Arduino IDE 进行编译,但尽可能多地使用寄存器。

然后,我安装了免费的 Crosspack 命令行工具链并编译了一个 blinky 程序。经过一些反复试验,我设法只用 avrdude 对 ATTiny 进行了编程,完全脱离了 Arudino 生态系统。

一旦您仅使用命令行工具获得了眨眼,您就可以摆脱 Arduino。探索各种外围设备及其寄存器,很快它就会变得非常自然。

毕竟,我发现自己经常使用 Arduino,因为它更快。我发现仔细研究寄存器描述有点糟糕。如果您不必这样做,那是没有意义的。不过,知道如何做是件好事。

我同意 HL-DSK 的上述评论。我会花额外的钱找一个有调试能力的程序员。我使用 JTAGICE3,在 digi-key 上大约 110 美元。

在此处阅读 ISP 编程它将向您展示如何引出 SPI 连接。芯片上的 SPI 连接将在 ATmega 数据表中。查看第 2 页的 MISO/MOSI/SCK/RESET 引脚。程序员需要能够控制复位线。请记住在复位线上使用上拉电阻,这样您的芯片在编程器断开后仍能运行。

在此处获取 2x3 标头或者使用分离式标题自己制作。

Arduino 和裸 ATmega328 之间的区别只有两件事。Arduino 引导加载程序和 Arduino 库。您可以在不使用任何库的情况下使用纯 C 或 C++ 编写 Arduino。您也可以改用汇编。引导加载程序允许您通过串行加载新代码,而无需通过(稍微)更复杂的在线串行编程(基本上是 SPI)。

您几乎可以在任何 ide 中使用标准编程库和 avr-gcc。与其他人可能会说的相反,对 Arduino 进行编码基本上就像对裸微控制器进行编码一样,以牺牲一些性能为代价增加了一些便利。