
相信你经过检查读写程序都没有问题的话。
那么从你所说的现象判断,是程序跑飞所致。
当单片机复位不良、或者抗干扰性能不好时,程序很容易跑飞(程序跳转到未知位置开始执行),尤其RISC的单片机这种现象特别明显,因为其指令长度固定,基本上程序存储器中任何一个单元就是一条指令,所以当程序计数器乱跳时,跳到任何一个位置都会找到一条可以执行的指令并开始从这里执行。
如果跑飞时刚好跳到写EEPROM指令程序前面一段,就会出现在未给待写入数据正确赋值的情况下写入EEPROM的情况,导致EEPROM被误写。
因为刚好跳到写EEPROM指令前面一段是小概率事件,所以一般被改写的只有开始几个字节。
解决办法:
1、完善上电复位电路,确保单片机在电源电压稳定的情况下才开始运行。在上电期间,如果电压不稳定,是导致单片机程序跑飞的最主要原因。
2、增强电路抗干扰性能。
3、在写EEPROM指令前加一条条件跳转指令,当某软件标志位1未设置时就跳转,并且在写EEPROM指令后立即清除软件标志位1。
当需要写EEPROM时,在正确赋值写入数据之后紧接着设置软件标志位1,然后立即调用写EEPROM子程序。
按以上优化的程序,将使误写现象降到最低概率,因为只有恰好跳转到设置软件标志位1指令时才会发生误写现象。
如果以上优化还让你不放心,你可以做成2级甚至更多级的防误写,在设置软件标志位1之前加一条条件跳转指令,只有当软件标志位2设置时才不跳转……
单片机程序运行的原理是通过寄存器状态的设置来控制单片机内部以及端口的各个管脚的逻辑状态,来实现预期逻辑功能的目的。
而这所有的功能是通过逻辑单元的0-1电平来实现的,这些逻辑可能被外界的电磁干扰或者内部本身逻辑结构的问题,使得出现了一个不可控的逻辑状态,这是单片机会出现很多预料之外的状态,这是我们就说单片机”跑飞了“。
而防止这种状态的出现就是加入“看门狗”机制,也就是说,单片机在运行中,我使用一个定时器,定时器不断的递增,如果程序运行正常,我会在一段时间内(定时器溢出之前)将其清空,也就是说,只要程序运行正常,这个定时器永远也不会溢出。但,如果程序跑飞了,进入了不可控的状态,则程序不会运行到清空定时器这个命令上来,这是,我强行将单片机重启,使单片机恢复初始状态
你说的是类似于尖峰电压干扰,此时电压会发生变化,但又不足以让单片机复位,但会引起单片机的部分寄存器值的变化,单片机寄存器就如电脑的内存一样,其值发生变化,程序状态就会发生变化,从而引起程序跑飞。
以上就是关于请高手帮忙单片机中的难题全部的内容,包括:请高手帮忙单片机中的难题、单片机跑飞的原因有哪些硬件的、软件的、以及怎样防止这种事情的发生、Q3:单片机在断电后又及时上电,为什么程序会跑飞等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)