[AVR单片机] 用ATmega162遇到的一个现象,请教大家

[复制链接]
4125|10
 楼主| jjl3 发表于 2009-9-12 20:56 | 显示全部楼层 |阅读模式
我用ATmega162+SJA1000做CAN通讯。ATmega162用内部晶振。启用watchdog.但有时 上电时发现ATmega162好像运行了一段程序后就停住了(从现象上看),比如在LCD上已经有了最新信息的显示了,但ATmega162好象就突然停主了,后面程序就不执行了,watchdog也不能复位MCU,等一会,时间有长有短,ATmega162有正常运行了。这个现象只发生在上电时,而且不是每次上电都会发生。往往在相隔很长时间后,第一次上电时容易发生。在ATmega162停住时,我测电源都是正常的。我在程序开始加了100ms的延时以等待内部晶振稳定,还是没效果。不知大家碰到过吗?
宇容创行 发表于 2009-9-12 21:38 | 显示全部楼层
运行这么长时间出错,软件有bug的可能更大

建议逐步简化你的程序看看,能否重现
 楼主| jjl3 发表于 2009-9-14 22:03 | 显示全部楼层
顶起来
ZRL700424 发表于 2009-9-16 09:03 | 显示全部楼层
嗯,程序有问题
tcc8073 发表于 2009-9-19 14:46 | 显示全部楼层
对时序有要求的尽量不要用内部晶振
dsb804 发表于 2009-9-20 03:21 | 显示全部楼层
有没可能你的程序还没完全跑起来,SJA1000就在那一直中断
Karlshen 发表于 2009-9-24 12:48 | 显示全部楼层
同意2#的看法
 楼主| jjl3 发表于 2009-9-24 21:49 | 显示全部楼层
如果是程序问题,那为什么看门狗没有把程序拉回来呢?
ZRL700424 发表于 2009-9-25 10:12 | 显示全部楼层
如果是程序问题,那为什么看门狗没有把程序拉回来呢?
jjl3 发表于 2009-9-24 21:49


举一个极端的例子,执行到下面这里,看门狗能拉回来吗?
while(1)
{
   asm("WDR");
}
lovelyegle 发表于 2009-9-25 13:02 | 显示全部楼层
那遇到这种情况怎么才能拉回来?
 楼主| jjl3 发表于 2009-9-28 22:59 | 显示全部楼层
我的意思是,不可能在主循环中只执行了喂狗指令而不执行其他语句。
比如在我主循环中:

display(...);                             //感觉程序运行到这了,因为在屏上可以看到最新信息了。

while(1)
{
   PORTC  |=    (1 << PC4);                 //但程序肯定没到这里,因为背光没打开。还有主循环中其他指令没执行。
   asm("WDR");                                //已经超过喂狗时间了,看门狗没有把程序拉回来,难道在主循环中只有这条语句被执行了??!!
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

271

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部