MCS51系列單片機軟件復位的方法
4. 在所有指令中,只有RETI指令能清除中斷激活標志。出錯處理程序ERR主要是完成這一功能,其它的善后工作交由復位后的系統(tǒng)去完成。為此,我們重新設計T1中斷子程序如下所示:
PT1: CPL?。校保病?;高級中斷程序發(fā)光二極管閃爍
INC 30H??;軟件WATCHDOG計數(shù)器增值
MOV?。粒常埃?p>ADD?。粒#埃疲?p>JC?。牛遥摇。贿_到3次否?
RETI
ERR: CLR?。牛痢。魂P中斷
CLR?。痢。粶蕚?a class="contentlabel" href="http://butianyuan.cn/news/listbylabel/label/復位">復位地址(0000H)
PUSH?。粒茫?p>PUSH?。粒茫?p>RETI?。磺宄袛嗉せ顦酥静?a class="contentlabel" href="http://butianyuan.cn/news/listbylabel/label/復位">復位
這段程序先關中斷,以便后續(xù)處理能順利進行,然后用RETI指令替代LJMP指令,從而既清除了中斷激活標志又完成了轉(zhuǎn)向0000H的任務。按這樣改好后程序再運行,結果仍不理想:按下按鈕后,有時只有主程序和高級中斷子程序能迅速恢復正常,而低級中斷仍有被關閉的可能。如果按如下方法把干擾轉(zhuǎn)移到低級中斷中,則按下按鈕后低級中斷必然被關閉:
LOOP: CPL?。校保?p>MOV?。遥?,#80H
MOV R7,#0H
TT1:?。模剩危凇。遥罚裕裕?p>DJNZ?。遥?,TT1
SJMP?。蹋希希?p>PT0:?。茫校獭。校保?p>JB?。埃埃?,STOP
RETI
STOP:?。蹋剩停小。樱裕希小?;掉入死循環(huán)。
仔細分析后可能得出結論:當軟件WATCHDOG是嵌套在低級中斷中起作用時,復位后只清除了高級中斷激活標志,低級中斷標志仍然被置位,從而使低級中斷一直被關閉。
5. 修改出錯處理如下:
ERR:?。茫蹋摇。牛痢?;正確的軟件復位入口
MOV 66H,#0AAH ;重建上電標志
MOV?。叮罚?,#55H
MOV?。模校裕?,#ERR1 ;準備第一次返回地址
PUSH?。模校?p>PUSH?。模校?p>RETI ;清除高級中斷激活標志
ERR1: CLR?。?p>PUSH?。粒茫?p>PUSH ACC
RETI?。磺宄图壷袛嗉せ顦酥?p>
評論