当我向其上传草图时,自定义Arduino板发出蜂鸣声并冻结。为什么?


8

我设计和制造的独立Arduino板发生了最奇怪的事情。该板(其原理图如下)具有以下功能:

  1. 它具有带5V电压调节器的ATmega328P和设置为独立控制器的常规电路。
  2. 它控制记分板,该记分板具有通过右侧的连接器(JP1至JP12)链接的几个7位显示数字。
  3. 它具有通过电压梯形图通过ANALOG_0(A0)解码的光标按钮。
  4. 它有一个实时时钟,可以在关闭时保持时间。
  5. 它具有一个RF接收器模块。
  6. 它具有一个UART接头(JP17),因此我可以使用串行端口对该板进行编程。
  7. 它的扬声器连接到数字引脚3(D3)。

控制器原理图

我使用同样构建的RS232到TTL适配器(也在下面的示意图)和串行到USB的电缆向其上载草图。对板进行编程时,其行为与Severino板非常相似。

在此处输入图片说明

奇怪的是,当我上传草图时,过程在中间暂停,然后扬声器开始连续发出蜂鸣声。它会暂停并显示以下avrdude消息:

avrdude:版本5.11,于2011年9月2日在19:38:36版权所有(c)2000-2005 Brian Dean,http://www.bdmicro.com/ 版权所有(c)2007-2009 Joerg Wunsch

     System wide configuration file is "C:\arduino-1.0.3\hardware/tools/avr/etc/avrdude.conf"

     Using Port                    : \\.\COM1
     Using Programmer              : arduino
     Overriding Baud Rate          : 115200

当我按板上的Reset键时,avrdude继续输出其消息(例如以下内容),蜂鸣声停止,上传继续,并且草图成功上传到板上。

avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
... messages and upload continue and completes successfully.

我在这里没有剩下的所有信息,但希望您能明白。

因此,我的问题是:

  1. 是什么使上传过程暂停?
  2. 为什么暂停过程时蜂鸣器会发出蜂鸣声?

1
在IDE的首选项中,打开“详细上传”。该日志应提供一些见解或更多线索。
mpflaga 2014年

1
愚蠢的问题:您是否使用引导加载程序对ATmega328p进行了编程?
康纳·沃尔夫

1
“在UNO中完美工作”-这是有用的信息。因此,您的板上必须有一个插座。如果是这样-您可以通过快速实验更具体地确定来源。对于每个IO引脚,将其向外弯曲以免接触。飘!将IC插入插座时。最终,在所有引脚都悬空的情况下,您的电路将成为不可能。并且由于延迟/哔哔声之间的某个点应该停止。并报告。
mpflaga 2014年

1
@jfpoilpret如果扬声器实际上是蜂鸣器(压电),则没有感应,因此不需要二极管。忘记我的原始评论。
jfpoilpret 2014年

1
我的一个朋友在他的青年时期曾做过很多电子产品,他曾经告诉我:“如果它不能如您所愿地工作,请添加一个去耦电容器”。在很多情况下,我都非常成功地遵循了这一建议!在您的示意图中,我不清楚,您可以在哪里添加去耦电容。您是否尝试过使用蜂鸣器?您也可以尝试2种(一种用于低频率,一种用于高频率):一种电解至少1uF,一种陶瓷100nF。最糟糕的是,它不会有任何效果:-)
jfpoilpret 2014年

Answers:


3

是什么使上传过程暂停?

好吧,考虑到您所提问题下的所有评论,这绝对是一个棘手的问题。您可能想要尝试按照@jfpoilpret的建议添加去耦电容器,尽管您的原理图对我来说还是不错的……(也许可以在EE SE上对其进行评论)。

我还建议您avrdude从Arduino IDE输出中复制命令(您会在顶部找到它),并以较低的比特率在命令外壳中运行它:

avrdude -v -v -v -v -C "C:\arduino-1.0.3\hardware/tools/avr/etc/avrdude.conf" -P COM1 -patmega328 -U… -B3 -b115200

-B值越高,您的比特率越低。并-b为您的引导加载程序设置正确的波特率(您确定这是115200吗?常见于57600)。

您是否还正确设置了保险丝?您可能还需要检查保险丝的值,以查看时钟是否正确设置:

avrdude -U lfuse:r:-:i -U hfuse:r:-:i -U efuse:r:-:i

它将输出保险丝的值。然后,要使值可读,请从下拉列表中选择MCU,然后将值放在保险丝计算器站点的表单底部Atmega328P

仔细检查一下:

  • 您有足够的空间用于引导加载程序(通常,您给它的数量越多越好);
  • 您已经为您的设计正确设置了晶体配置(可能与Arduino IDE设置的默认Uno设置不兼容),请检查是否正确将外部晶体设置为16MHz。

为什么暂停过程时蜂鸣器会发出蜂鸣声?

这是因为当处理器未设置输出时,寄存器中的值处于未定义和不可预测的状态。这意味着通常它会保留复位之前的最后一个值,或者由于某种静电怪异而改变状态,或者由于附近时钟的影响而给出一些怪异的PWM输出。

因此,基本上,在您上传代码时发生了什么问题,而那错误的事情会间接影响音频。我不太担心这些东西,而更多地担心暂停的原因。

遗憾的是,我没有直接的答案,但是充其量,您应该多做一些调查。HTH


+1感谢您的提示!很有用。我将尝试所有方法,并在几天后再报告。
里卡多

只是想让您知道我已解决问题。请参阅我对这个问题的回答。不管怎么说,还是要谢谢你!
里卡多

3

我终于找到了问题的根源:来自DB9-Female连接器上引脚4(DTR-数据终端就绪)的复位信号在达到0V之前达到10V,并触发了ATmega上的高压编程。以下是显示情况的范围快照:

示波器显示电压尖峰达到10V

黄色迹线是DTR信号,而绿色迹线是RESETATmega上的信号。

根据Atmel的Atmel AVR042:AVR硬件设计注意事项应用说明,应在ATmega之间添加一个ESD二极管RESETVcc以防止复位信号触发高压编程模式,如下所示:

推荐的ATmegas RESET引脚连接

在添加了像建议的应用笔记这样的小信号二极管(1N4148)之后,我解决了该问题。参见下面添加二极管后拍摄的示波器。

固定板后拍摄的瞄准镜

现在10V峰值消失了。

那是一个棘手的问题!!但是,如果没有研究和正确的工具,我永远找不到错误所在。瞄准镜上的钱就是花得很好的钱!!


1
这是因为您的复位线没有将电平转换器应用于串行数据线。大多数使用电平转换器ic并通过该通道进行复位。
克里斯·斯特拉顿

@Chris-是的,我记得您告诉过我使用第二个MAX232转换器来修复该问题。我将再看一看,看看是否可以修复该设计。谢谢!!
里卡多

1

我不确定,但是问题可能也与转换器板的自动重置功能有关。

我从Arduino Severino复制了转换器板设计,根据其手册,必须将串行通信设置为19,200 bps,自动重置功能才能正常工作。

确保将计算机的COM端口速度设置为19200bps,否则自动重置将无法正常进行。

好吧,我使用的是115,200,所以一定是一个问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.