问题标签 [avr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
9634 浏览

arduino - Arduino 引导加载程序

有人可以解释一下Arduino 引导程序是如何工作的吗?我不是在这里寻找高水平的答案,我已经阅读了代码并且我明白了它的要点。

在 Arduino IDE 和引导加载程序代码之间发生了一堆协议交互,最终产生了许多内联汇编指令,这些指令通过串行接口传输程序来对闪存进行自编程。

我不清楚的是第 270 行:

...我认为这是函数指针的声明和初始化为 NULL。在引导加载程序打算委托执行用户加载代码的地方,随后会调用 app_start。

当然,app_start在某些时候需要以某种方式获得一个非 NULL 值才能将它们组合在一起。我在引导加载程序代码中没有看到......它是否被引导加载程序加载的程序神奇地链接了?我认为引导加载程序的 main 是芯片复位后进入软件的入口点。

包含在大约 70 条组装线中的一定是秘密解码器环,它告诉主程序 app_start 到底在哪里?或者可能是 Arduino IDE 利用了一些隐含的知识?我所知道的是,如果有人不将 app_start 更改为指向 0 以外的某个位置,则引导加载程序代码将永远自转……那么诀窍是什么?

编辑

我有兴趣尝试将引导加载程序移植到没有用于引导加载程序代码的单独内存空间的 Tiny AVR。对我来说很明显引导加载程序代码依赖于某些保险丝设置和芯片支持,我想我真正感兴趣的是如何将引导加载程序移植到没有这些保险丝和硬件的芯片上支持(但仍具有自编程能力)?

0 投票
4 回答
1936 浏览

c - C 将 char 读取为二进制

这实际上是我正在使用 avr 进行的项目的一部分。我通过 twi 与 DS1307 实时时钟 IC 连接。它将信息报告为一系列 8 个字符。它以以下格式返回:

我想做的就是把每一部分的时间一点一点地阅读。我想不出办法来做到这一点。如果位为 1,则基本上点亮 LED,但如果为 0,则不会点亮。

我想有一种相当简单的方法可以通过位移来做到这一点,但我不能把我的手指放在这样做的逻辑上。

0 投票
1 回答
713 浏览

timer - AVR 来自定时器中断的长时间运行代码

我有一些代码需要每 2 分钟运行一次,这看起来很简单。问题似乎是从计时器内触发长时间运行的进程会导致计时器摇摆不定?有什么建议么。

我的 C 知识不是那么好,所以请帮助我一些基本的想法。MCU 是 Atmel Mega128L

长时间运行的进程是通过 Telit GSM 设备(通过 UART1)的 http 调用,这本身就很好用,但需要在主循环之外运行,因为它需要监视其他进程。

0 投票
9 回答
6192 浏览

c++ - 在 AVR 中,逻辑右移 2 的幂是否更快?

我想知道按 2 的幂移动时执行逻辑右移是否更快

例如,是

任何快于

我很感激每个人的第一反应是告诉我,人们不应该担心这样的小事情,它使用正确的算法和集合来减少数量级的重要性。我完全同意你的观点,但我真的想尽我所能从嵌入式芯片(ATMega328)中挤出来——我刚刚获得了值得“哇哦!”的性能转变。通过用位移来代替除法,所以我向你保证,这确实很重要。

0 投票
2 回答
514 浏览

microcontroller - 对设备编程感兴趣。从哪儿开始

我对 C++ 有一个很好的命令,但我从来没有在设备编程方面做过任何事情。我对数字逻辑设计有一些基本的了解。但我在电子方面完全是菜鸟。目前,我对微控制器编程产生了浓厚的兴趣。

从哪儿开始 ?

我不认为一个人真的需要拥有大量的电子知识才能在微控制器上运行程序。

我正在使用 Linux。我已经下载了 Keil。从未尝试通过 Wine 运行它。我已经在 Windows 中运行了它。但是代码的工作原理对我来说并不完全清楚。尽管我可以将逻辑理解为用 C 编写的。但对我来说它仍然像一团雾。
我只需要一个快速启动。

0 投票
2 回答
1434 浏览

vb.net - AVRdude 在 VB 中即时加密/解密 HEX 文件

嘿,我正在寻找解密我的 ATTiny 芯片的 HEX 代码文件并使用 AVRDude 命令行界面对其进行编程。问题是,我不希望用户能够在任何给定时间看到 HEX 文件是什么。

VB.net Cryptography 是否可以在我将 HEX 文件放到服务器上之前对其进行加密,然后在程序从服务器下载并通过程序运行它而不看到解密的 HEX 文件后对其进行解密?

显然,十六进制文件在被编程到 ATTiny 芯片时不能保持加密,所以我该怎么做才能创建要在程序中编程的原始十六进制文件,而不必担心它将临时文件写入硬盘驱动然后删除它?(因为他们可以在执行该临时文件后关闭程序,他们将能够导航并打开它并查看代码)

任何帮助都会很棒!:o)

大卫

0 投票
5 回答
2751 浏览

c - 直接数字合成中的线性插值

我正在使用 C 语言开发一个微控制器 DDS 项目,并且在弄清楚如何计算线性插值以平滑输出值时遇到了一些麻烦。现在的程序
使用 24 位累加器的前 8 位作为 8 位输出值数组的索引。我需要想出一个函数,它将获取累加器的中字节和低字节,并在数组中的“上一个”和“下一个”值之间生成一个值。这在快速硬件上已经足够简单了,但是由于我使用的是微控制器,所以我真的需要避免进行任何浮点运算或除法!

有了这些限制,我不确定从我的两个 8 位输入数字和累加器的低 2 个字节中获取 8 位内插值的方法,它代表两个输入值之间的“距离”。提前感谢您的任何建议!

澄清

DDS = 直接数字合成

在 DDS 中,波形是使用相位累加器从查找表中生成的。相位累加器通常包含一个整数分量和一个小数分量。整数部分用作查找表的索引。在简单的 DDS 实现中,小数部分被忽略,但为了获得更高质量的输出,小数部分用于在相邻查找表值之间进行插值(通常只是线性插值)。对于上述问题,我们正在研究如何有效地在给定分数 f 的两个查找表值之间执行这种线性插值,其中0 <= f < 1

0 投票
1 回答
323 浏览

c - avr-gcc 3.4.0 和 avr-gcc 4.3.x 之间的二进制兼容性

我继承了一个链接到可能已经用 gcc3 构建的库的应用程序。或者也许使用 imagecraft 编译器。这些信息现在已经消失在天堂般的位域中,我只剩下一个 libXXX.a 库来链接我的应用程序。我无法重新编译 libXXX.a,因为它需要来自 imagecraft 和其他地方的某些未知头文件,这些头文件在某个时候可能在我的环境中无处不在,但现在无处可寻。

我的问题是,如果我使用 avr-gcc 版本 3.4.0 编译我的应用程序(并链接到那个“特殊”libXXX)会产生一个工作二进制映像,那么期望我可以编译所有其他部分是否合理?我的带有 avr-gcc 4 的应用程序(这个操作有一些非常好的和经过验证的好处),与 libXXX 链接并且仍然可以获得一个工作程序?

从本质上讲,这一切都归结为:avr-gcc 二进制文件是否与“可能是 avr-gcc 3.something 的神秘编译器 X”兼容?

老实说,我已经成功地用 avr-gcc4 编译了我的应用程序的其余部分并将其与库链接,并验证结果有效,但我应该注意什么样的副作用或怪癖?

0 投票
1 回答
756 浏览

scons - 将 avrdude 命令作为 SCons 目标运行

我希望能够从 SCons 调用 avrdude 作为目标。例如,运行scons erase-device应该运行 avrdude 命令来执行此操作。

我试图通过创建调用 avrdude 的 Builder 对象并将它们添加到环境中来做到这一点。

使用此代码,scons 总是退出并说无事可做。我认为这是因为,代码的显示方式,我没有将任何源文件提供给这些构建器(env.EraseDevice()env.WriteFuses());因此,SCons 假定它们不需要被调用。

所以这就是我接下来尝试的。我只是将一个现有的文件名传递给这两个 Builders 以使 scons 高兴,即使它不是必需的。现在的问题是,无论我是要运行scons write-fusesscons erase-flash还是其他使用 avrdude 的目标,scons 的行为就像我在尝试编写保险丝一样。例如,如果我传入的文件名是foo.hex,那么 scons 现在认为它必须write-fuses每次都运行目标,因为 scons 认为 'avrdude' 应该生成一个名为foo的输出文件,但该文件是从未产生。

此外,这样做意味着我必须在擦除设备或对熔丝位进行编程之前构建十六进制文件,这通常是不必要的。

如何在 SCons 中创建不需要任何输入源且不生成任何输出的目标?

谢谢!

0 投票
3 回答
912 浏览

c - 在计时器方面需要帮助

在过去的两周里,我试图学习定时器和中断,并编写了一个程序(以我的理解)来闪烁 ATMEGA2560 上的 LED,但无论我做什么,TCNT0 都不会递增,并且 ISR() 函数永远不会被调用。我哪里出错了,我该如何解决?这是我的代码: