nbsp; POP 01H
POP 02H
POP ACC
RETI ;中断返回
引用该子程序主要想讨论以下两个问题:
中断程序的常规错误
1)现场的保护与恢复
该指令通过PUSH压栈指令将程序中用到的寄存器及其它资源保护起来,然后通过出栈指令按照“先进后出”原则在中断返回前依次恢复,避免干扰或破坏其它程序的正常执行。
当然,工作寄存器的保存也可通过寄存器组切换的方式更为便捷地实现。由于中断的不可预测性,因此现场保护显得尤为重要,否则中断返回后无法正常运行被中断程序。这种错误的调试非常困难。
2)触发方式的正确使用
51单片机的外中断有两种触发方式:低电平触发和下跳边沿触发。为了设计正确的中断子程序,必须十分清楚地了解两种方式的差异。电平触发方式的中断标志位单片机不会自动清除,而边沿触发方式下该标志位能自动清除。上面的INT0中断子程序采用电平触发方式,如果将CLR IE0指令疏漏,会导致中断重入错误。
2.断点调试方法的应用
由于中断的不可控制特性,因此中断子程序的调试常常通过仿真器的断点功能来实现。一般分两种情形:
看是否正常触发中断
为了查看是否正常触发中断,以排查相关的软硬件系统是否存在错误,可以简单地在中断子程序的第一条指令设置断点,然后联机全速执行。如果能进入断点,则说明触发电路等基本正常,中断初始化程序也基本正常。
看结果是否正常
也是采用断点法,将断点设置在需要查看的位置。例如设置在PRI标号位置可以查看整个结果,即AD_L开始的3单元中的内容。如果在该处无法进入中断,则说明此前程序隐含错误,断点必须逐渐前移,一旦断点能正常进入,则一般可以断定断点后的程序可能有错误。
【例三】16位定时中断子序。
;*************************************************************************
;定时器中断2: 16位重装入方式
;*************************************************************************
TO_COUNT EQU 30H ;中断计数器
;
INT_T2: CLR EA
PUSH PSW
PUSH ACC ;保护现场,A
PUSH 00H ;R0
PUSH 01H ;R1
PUSH 02H ;R2
&