1、程序跑飛現象
隨著單片機在能源領域中的廣泛應用,單片機的抗幹擾問題越來越突出,煤礦井下環境一般比較惡劣,這便會為單片機控制系統帶來各種幹擾,以致系統不能正常工作。單片機應用系統的抗幹擾性能主要取決於硬體的抗幹擾設計,但軟體
抗幹擾設計作為硬體抗幹擾的完善和補充,作用也非常重要,因為大量的幹擾通常並不能影響系統內硬體的運作,卻常會使系統的軟體無法正常運行,單片機應用的一個突出問題,便是單片機運行過程中經常出現的程序跑飛現象。
在單片機系統中,因為幹擾的原因,在非預期的情況下,使得程序計數器PC 的值發生隨機的變化,從而使得程序的流向指向不確定區域,這便是程序的跑飛。程序跑飛後或者會使指令的地址碼和操作碼發生改變,PC 把操作數當作指令來執行;或者PC值指向一條不合邏輯關係的指令甚或是非程序區,運行結果常常會使單片機進入死循環———便是大家常說的「死機」。為確保在無人當值的情況下,單片機「死機」後能自動恢復過來,通常採用軟體陷阱,外部WDT 電路,以及軟體控制的WATCHDOG 等方法,使系統恢復正常(後兩種俗稱「看門狗」),限於篇幅不做專門說明,這裡主要向大家介紹用555 定時器軟硬結合做看門狗的一種方法。
2、555定時器
一般情況下,看門狗主要是通過不斷監視程序運行一個事件的時間是否超過預定的時間來判斷程序是否進入了死循環,因此利用555 定時器可復位的觸發功能外加延時電路可實現看門狗的功能。555定時器是一種多用途的單片集成電路,內部電路如圖1 所示。
CO端是控制電壓輸入端,加控制電壓可改變A1「-」端及A2「 +」端的參考電壓,若不用,可通過一個小電容接地,以防旁路高頻交流幹擾;R 為定時器直接復位端,加低電平可將定時器直接置「0」,此時,OUT輸出「0」,Q 為1」,V 導通,D 端對地通路;TH 為復位閥值輸入端,當TH 電壓超過2/3UDD(即A1 負端分壓)時,A1 輸出為「1」,OUT 輸出「0」,同樣,D 端對地通路;TR 為置位輸入端,當TR電壓低於1/3 UDD(即A2 正端分壓)時,A2 輸出「1」,定時器被置位,此時,OUT 輸出「1」,Q 為「0」,V截止,D端對地斷路。
3、看門狗電路及運行指令以INTEL公司的16 位單片機8096 為例,555定時器作為看門狗與單片機的接口電路可設計如圖2 所示。
首先在單片機初始化時用指令「ORBPORT1,#01H」置P1.0 為「1」,則三極體T 導通,555 晶片的R 為「1」,TH、TR 端經R、C 充電,電位逐漸上升,當電位還低於1/3 UDD 時,OUT 輸出「1」,D端對地斷路,電容C 正常充電,(http://www.diangon.com/版權所有)一旦程序跑飛或進入死循環,在電位上升到高於2/3 UDD時仍沒有「餵狗」,則OUT輸出變為「0」,經三極體T拉低單片機的RESET 腳,並使復位電容放電,這時
D 端對地短路,電容C 也通過Rf 放電,當TH、TR端電位放電到低於1/3 UDD(注意)時,OUT輸出重新變為「1」,單片機進入復位狀態。
「餵狗」是指復位看門狗,在本電路中只須運行以下指令即可。
ANDB PORT1,#0FEH ;使P1.0 為「0」
SKIP ;空操作,用於延時
SKIP ;以使TR電壓降到1/3 UDD為宜
ORB PORT1,#01H ;使P1.0 為「1」
當P1.0 被置為「0」時,555 定時器的R 端為「0」,三極體T 截止。R 端為「0」則555 晶片被復位,OUT 輸出為「0」,同時D 端對地短路,電容C放電為重新延時做準備,但因為三極體的截止,此時OUT 輸出雖然也為「0」卻並不影響單片機的RESET腳,單片機正常工作,從而區分開了「餵狗」與系統故障時看門狗發生作用的不同之處。
4、需要注意的問題
這裡仍然有一個問題需要注意,那就是555定時器的正常工作與否完全依賴於單片機P1.0的狀態,但在某些幹擾比較嚴重的情況下,單片機的誤操作是有可能改變P1.0 的預置狀態的,若單片機在進入死循環之前,P1.0 被誤置為了「0」,看
門狗始終處於「被餵」的狀態,那這個電路便就無法再發揮作用了,對這種情況我們可用軟體冗餘的方法來應對,就是在程序的關鍵地方多次插寫看門狗的激活指令:
NOP
ORB PORT1,#01H
值得提醒一下的是這裡「NOP」指令的作用不容忽視,可使跑飛的程序納入正軌,不致衝散後面的關鍵指令。不過儘管如此軟體冗餘的應用也還是有一個前提的,那就是跑飛的程序必須落在程序區,冗餘的指令得到執行方可生效,若跑飛的程序落在了非程序區,僅憑指令冗餘技術便不可靠了,這時我們便還須藉助其他抗幹擾技術的支持,如軟體陷阱、標誌技術,本質可靠性程序的設計等,在此不再贅述,但這些都必須包含在一個可靠的程序內———畢竟,單片機系統來自幹擾的影響是立體的,那麼,我們的應對策略便也須是全方位的。