Ⅰ 單片機系統軟體抗干擾方法 用c語言編寫的
MCU抗干擾當然需要同時從軟硬體兩方面著手。
LZ既然說到用C語言去抗干擾的話,我這里就自己積累的一些簡單經驗分享有一下(其實匯編和C在抗干擾方面差不多,我這里就C方面講吧):
1、可以在對系統起重要的指令如函數調用前和函數返回前加上兩條 「_nop_()」這個函數, ,以便有比較高的概略入正軌。
2、雖然在整個系統中未用中斷,但建議把所有未用到的中斷響應寫成空函數。
3、軟體「看門狗」技術,因為硬體看門狗有時候在工業應用中,嚴重的干擾會破壞中斷控制字,關閉中斷,系統無法定時看門狗,而軟體看門夠能有效解決這個問題,在實際應用中,可採用「環行中斷監視系統」,我這里就舉個例子,用定時器T0通過一個變數來監視定時器T1,在用T1來監視主程序的,主程序監視T0,,,這里可通過3個變數的自增1來簡單實現,,,,,,,,當然還有其他更好的方法。
就大致說這樣3點吧,我感覺現有的MCU抗干擾本身就做的不錯,當然MCU外部的電路抗干擾也絕不能忽視,,,上面個人提到的3點,在一般的情況下,都是不需要那樣做的,,而在我實際使用中,好象還沒有遇見過MCU由於干擾而出現的問題(其實這樣的事情讓我遇到,也是比較開心的,能增加一些感性認識)。
Ⅱ 單片機原理的抗干擾
在提高硬體系統抗干擾能力的同時,軟體抗干擾以其設計靈活、節省硬體資源、可靠性好越來越受到重視。下面以MCS-51單片機系統為例,對微機系統軟體抗干擾方法進行研究。 在工程實踐中,軟體抗干擾研究的內容主要是:一、消除模擬輸入信號的雜訊(如數字濾波技術);二、程序運行混亂時使程序重入正軌的方法。本文針對後者提出了幾種有效的軟體抗干擾方法。
指令冗餘
CPU取指令過程是先取操作碼,再取操作數。當PC受干擾出現錯誤,程序便脫離正常軌道「亂飛」,當亂飛到某雙位元組指令,若取指令時刻落在操作數上,誤將操作數當做操作碼,程序將出錯。若「飛」 到了三位元組指令,出錯機率更大。
在關鍵地方人為插入一些單位元組指令,或將有效單位元組指令重寫稱為指令冗餘。通常是在雙位元組指令和三位元組指令後插入兩個位元組以上的NOP。這樣即使亂飛程序飛到操作數上,由於空操作指令NOP的存在,避免了後面的指令被當作操作數執行,程序自動納入正軌。
此外,對系統流向起重要作用的指令如RET、 RETI、LCALL、LJMP、JC等指令之前插入兩條NOP,也可將亂飛程序納入正軌,確保這些重要指令的執行。
攔截技術
所謂攔截,是指將亂飛的程序引向指定位置,再進行出錯處理。通常用軟體陷阱來攔截亂飛的程序。因此先要合理設計陷阱,其次要將陷阱安排在適當的位置。
(1 )軟體陷阱的設計
當亂飛程序進入非程序區,冗餘指令便無法起作用。通過軟體陷阱,攔截亂飛程序,將其引向指定位置,再進行出錯處理。軟體陷阱是指用來將捕獲的亂飛程序引向復位入口地址0000H的指令。通常在EPROM中非程序區填入以下指令作為軟體陷阱:
(2 ) 陷阱的安排
最後一條應填入020000,當亂飛程序落到此區,即可自動入軌。在用戶程序區各模塊之間的空餘單元也可填入陷阱指令。當使用的中斷因干擾而開放時,在對應的中斷服務程序中設置軟體陷阱,能及時捕獲錯誤的中斷。如某應用系統雖未用到外部中斷1,外部中斷1的中斷服務程序可為如下形式:
NOPNOPRETI返回指令可用「RETI」,也可用「LJMP 0000H」。如果故障診斷程序與系統自恢復程序的設計可靠、 完善,用「LJMP 0000H」作返回指令可直接進入故障診斷程序,盡早地處理故障並恢復程序的運行。
考慮到程序存貯器的容量,軟體陷阱一般1K空間有2-3個就可以進行有效攔截。
軟體「看門狗」技術
若失控的程序進入「死循環」,通常採用「看門狗」技術使程序脫離「死循環」。通過不斷檢測程序循環運行時間,若發現程序循環時間超過最大循環運行時間,則認為系統陷入「死循環」,需進行出錯處理。
「看門狗」技術可由硬體實現,也可由軟體實現。在工業應用中,嚴重的干擾有時會破壞中斷方式控制字,關閉中斷。則系統無法定時「喂狗」,硬體看門狗電路失效。而軟體看門狗可有效地解決這類問題。
筆者在實際應用中,採用環形中斷監視系統。用定時器T0監視定時器T1,用定時器T1監視主程序,主程序監視定時器T0。採用這種環形結構的軟體「看門狗」具有良好的抗干擾性能,大大提高了系統可靠性。對於需經常使用T1定時器進行串口通訊的測控系統,則定時器T1不能進行中斷,可改由串口中斷進行監控(如果用的是MCS-52系列單片機,也可用T2代替T1進行監視)。這種軟體「看門狗」監視原理是:在主程序、T0中斷服務程序、T1中斷服務程序中各設一運行觀測變數,假設為MWatch、T0Watch 、T1Watch,主程序每循環一次,MWatch加1,同樣T0、T1中斷服務程序執行一次,T0Watch、 T1Watch加1。在T0中斷服務程序中通過檢測T1Watch的變化情況判定T1運行是否正常,在T1中斷服務程序中檢測MWatch的變化情況判定主程序是否正常運行,在主程序中通過檢測T0Watch的變化情況判別T0是否正常工作。若檢測到某觀測變數變化不正常,比如應當加1而未加1,則轉到出錯處理程序作排除故障處理。當然,對主程序最大循環周期、定時器T0和T1定時周期應予以全盤合理考慮。限於篇幅不贅述。 單片機系統因干擾復位或掉電後復位均屬非正常復位,應進行故障診斷並能自動恢復非正常復位前的狀態。
非正常復位的識別
程序的執行總是從0000H開始,導致程序從 0000H開始執行有四種可能:一、系統開機上電復位;二、軟體故障復位;三、看門狗超時未喂狗硬體復位; 四、任務正在執行中掉電後來電復位。四種情況中除第一種情況外均屬非正常復位,需加以識別。
(1 )硬體復位與軟體復位的識別
此處硬體復位指開機復位與看門狗復位,硬體復位對寄存器有影響,如復位後PC=0000H, SP=07H,PSW=00H等。而軟體復位則對SP、SPW無影響。故對於微機測控系統,當程序正常運行時,將SP設置地址大於07H,或者將PSW的第5位用戶標志位在系統正常運行時設為1。那麼系統復位時只需檢測PSW.5標志位或SP值便可判此是否硬體復位。
由於硬體復位時片內RAM狀態是隨機的,而軟體復位片內RAM則可保持復位前狀態,因此可選取片內某一個或兩個單元作為上電標志。設40H用來做上電標志,上電標志字為78H,若系統復位後40H單元內容不等於78H,則認為是硬體復位,否則認為是軟體復位,轉向出錯處理。若用兩個單元作上電標志,則這種判別方法的可靠性更高。
(2 )開機復位與看門狗故障復位的識別
開機復位與看門狗故障復位因同屬硬體復位, 所以要想予以正確識別,一般要藉助非易失性RAM或者EEROM。當系統正常運行時,設置一可掉電保護的觀測單元。當系統正常運行時,在定時喂狗的中斷服務程序中使該觀測單元保持正常值(設為 AAH),而在主程中將該單元清零,因觀測單元掉電可保護,則開機時通過檢測該單元是否為正常值可判斷是否看門狗復位。
(3 )正常開機復位與非正常開機復位的識別
識別測控系統中因意外情況如系統掉電等情況引起的開機復位與正常開機復位,對於過程式控制制系統尤為重要。如某以時間為控制標準的測控系統,完成一次測控任務需1小時。在已執行測控50分鍾的情況下,系統電壓異常引起復位,此時若系統復位後又從頭開始進行測控則會造成不必要的時間消耗。因此可通過一監測單元對當前系統的運行狀態、系統時間予以監控,將控制過程分解為若干步或若干時間段,每執行完一步或每運行一個時間段則對監測單元置為關機允許值,不同的任務或任務的不同階段有不同的值,若系統正在進行測控任務或正在執某時間段,則將監測單元置為非正常關機值。那麼系統復位後可據此單元判系統原來的運行狀態,並跳到出錯處理程序中恢復系統原運行狀態。
非正常復位後系統自恢復運行的程序設計
對順序要求嚴格的一些過程式控制制系統,系統非正常復位否,一般都要求從失控的那一個模塊或任務恢復運行。所以測控系統要作好重要數據單元、參數的備份,如系統運行狀態、系統的進程值、當前輸入、輸出的值,當前時鍾值、觀測單元值等,這些數據既要定時備份,同時若有修改也應立即予以備份。
當在已判別出系統非正常復位的情況下,先要恢復一些必要的系統數據,如顯示模塊的初始化、片外擴展晶元的初始化等。其次再對測控系統的系統狀態、運行參數等予以恢復,包括顯示界面等的恢復。之後再把復位前的任務、參數、運行時間等恢復, 再進入系統運行狀態。
應當說明的是,真實地恢復系統的運行狀態需 要極為細致地對系統的重要數據予以備份,並加以數據可靠性檢查,以保證恢復的數據的可靠性。
其次,對多任務、多進程測控系統,數據的恢復需考慮恢復的次序問題。
系統基本初始化是指對晶元、顯示、輸入輸出方式等進行初始化,要注意輸入輸出的初始化不應造成誤動作。而復位前任務的初始化是指任務的執行狀態、運行時間等。
對於軟體抗干擾的一些其它常用方法如數字濾波、RAM數據保護與糾錯等,限於篇幅,本文未作討論。在工程實踐中通常都是幾種抗干擾方法並用,互相補充 完善,才能取得較好的抗干擾效果。從根本上來說,硬體抗干擾是主動的,而軟體是抗干擾是被動的。細致周到地分析干擾源,硬體與軟體抗干擾相結合,完善系統監控程序,設計一穩定可靠的單片機系統是完全可行的。
Ⅲ 單片機系統軟體抗干擾方法
在提高硬體系統抗干擾能力的同時 軟體抗干擾以其設計靈活 節省硬體資源 可靠性好越來越受到重視 下面以MCS 單片機系統為例 對微機系統軟體抗干擾方法進行研究
軟體抗干擾方法的研究
在工程實踐中 軟體抗干擾研究的內容主要是 一 消除模擬輸入信號的嗓聲(如數字濾波技術) 二 程序運行混亂時使程序重入正軌的方法 本文針對後者提出了幾種有效的軟體抗干擾方法
指令冗餘
CPU取指令過程是先取操作碼 再取操作數 當PC受干擾出現錯誤 程序便脫離正常軌道 亂飛 當亂飛到某雙位元組指令 若取指令時刻落在操作數上 誤將操作數當作操作碼 程序將出錯 若 飛 到了三位元組指令 出錯機率更大
在關鍵地方人為插入一些單位元組指令 或將有效單位元組指令重寫稱為指令冗餘 通常是在雙位元組指令和三位元組指令後插入兩個位元組以上的NOP 這樣即使亂飛程序飛到操作數上 由於空操作指令NOP的存在 避免了後面的指令被當作操作數執行 程序自動納入正軌
此外 對系統流向起重要作用的指令如RET RETI LCALL LJMP JC等指令之前插入兩條NOP 也可將亂飛程序納入正軌 確保這些重要指令的執行
攔截技術
所謂攔截 是指將亂飛的程序引向指定位置 再進行出錯處理 通常用軟體陷阱來攔截亂飛的程序 因此先要合理設計陷阱 其次要將陷阱安排在適當的位置
軟體陷阱的設計
當亂飛程序進入非程序區 冗餘指令便無法起作用 通過軟體陷阱 攔截亂飛程序 將其引向指定位置 再進行出錯處理 軟體陷阱是指用來將捕獲的亂飛程序引向復位入口地址 H的指令 通常在EPROM中非程序區填入以下指令作為軟體陷阱
NOP
NOP
LJMP H
其機器碼為
陷阱的安排
通常在程序中未使用的EPROM空間填 最後一條應填入 當亂飛程序落到此區 即可自動入軌 在用戶程序區各模塊之間的空餘單元也可填入陷阱指令 當使用的中斷因干擾而開放時 在對應的中斷服務程序中設置軟體陷阱 能及時捕獲錯誤的中斷 如某應用系統雖未用到外部中斷 外部中斷 的中斷服務程序可為如下形式
NOP
NOP
RETI
返回指令可用 RETI 也可用 LJMP H 如果故障診斷程序與系統自恢復程序的設計可靠 完善 用 LJMP H 作返回指令可直接進入故障診斷程序 盡早地處理故障並恢復程序的運行
考慮到程序存貯器的容量 軟體陷阱一般 K空間有 個就可以進行有效攔截
軟體 看門狗 技術
若失控的程序進入 死循環 通常採用 看門狗 技術使程序脫離 死循環 通過不斷檢測程序循環運行時間 若發現程序循環時間超過最大循環運行時間 則認為系統陷入 死循環 需進行出錯處理
看門狗 技術可由硬體實現 也可由軟體實現 在工業應用中 嚴重的干擾有時會破壞中斷方式控制字 關閉中斷 則系統無法定時 喂狗 硬體看門狗電路失效 而軟體看門狗可有效地解決這類問題
筆者在實際應用中 採用環形中斷監視系統 用定時器T 監視定時器T 用定時器T 監視主程序 主程序監視定時器T 採用這種環形結構的軟體 看門狗 具有良好的抗干擾性能 大大提高了系統可靠性 對於需經常使用T 定時器進行串口通訊的測控系統 則定時器T 不能進行中斷 可改由串口中斷進行監控(如果用的是MCS 系列單片機 也可用T 代替T 進行監視) 這種軟體 看門狗 監視原理是 在主程序 T 中斷服務程序 T 中斷服務程序中各設一運行觀測變數 假設為MWatch T Watch T Watch 主程序每循環一次 MWatch加1 同樣T T 中斷服務程序執行一次 T Watch T Watch加1 在T 中斷服務程序中通過檢測T Watch的變化情況判定T 運行是否正常 在T 中斷服務程序中檢測MWatch的變化情況判定主程序是否正常運行 在主程序中通過檢測T Watch的變化情況判別T 是否正常工作 若檢測到某觀測變數變化不正常 比如應當加 而未加 則轉到出錯處理程序作排除故障處理 當然 對主程序最大循環周期 定時器T 和T 定時周期應予以全盤合理考慮 限於篇幅不贅述
系統故障處理 自恢復程序的設計
單片機系統因干擾復位或掉電後復位均屬非正常復位 應進行故障診斷並能自動恢復非正常復位前的狀態
非正常復位的識別
程序的執行總是從 H開始 導致程序從 H開始執行有四種可能 一 系統開機上電復位 二 軟體故障復位 三 看門狗超時未喂狗硬體復位 四 任務正在執行中掉電後來電復位 四種情況中除第一種情況外均屬非正常復位 需加以識別
硬體復位與軟體復位的識別
此處硬體復位指開機復位與看門狗復位 硬體復位對寄存器有影響 如復位後PC= H SP= H PSW= H等 而軟體復位則對SP SPW無影響 故對於微機測控系統 當程序正常運行時 將SP設置地址大於 H 或者將PSW的第 位用戶標志位在系統正常運行時設為 那麼系統復位時只需檢測PSW 標志位或SP值便可判此是否硬體復位 圖 是採用PSW 作上電標志位判別硬 軟體復位的程序流程圖
圖 硬 軟體復位識別流程圖
此外 由於硬體復位時片內RAM狀態是隨機的 而軟體復位片內RAM則可保持復位前狀態 因此可選取片內某一個或兩個單元作為上電標志 設 H用來做上電標志 上電標志字為 H 若系統復位後 H單元內容不等於 H 則認為是硬體復位 否則認為是軟體復位 轉向出錯處理 若用兩個單元作上電標志 則這種判別方法的可靠性更高
開機復位與看門狗故障復位的識別
開機復位與看門狗故障復位因同屬硬體復位 所以要想予以正確識別 一般要藉助非易失性RAM或者EEROM 當系統正常運行時 設置一可掉電保護的觀測單元 當系統正常運行時 在定時喂狗的中斷服務程序中使該觀測單元保持正常值(設為 AAH) 而在主程中將該單元清零 因觀測單元掉電可保護 則開機時通過檢測該單元是否為正常值可判斷是否看門狗復位
正常開機復位與非正常開機復位的識別
識別測控系統中因意外情況如系統掉電等情況引起的開機復位與正常開機復位 對於過程式控制制系統尤為重要 如某以時間為控制標準的測控系統 完成一次測控任務需 小時 在已執行測控 分鍾的情況下 系統電壓異常引起復位 此時若系統復位後又從頭開始進行測控則會造成不必要的時間消耗 因此可通過一監測單元對當前系統的運行狀態 系統時間予以監控 將控制過程分解為若干步或若干時間段 每執行完一步或每運行一個時間段則對監測單元置為關機允許值 不同的任務或任務的不同階段有不同的值 若系統正在進行測控任務或正在執某時間段 則將監測單元置為非正常關機值 那麼系統復位後可據此單元判系統原來的運行狀態 並跳到出錯處理程序中恢復系統原運行狀態
非正常復位後系統自恢復運行的程序設計
對順序要求嚴格的一些過程式控制制系統 系統非正常復位否 一般都要求從失控的那一個模塊或任務恢復運行 所以測控系統要作好重要數據單元 參數的備份 如系統運行狀態 系統的進程值 當前輸入 輸出的值 當前時鍾值 觀測單元值等 這些數據既要定時備份 同時若有修改也應立即予以備份
當在已判別出系統非正常復位的情況下 先要恢復一些必要的系統數據 如顯示模塊的初始化 片外擴展晶元的初始化等 其次再對測控系統的系統狀態 運行參數等予以恢復 包括顯示界面等的恢復 之後再把復位前的任務 參數 運行時間等恢復 再進入系統運行狀態
應當說明的是 真實地恢復系統的運行狀態需 要極為細致地對系統的重要數據予以備份 並加以數據可靠性檢查 以保證恢復的數據的可靠性
其次 對多任務 多進程測控系統 數據的恢復需考慮恢復的次序問題 筆者實際應用的數據恢復過程流程圖如圖 所示
圖 系統自恢復程序流程圖
圖中恢復系統基本數據是指取出備份的數據覆蓋當前的系統數據 系統基本初始化是指對晶元 顯示 輸入輸出方式等進行初始化 要注意輸入輸出的初始化不應造成誤動作 而復位前任務的初始化是指任務的執行狀態 運行時間等
結束語
lishixin/Article/program/qrs/201311/11074