抗干扰好的单片机随着单片机在各个领域应用愈来愈广泛,单片机应用系统的可靠性越 来越成为人们关注的一个重要课题单片机应用系统的可靠性是由多种因 素决定的,其中系统的抗干扰能力是系统可靠性的重要指标由于51系 列单片机的指令系统是复杂指令集结构,致使其抗干扰性能不高,尤其用 在工业控制的场合,如果不增加额外的抗干扰措施,甚至无法正常工作 要提高单片机系统的抗干扰性能无非是从硬件和软件两个方面加以考虑 硬件系统是单片机系统稳定工作的根本,经常采用的方法有:改善系统的 布局、布线; 采用光电耦合器以提高强电与弱电的隔离度; 在电源变 压器的初级增加滤波器; 增加“硬件看门狗”等等硬件抗干扰设计的 缺点是增加了系统的复杂性,提高了硬件成本,而软件抗干扰设计在不增 加系统复杂性,不提高硬件成本的前提下,同样可以在很大程度上提高系 统的稳定性51系列单片机的指令包括单字节、双字节和三字节指令,双字节和 三字节指令包含操作码和操作数两部分当单片机受到严重干扰时,程序 计数器PC因干扰而改变,程序便脱离正常轨道“乱飞”,如果“飞”到单 字节指令或双字节、三字节指令的操作码上,此时程序将沿错误的轨道执 行而出错,称这种“跑飞”为“第一类跑飞”。
当“飞”到某双字节或三 字节指令的操作数上,误将操作数当作操作码而执行,程序将出现严重错 误,称这种“跑飞”为“第二类跑飞”无论是前一种情况还是后一种情 况,“跑飞”的程序执行结果将是无法预料的第一类跑飞”在执行一 段错误程序之后还有可能回到正常轨道,但是“第二类跑飞”不可能再回 到正常轨道了,往往是以进入“死循环”而告终,本文主要从实际应用的 角度阐述单片机系统软件抗干扰的具体实现方法 1单片机软件抗干扰设计的主要方法软件抗干扰设计的主要目的就是及时发现程序的“跑飞”,并及时地 将程序拉入正常轨道,主要方法有:指令冗余、软件“看门狗”、软件“陷阱”、程序“跑飞”拦截等等 1.1指令冗余CPU取指令过程是先取操作码,再取操作数在程序的关键地方人为 的插入一些单字节指令,或将有效单字节指令重写称为指令冗余,通常是 在双字节指令和三字节指令后插入两个字节以上的NOP指令这样即使跑 飞程序飞到双字节指令和三字节指令操作数上,由于空操作指令NOP的存 在,避免了后面的指令被错误地执行,为程序纳入正轨做好准备此外, 对系统流向起重要作用的指令,如RET、RETI、LCALL、LJMP、JC等,可 以在这些指令之前插入两条N0P指令,可将跑飞程序纳入正轨,以确保这 些重要指令的执行。
指令冗余只能使CPU不再将操作数当作操作码错误地执行,却不能主 动地将程序的错误执行方向扭转过来,要想纠正程序的错误执行方向,就 需要下面的技术 1.2软件“看门狗”技术跑飞的程序在执行一些错误操作之后,经常会进入“死循环”,也就 是常说的“死机”通常采用“看门狗”技术使程序脱离“死循环”,“看门狗”技术可由硬件实现,也可由软件实现硬件“看门狗”技术这 里不再赘述,软件“看门狗”技术的原理是通过不断检测程序循环运行时 间,若发现程序循环时间超过最大循环运行时间,则认为系统陷入“死循 环”,需要进行出错处理在实际应用中,通常用定时中断服务程序定时地检查主程序的运行情 况例如,在RAM区选择一个字节作为软件看门狗寄存器,主程序每循环 一次将该寄存器加1,定时器T0的中断服务程序每中断一次将该寄存器 减1并检查一次,如果程序执行正常,看门狗寄存器不会改变或改变不大, 如果看门狗寄存器发生了改变或改变很大,则说明系统陷入“死循环”, 需要进行出错处理在工业应用中,严重的干扰有时会破坏中断方式控制字,关闭中断, 造成看门狗失效,这时可以采用环形中断监视系统用定时器T0监视定 时器T1,用定时器T1监视主程序,主程序监视定时器T0。
采用这种环形 结构的软件“看门狗”具有良好的抗干扰性能,大大提高了系统可靠性对于 需经常使用T1定时器进行串口通信的测控系统,则定时器T1不能进行中 断,可改由串口中断进行监控(如果用的是MCS-52系列单片机,也可用 T2代替T1进行监视)当然,对主程序最大循环周期、定时器T0和T1 定时周期应予以全盘合理考虑软件“看门狗”技术需要使用定时器,而在大多数的控制程序中,定 时器都是紧俏的资源,这就使软件“看门狗”技术的实际应用受到了限制, 可以采取一些技巧性的处理,将软件“看门狗”程序与其他定时程序复用 同一个定时器,这样既完成定时功能又完成软件“看门狗”的功能1.3软件“陷阱”通常在程序存储器中未使用的EPROM空间填入空操作指令NOP(00H), 最后再填入一条跳转指令,跳转到跑飞处理程序,或者直接填入指令 LJMP0000H(020000),当跑飞程序落到此区,即可在执行一段空操作后转 入正轨如果未使用的EPROM空间比较大,可以均匀地填入几条跳转指令, 这种几条空操作指令加一个跳转指令的结构称之为“软件陷阱”软件 陷阱的一般结构为: NOP; NOP; LJMPFLY: FLY为跑飞处理程序。
如果程序正常执行,软件陷阱部分是永远也执行不到的,只有在程序 跑飞到陷阱里,软件陷阱会立刻将程序跳转到正常轨道即使程序没有跑 飞到陷阱里,也可以在程序执行一段错误操作后遇到一个软件陷阱,从而 转入正轨除了程序存储器的空白区,程序的数据表结尾也应该设置软件陷阱, 如果数据表比较大,应该在数据表的中间也设置软件陷阱,以保证程序跑 飞到数据区能及时转入正轨另外,如果程序存储器的空间足够的话,可 以在每两个子程序中间设置一个软件陷阱当使用的中断因干扰而开放时, 在对应的中断服务程序中设置软件陷阱,能及时捕获错误的中断如某应 用系统虽未用到外部中断1,外部中断1的中断服务程序可为如下形式:NOP; NOP; RETI 返回指令可用“RETI”,也可用“LJMPFLY”,用“LJMPFLY”作返回指令可直接进入故障诊断程序,尽早 地处理故障并恢复程序的运行软件陷阱的数量要根据实际受到干扰的情 况和程序存储器的容量来确定,如果太少不能进行有效的跑飞拦截,如果 太多又会占用大量的程序存储器空间 1.4设置程序运行标志,拦截“跑飞”程序单片机程序的结构一般都是由一个上电复位初始化程序、一个主程序、 几个中断服务程序和若干子程序组成的,51系列单片机的RAM区中有一 个位寻址区,可以在位寻址区中设立一些标志位,这些标志位分别代表不 同的程序模块,一个字节可以对应8个程序模块。
当某个程序模块正在执 行时,对应的标志位置1,不执行时对应的标志位置0,就可以知道当前 正在执行的程序是哪一个模块,当标志位的值与正在执行的程序模块不一 致时,可以肯定程序出现了“跑飞”,需要尽快进行错误处理,通过进一 步的检查还可以知道程序是从哪个模块“飞”过来的举一个简单的例子来说明拦截“跑飞”程序的应用,在调用每一个子 程序的开始将自己的标志位置1,在子程序的结尾进行检查,如果自己的 标志位是1,说明程序执行正常,否则程序就出现了“跑飞”,当然在退 出该子程序之前,需要将其对应标志位清零另外我们还可以检查的复杂 一些,每个程序模块在检查时,其父程序的标志位为1,其子程序的标志 位一定为零,如果违背了这一原则,则程序出现了“跑飞”如果程序模块比较多,位寻址区不够使用,我们可以给不同的模块分 配不同的代码,在RAM区选择一个特殊字节作为运行标志,当某个程序模 块正在执行时,将该特殊字节赋值为该模块的代码,这样一个RAM字节就 可以对应256个程序模块需要注意的是,在调用子程序时必须先将运行 标志压入堆栈,因为此时父程序也在执行然后将运行标志设置成子程序 的代码,在该子程序退出之前检查运行标志,并将父程序的代码从堆栈里 弹出,赋值给运行标志。
由以上的内容可以看出,当程序的结构化比较好时,这种拦截跑飞的 技术可以比较容易实施 2经常用到的其他提高单片机系统抗干扰性能 的方法 2.1检查RAM区标志数据,及时发现严重干扰这种方法是在RAM区中选择几个固定单元,在初始化程序中将其设置 成固定的数据,如“55H”或“0AAH”等,只要程序正常运行,这些单元 的内容是不会改变的如果因为程序“跑飞”或其他干扰导致这些RAM单 元中的任何单元的数据发生了变化,说明单片机系统已经受到了严重的干 扰,不能可靠地运行下去了可以在程序执行的过程中适时地检查这些 RAM单元的内容,一旦发现有数据改变,立刻执行LJMP0000H语句,强制 单片机复位 2.2刷新输出端口,排除严重干扰当单片机系统受到严重干扰时,输出端口的状态也可能因干扰而改变,在程序的执行过程中适时地根据相关程序模块的运算结果刷新输出端口, 可以排除干扰对输出端口状态的影响,使错误的输出状态及时得到纠正 可以在指定的RAM单元中保存相关程序模块的运算结果,以及输出端口当 时应处的状态,在程序运行过程中根据这些RAM单元的内容去刷新输出 I/O 口 2.3输入多次采样,避免严重干扰强烈的干扰会影响单片机的输入信号,造成输入信号瞬间采样的误差 或误读,要避免干扰的影响,通常采取重复采样、加权平均的方法。
3结束语软件运行过程中受到的干扰是不确定的,软件抗干扰属于微机系统的 自身防御行为,以上所提到的软件抗干扰的方法,都不是单独使用的,只 有根据实际情况将这些方法有效地结合起来,并与硬件抗干扰措施一起使 用,才能达到最佳抗干扰效果,使我们的单片机系统稳定可靠地工作[参考文献] [1]胡汉才•单片机原理及其接口技术[M] •北京: 清华大学出版社,1996. [2]戴梅萼•微型计算机及其应用[M] •北京:清华大学出版社,1991.。