Chinaunix首页 | 论坛 | 博客
  • 博客访问: 697184
  • 博文数量: 113
  • 博客积分: 7070
  • 博客等级: 少将
  • 技术积分: 930
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-02 21:03
文章分类

全部博文(113)

文章存档

2012年(2)

2011年(10)

2010年(19)

2009年(39)

2008年(20)

2007年(23)

我的朋友

分类: 嵌入式

2009-09-24 10:23:35

【楼主位】 fewer003
 
总结了引起AVR单片机死机重启的原因,希望能起到抛砖引玉的效果,也希望同行能够补充

当碰到总复位的问题时,我们可以读取MCUCSR来确定复位原因,总的原则是先软后硬(先排除软件的问题,后再查找是否是硬件的问题),先简单后麻烦(先排除容易更换的芯片和器件,后排除比如贴片的单片机),先易(出错)后难(出错)

我是个新手,只总结了一点点,一些自己没碰到,是在查自己单片机总复位的原因时找到的,如不准确,请指正。最近在用MEGA64L做一个项目,这是我第一次独立做项目,又是新手,难免磕磕碰碰,上周一就废话少说,进入正题吧。

1.看门狗未按时喂狗,时间溢出即复位。这样的复位会间隔时间固定,要看具体型号的单片机的看门狗的设置了。解决方法,及时喂狗,或者关掉看门狗(注:像MEGA64一类的高级别的单片机,若工作在模式2是关不掉的,详细请看DATASHEET);

2.电源不稳定。因此而复位的时间不会太确定,当系统的工作功率变大或者电压不稳时会引发掉电复位,除了可以读取MCUCSR来确定,也可以用示波器来查看。解决方法:更改或完善电源部分的设计;

3.开中断未有中断服务程序。这种情况我未碰到,是同行遇见过的。解决方法:写好中断程序,或者关掉中断^_^;

4.中断中调用太多的函数及调用深度太大,这样会引起堆栈溢出,程序便会跑飞,死机或复位。解决方法:不要调用太多的函数,可以设置标志位,或者干脆写在中断里边;

5.晶振损坏。这是我遇到的问题,原先没有怀疑晶振的问题,排除了软件及电源部分,但我始终找不到复位的原因,最后没有办法,抱着换晶振不行就再换

MCU的情况下试试,结果问题就解决了,教训啊!!!仔细想想也是,如果系统的频率不稳定了,死机跟复位是应该的,还是想请教一下马老师对此的看法?
暂时就这么多,请同行前辈们补充指正!
 

 
---------------------------------------------------
【3楼】 zxq6 小马哈
我碰到过,是寄存器没有设置对。估计就是第三条吧,仿真的时候系统就一直在一个延时函数里面非正常跳转。当时很是郁闷,因为我以前从来不怀疑程序会引起系统跑飞。
呵呵,看来以后写程序需要规范些了。
 
---------------------------------------------------
【10楼】 fewer003
看看堆栈是不是溢出了?
阅读(9389) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~