AVR自行解码


8

是否还有其他人曾经在几个月后AVR神秘地停止工作,但对其重新编程会使其恢复正常运行的情况?

我正在无线传感器网络中运行一堆atmega328。我现在有3次(大约一年),其中一个刚刚停止工作。我将程序重新刻录到它,然后它将再次开始工作。它并不总是相同的单元,因此看起来好像不是有缺陷的芯片。

看起来这将是一件相当灾难性的事情,它将使人们无法使用AVR,因此,这显然与我的特殊情况有关。我只是想知道是否有人遇到过这种情况,并且可能会有一些提示。

我的电池电量不足3.3V,因此电压下降太低,无法每隔几个月运行一次,因此必须更换充电电池。模块使用睡眠模式和看门狗定时器睡眠60秒,读取读数,将其广播回基站,然后再次睡眠。这些模块与arduino兼容,因此我没有翻转“不要让我重新刻录此”字样。


您在哪里可以发现问题?我们通过类似的设置遇到了类似的问题。您是否曾经读出“损坏的”闪存并将其与原始十六进制内容进行比较?
Rev1.0

Answers:


6

您在使用BOD吗?如果芯片掉电,有时会发生令人讨厌的事情。


3
为了澄清,edebill应该使用BOD。
凯文·维米尔

不使用BoD。我将不得不添加一下。因此,在这种情况下,由于电压太低而导致芯片意外地损坏了自己的闪存,该芯片刚刚开始晃动?
edebill

@edebill-在PIC上,我看到未设置BORV阈值时,这种情况在生产中会发生很多。
J. Polfer 2010年

什么是生化需氧量?掉电检测?
彼得·莫滕森

2
是的,它是掉电检测。
莱昂·海勒

6

可能是“掉电检测”是正确的方法,但是...

我遇到了一个仅软件问题,该问题会导致非常相似的症状,但是速度要快得多。我相信某些不良的C ++(编译?)会导致堆栈损坏,并且该函数将返回真实程序之外,并执行随机指令。我不确定接下来会发生什么,但是解决该问题的唯一方法是重新刻录程序(显然,其中一些随机指令包括写入程序内存)。

该错误只是在错误的时间调用了一个析构函数。使变量成为全局变量(因此它从未被破坏)解决了该问题。该问题非常容易重现(触发大约需要一分钟),并且电源非常稳定。特定的设置是使用WaveHC库的Arduino + WaveShield,但我认为使用C ++的任何人都可能发生这种情况。

如果您喜欢低级语言,那么我在汇编中不小心做了同样的事情,但是奇迹般地,这只引起了偶然的时序问题:大多数指令长2个字节,但是有些更长,我愚蠢地计算了自己的跳转距离并跳转了进入4字节指令的中间 它很快就进行了重新对齐,但是不难想象,在很少使用的导致疯狂的代码路径上会出现类似的情况。


对于将某些闪存映射到主存储空间的处理器,也可能发生这种情况。我知道至少dsPIC和PIC24可以做到这一点。如果指针损坏并且在正确的情况下可以覆盖闪存。
Thomas O

3

我还看到不足/放置不良/缺失的Vcc去耦电容器会产生类似的效果。您是否在离IC尽可能近的地方进行去耦?(最好是100nF-1uF陶瓷类型)


2

可能导致设备丢失内存的另一个因素是静电放电(ESD)。

在所有容易暴露的外部连接器上放置一些压敏电阻可以缓解此问题。我以前在一些基于Microchip PIC单片机的商业产品中已经看到过它,因此它并非闻所未闻。

有些方便的压敏电阻也可以兼作滤波电容器(约为10-150 pF)。查看这些http://www.tdk.co.jp/tefe02/e9c11_avr.pdf

它们体积小,价格便宜,可以保护您的设备。将它们放置在尽可能靠近将外部信号传输到板上的连接器的位置,并将所有走线立即远离连接器引脚。


压敏电阻不用于ESD保护(它们用于保护持续10到100毫秒的电涌)。该设备的内部二极管通常就足够了,但如果不足够,通常可以在任一电源轨(Vdd和GND)上添加一些反向偏置的二极管,但是要小心,因为这确实会增加IO的电容并会影响高速器件。
Thomas O 2010年

1
Thomas看看TDK的数据资料,这些设备是专门为ESD对抗措施而设计的,并且已被证明可以在电子通信设备的生产中使用。我们在内部对设备进行了高达8 kV ESD的测试,这些设备确实可以保护其他组件。
smashtastic 2010年

您对附加电容是正确的,确实需要考虑这一点。
smashtastic
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.