昨晚在调试AVR 单片机时又有一些心得体会,虽然结论是一个很小的问题造成的,但在此还是写出来给大家参考,避免走弯路。
事件描述:
以前用AVR的芯片也做过好几个设计,从来没有怀疑过ATMEL的芯片的稳定性,以前的几个方案都是很稳定的,当然这跟PCB的设计有很大的关系,如果大家需要PCB相关参考资料的话可以到本站的PCB技术专栏里查找,那里有很多前辈的PCB布板心得。
这次用的ATmega48制作的串口电压表就出现一个很奇怪的现象,电路板是用万能板焊接的,程序里用到ADC功能和串口通讯功能,用的AVR下载工具是STK500,每次下载程序后芯片总是不能正常复位工作,还要读取下芯片的特征字或熔丝位让芯片重新复位下才能工作,这时候复位后工作都稳定,没出现什么不正常。刚开始不在意这个问题,因为在开发的初期用AVR DRAGON仿真调试部分功能时复位脚不能接任何器件,所以也就把复位脚悬着不接复位电路,以为是没接阻容复位而造成不稳定。在此还是没有怀疑过芯片的问题。
直到后来这个程序都开发完毕了,给ATMEGA48加上 一个10K的上拉电阻和0.1uF的电容做复位,把ISP线拔掉,独立给串口电压表上电(因为当时都是用几个电路模块连接做实验,串口电平转换电路也是独立的,初期串口调试已经都通过了,所以我把这个串口电平转换模块的连线都拔掉了),问题来了,上电不工作,手动把复位脚接地后放开可以工作,但过了一会后还是死了,加看门狗后还是老样,没有任何改善,每次手动复位正常工作后,把手指头放在ATMEGA48的1、2、3脚上方慢慢靠近,手指头还没碰到芯片就死机了~~~不会吧,没这么脆弱吧。以前用AVR Tiny26做的控制器,把手机放在芯片上方然后拨打10086都不会死机。不会中奖了吧,又不是第一次搞单片机,难道真要像以前论坛里的朋友开玩笑说:要杀只大公鸡祭拜下~~~
奇怪啊~~~实在没招,把串口电平转换电路给接上继续调试下,这时候再上电每次都是正常工作,而如果再把串口电平转换电路断开则又不能正常复位工作~~~手动复位后把手再靠近芯片的1、2、3脚上方就又马上死机~~~狂晕~~~~不是吧~~~ATMEGA48的第一脚是RST,2、3两脚刚好是RXD、TXD串行引脚,难道真的是这个串口干扰引脚影响到复位电路?不可能吧,ATMEGA48芯片用得人多的是,各方面的应用都有,不可能是芯片的缺陷,还是多怀疑下自己吧...重新再好好看看自己的程序吧...
程序里开始首先是对IO做初始化,TXD配置为输出,还有其他相关IO配置。然后是对定时器的一些初始化,再就是对串口的一些初始化了。看了下程序,在初始化的时候就把串口中断发送、接收允许都使能了,难道是这里的问题?串口电压表在实际工作的时候串口其实不是在一直工作的,是通过一个开关选择接地才发送数据,平时是不发送的,而在不接串口电平转换电路的时候RXD、TXD都是是悬空的,只有TXD为输出有上拉,RXD没有使能上拉,这时候RXD是最容易被外部干扰的,这就是问题的所在了。当然如果串口电平转换电路都连接着,那就没这个问题,因为串口电平转换电路已经把RXD的电平给钳住了。解决的方法很简单:在初始化串口的时候关闭串口中断使能,在主程序里需要发送数据的时候再使能串口,发送完马上关闭就可以。至此问题解决,这时候看你再怎么去“摸”ATMEGA48的引脚或封装都没有再出现任何的死机情况,每次上电复位都是非常的稳定。(把AVR的BOD熔丝打开可增加复位的可靠性,BOD LEVEL根据实际的电源电压进行选择,这里的电源是5V,所以BOD LEVEL选4.3V)
总结教训:
这是自己的粗心大意、芯片内部功能的没有合理性利用的表现。在此引以为戒!告诉自己:不要以为自己做过一些小项目就飘飘然起来,不要动不动就去怀疑人家半导体厂家芯片的稳定性,要多怀疑自己才是。往往可能最基本的问题没注意而花费了很多的时间,自己做着玩的东西那都无所谓了,如果你是给别人打工呢?那性质就完全不一样了!
下图为AVR单片机 典型外部复位电路:
AVR单片机已经内置了上电复位设计。并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位线路在上电时,可以设计得很简单:直接拉一只10K的电阻到VCC即可。
为了可靠,再加上一只0.1uF的电容以消除干扰、杂波。
二极管1N4148的作用有两个:作用一是将复位输入的最高电压钳在Vcc+0.5V 左右,另一作用是系统断电时,将10K电阻短路,让0.1uF的电容快速放电,让下一次来电时,能产生有效的复位。
当AVR在工作时,按下开关S 时,复位脚变成低电平,触发AVR芯片复位。
2007-3-30 17:07:00 AVR猎手
用户906612 2008-8-22 09:25
用户155570 2008-7-30 09:29
用户906612 2008-2-27 10:56
TO: rock
“但不明白的是,RXD受到什么样的干扰才会使MCU复位呢.”
答:是我没有使能RXD的上拉电阻,但却使能了RXD接收中断, 这种情况下,如果RXD脚上也没有接232电平电路(即悬空),那就很容易被外部的信号干扰,如你手上的人体干扰、外部的电磁干扰等。。。。
用户906612 2008-2-27 10:52
TO: uliumao@sohu.com
当电源开关快速开关时,MCU偶尔会出现乱跳,停住不动等问题----这个的解决方法就是你说的开启BOD。
但你开启BOD后,又会因为继电器的动作而复位(首先,是你开启BOD后,继电器动作才复位,则可以分析出你的复位情况不是因为继电器电磁干扰造成的!)----这个原因有可能是继电器动作时,造成电压瞬间的下降,如果你的BOD是设置为4.3伏那就会受影响了,一旦瞬间的电压低于4.3V,那芯片可能会被BOD复位,这时候解决方法是:可以把BOD设置为2.7V就可以解决这个问题。
用户906612 2008-2-27 10:48
感谢大家。
简单点说就是: 如果你使能了串口接收中断,而RXD引脚却是悬空的(即没有接232通讯电路或加上拉电阻等),那芯片就很容易受到干扰,在上电的时候会出现不稳定的状态或死机。正常工作的时候也是如此,容易受干扰。
用户23742 2008-1-9 08:30
我也遇到过这样的问题,搞了很久才找到原因,要是早看到这篇文章,就可省不少时间;
但不明白的是,RXD受到什么样的干扰才会使MCU复位呢.
用户103918 2007-9-18 13:41
我也遇到了这个问题,当时也是把串口中断使能关掉了,可是也没从根本上解决问题。
现在还比较迷糊这个问题呢。到底是不是复位的原因呢?
用户60645 2007-9-17 16:51
用户18909 2007-9-14 14:13
看文章是串口的事??
和复位有什么关系??
用户59449 2007-9-13 06:55
haowen