按动开关K,使单片机工作于任一程序模块,对单片机进行冲击实验。实验中多次出现程序跳转和“死机”现象。程序跳转是指程序跳过一段指令后仍能正常运行。“死机”有两种表现:一是按动开关K,数码管显示内容无变化;二是按动开关K,数码管显示内容改变几次后不再发生变化。图3 是示波器上记录下的单片机“死机”时,脚上的干扰波形。
“死机”是指干扰使程序计数器内容改变,结果可能将一条指令的后半字节与下一条指令的前半字节当做一条指令来执行,从而使程序进入一个意想不到的死循环[4]。程序跳转不一定必然引起“死机”。当程序跳转到某条指令首字节时,一般不会引起“死机”,如实验中出现的程序跳转现象。实验中“死机”的第一种表现是干扰后程序已进入死循环;第二种表现是干扰后程序并未立即进入死循环,先停留在一条等待指令上,即:WAIT:JNB P1.0 WAIT,等待开关K的按下,按下开关K后,程序继续运行错误指令而进入死循环。此时执行的等待指令并不是正常的等待指令,而是由一条指令的后半字节与下一条指令的前半字节组合成的指令。
一般认为“死机”是由于干扰改变了程序计数器的PC值引起的。但通过实验,并根据单片机的读指时序图,我们认为还有两种可能造成“死机”:一是由于数据线上的干扰信号使CPU读入了错误的跳转指令;二是由于脚上的干扰信号(如图3)使CPU在非读指周期发生读指操作,读入了错误的跳转指令。
2.3 控制状态改变效应实验研究
单片机系统的控制信号一般由锁存器保存[5],因此,可通过研究锁存器输出数据的变化情况来研究控制状态的变化。该单片机系统中的数码管的数据是由四位锁存器74LS373保存的,数码管显示内容的变化可直观地反映锁存器输出状态的变化。
按动开关K,使单片机工作于任一程序模块,对单片机进行冲击实验。几乎每次冲击都能使数码管显示内容发生改变。由锁存器74LS373的时序图可知,ALE脚上脉冲的上升沿可将数据输入端的信号存入锁存器。在每次冲击实验中,ALE脚有很强的干扰信号,而每次数据输入端的干扰数据都不同,因此每次数码管的显示内容也都不同。
2.4 A/D转换电路效应实验研究
按动开关K,使单片机工作于A/D转换电路检测模块。A/D转换程序循环运行(提高A/D转换期间受冲击的概率),并随时显示转换结果的最大、最小值,在此期间进行冲击实验。
实验中发现转换结果的最大、最小值严重偏离正常值“8AH”(可调),最大值可达“FFH”(对应5V,满量程),最小值到“00”。其原因有三:(1)模拟输入端的输入信号上迭加有干扰信号(干扰脉冲峰值可达几十伏);(2)读转换结果时,数据线上的干扰信号使读入数据出错;(3)强干扰使AD0809的工作异常。实验表明,数据采集误差增大主要由前两个因素引起。
2.5 串行通讯电路效应实验研究
按动开关K,使单片机工作于串口通讯功能检查模块。这部分程序也是循环进行的(提高通讯期间受到冲击的概率),当发现接收数据与发送数据不符时,显示出错信息。在此期间进行冲击实验,图4是RXD脚上的正常波形和通讯出错时的干扰波形。
串口通讯出错的原因有两个:(1)干扰使CPU内的串口电路工作失误,从而使接收与发送不符;(2)RXD线上的干扰信号使串行数据发生混乱。图4中,RXD上有很强的干扰信号,而且低电平被展宽了3~4倍。这是通讯出错的主要原因。
2.6 读写存储器RAM效应实验研究
按动开关K,使单片机工作于RAM检测模块。该部分实验由三部分组成:(1)先在RAM的0000H~1FFFH单元写入数据(“AAH”、“55H”), 然后等待开关K按下,等待期间进行冲击实验。冲击完毕,按下开关K,判断RAM内容是否改变并显示数据改变的个数。(2)先进行循环写(提高写期间受到冲击的概率),在写期间进行冲击实验,冲击完毕,显示数据改变的个数。(3)先写入,然后循环读(提高读期间受到冲击的概率),在读期间进行冲击实验,并显示数据改变的个数。图5是循环读出现2个错误时,采集到的
脚和脚上的干扰波形。