MCS51系列单片机软件复位的方法
活标志的得要性,很多文献的作者回为没有认识到这一点进入误区。
4. 在所有指令中,只有RETI指令能清除中断激活标志。出错处理程序ERR主要是完成这一功能,其它的善后工作交由复位后的系统去完成。为此,我们重新设计T1中断子程序如下所示:
PT1: CPL P1.2 ;高级中断程序发光二极管闪烁
INC 30H ;软件WATCHDOG计数器增值
MOV A,30H
ADD A,#0FD
JC ERR ;达到3次否?
RETI
ERR: CLR EA ;关中断
CLR A ;准备复位地址(0000H)
PUSH ACC
PUSH ACC
RETI ;清除中断激活标志并复位
这段程序先关中断,以便后续处理能顺利进行,然后用RETI指令替代LJMP指令,从而既清除了中断激活标志又完成了转向0000H的任务。按这样改好后程序再运行,结果仍不理想:按下按钮后,有时只有主程序和高级中断子程序能迅速恢复正常,而低级中断仍有被关闭的可能。如果按如下方法把干扰转移到低级中断中,则按下按钮后低级中断必然被关闭:
LOOP: CPL P1.0
MOV R6,#80H
MOV R7,#0H
TT1: DJNZ R7,TT1
DJNZ R6,TT1
SJMP LOOP
PT0: CPL P1.1
JB 00H,STOP
RETI
STOP: LJMP STOP ;掉入死循环。
仔细分析后可能得出结论:当软件WATCHDOG是嵌套在低级中断中起作用时,复位后只清除了高级中断激活标志,低级中断标志仍然被置位,从而使低级中断一直被关闭。
5. 修改出错处理如下:
ERR: CLR EA ;正确的软件复位入口
MOV 66H,#0AAH ;重建上电标志
MOV 67H,#55H
MOV DPTR,#ERR1 ;准备第一次返回地址
PUSH DPL
PUSH DPH
RETI ;清除高级中断激活标志
ERR1: CLR A
PUSH ACC
PUSH ACC
RETI ;清除低级中断激活标志
这时,必须执行两次RETI,才能到达0000H,以保证清除全部中断激活标志,达到和硬件复位相同的效果。同样,软件陷井也必须由下列三条指令
NOP
NOP
LJMP STAT
改成:
NOP
NOP
LJMP ERR
才能达到目的。
当主程序受到干扰被软件陷阱捕获时,中断标志并未置位,执行ERR过程中,RETI指令等效于RET指令,同样可以达到软件复位的目的。有兴趣的读者可以将软件陷阱代替死循环,分别用LJMP STAT和LJMP ERR1来替代LJMP ERR,再将干扰检测分别设在低级中断和主程序中,实验结果必然证明同:只有LJMP ERR才能万无一失地实现软件复位,使系统摆脱干扰同,恢复正常。在MCS-51单片机的软件复位过程中,必须连续执行两次中断返回指令RETI。
- TMS320F2812系统中的软件复位方法(04-20)
- 嵌入式软件开发之: 复位和初始化(08-30)
- 复位设计中出现的结构性缺陷及解决方案(04-30)
- 复位设计中的结构性缺陷及解决方案(07-07)
- 单片机最小系统组成及电源/复位/振荡电路解析(01-03)
- 谈单片机系统的电磁兼容性设计(03-01)