中斷是PIC高手必須掌握的武器,轉貼一篇,還希望大家補充發表對中斷應用的見解。
與(yu) 51或者其他係列的單片機相比,PIC 單片機的中斷機製有其特殊之處,針對我們(men) 一些初學者存在的一些問題和疑惑,我在此做一個(ge) 個(ge) 人總結,不當的地方,請站友們(men) 指正。
先摘引三個(ge) 對PIC中斷理解的回帖,然後我再對中斷活動的過程、應該注意的事項、及一個(ge) 疑惑進行較詳細的總結和解釋。
---------------
john frank :關(guan) 於(yu) pic中斷有些不明白的地方
借用大蝦的程序;
;*******中斷服務代碼*************
btfss INTCON,T0IE ; 判斷是否為(wei) T0中斷
goto other_int
btfss INTCON,T0IF ; it ’s the time of T0 int
goto other_int
bcf INTCON,T0IF ; 是T0中斷,清除中斷標誌
movlw 0x10 ; 微秒的高位字節加上定時時間 256x16分頻=4096=0x1000的高位(0x10)
addwf us+1
goto end_int
other_int ; 可添加其他中斷服務代碼
nop ; other isr code can be added
;**********************************
end_int ; 恢複現場
=================
假如又有新的中斷正好在這段程序中間產(chan) 生
btfss INTCON,T0IF
goto other_int
bcf INTCON,T0IF
程序豈不是要出錯跑飛了
john frank:
謝謝你的關(guan) 注。
我講一下自己的理解,權做回答,不當之處,還請站友們(men) 指點。
pic中檔單片機係列沒有“硬件中斷優(you) 先級別”(請允許我這樣說),含義(yi) 是指:當內(nei) 核正在處理當前的中斷服務A時,在這個(ge) 期間裏,其他任何中斷的產(chan) 生,隻能使其標誌位xxIF置1,不能剝奪當前中斷服務對CPU的占用權(反應在PC指針不能被新的中斷改變指向),必須等到當前中斷服務處理A完畢,然後,根據goto other_int語句的轉向,依次判斷。若新發生的中斷處理代碼在中斷服務A之後(前、後指代碼在ROM中地址順序,越大越後),則進行新發生的中斷處理;若恰好新發生的中斷服務代碼在剛被處理完畢的中斷服務A代碼之前,則將不予理會(hui) ,(即程序指針PC不會(hui) 在中斷處理代碼空間中又返回到0004H的入口),等到執行到retfie 後返回主程序,然後再次進入中斷入口0004H...
之所以說其無“硬件中斷優(you) 先級別”是與(yu) “軟件中斷優(you) 先級別”對應的,通過中斷服務代碼對中斷標誌和IE的檢測的先後,可設立優(you) 先級。
當然,準確地說,這是一種順序,而非級別,嗬嗬。
如果了解一下51的中斷係統,相信你能更好地理解PIC的中斷的級別:
將會(hui) 出現你說的情況,當優(you) 先級更高的中斷來臨(lin) 時,內(nei) 核將暫時停止當前中斷服務,保存當前中斷服務的現場,執行優(you) 先級更高的中斷服務,處理完成後,恢複現場,執行未處理完成的中斷服務....,最後,返回主程序。
小弟講得有點煩瑣,並不形象,可能還有紕漏和謬誤之處,請大家指正,相信john frank在仔細看書(shu) 之後,應該可以形成自己的正確看法。
zdtdl :小弟說兩(liang) 句~~
簡單地說,當係統響應一個(ge) 中斷時,GIE位將被自動清零以禁止其他的中斷,在執行中斷返回指令RETFIE後係統再自動置GIE位1開放中斷。隻要不在中斷程序中對GIE置1,就不會(hui) 產(chan) 生反複進入中斷的現象,靠查詢方式決(jue) 定響應誰。PIC也有中斷嵌套,可以形成多級嵌套,甚至自身嵌套,不過嵌套的級數絕對不能超過硬件堆棧的深度。
-------------------------
PIC中檔單片機的中斷總結正文
一、中斷活動的過程
對於(yu) PIC單片機來說,一次中斷的過程大致有下列階段:
為(wei) 了使得說明形象和直觀,本文采用一些詼諧的語句來比喻說明:
中斷請求---------比喻成申請買(mai) 經濟適用房的請求
中斷標誌-------一份申請書(shu)
本中斷使能xxIE-----本單位領導
PEIE-------------戶口辦公室主任
GIE--------------銀行的管理信貸的科長
- 中斷請求:房子太少,兒子要結婚了,得買房了,可資源和財力有限,不能賣商品房,隻好按特殊情況處理,寫一份申請書(中斷標誌位IF置1);
- 本單位領導xxIE看了之後,如果給你蓋了一個戳:(即該中斷使能位IE=1),那麽恭喜你,這份申請書可以提交到更高一級的部門;如果沒蓋(xxIE= 0),那麽對不起,先放我這裏吧,等我們研究研究好後再說。如果你不開心,要拿回申請書撕掉,嗬嗬,那麽IF=0;你的購房請求之夢破滅;
- xxIE領導將根據戶口,將這些請求書給分類,一類是外地遷來的戶口,提交給戶口辦公室PEIE主任審查,PEIE主任如果給你蓋了個戳(PEIE= 1),那麽,他將會把申請書提交給銀行的GIE科長批準,否則就是放在這裏再研究研究或者你要回來撕毀;一類是本地戶口,可直接提交給銀行的GIE科長批準,然後你將申請書帶到GIE科長的辦公室。
- GIE科長蓋了章之後(GIE=1),然後,你就可以拿著申請書去找房地產商要房子了(此時PC指針=0004H),因為GIE科長有很多事情要做,所以他每蓋了一次戳之後(注意是一次不是一個,因為也許有多個中斷同時發生,也就是說有其他地方的人來請GIE蓋戳),就在辦公室門外掛了個牌子:請勿打擾。他自己則休息去了,直到接到RETFIE的電話或者有人打他的手機。
- 房地產商準備給房子了,不過你最好得先把各項手續給填好,叫5w押金,另外協議阿,合同阿,都得自己搞定,這叫“保護現場”。
- 房地產商開始上班了,於是挨個查“申請書”是誰提交的,以便給你安排你預定的房子。這個叫“中斷查詢”。
- 查到是你的後,然後打電話讓你過來,帶你去看房子,把鑰匙給你。這個交“中斷處理”。
- 鑰匙交給你之後,房子你是到手了,不過這份申請書就失效了,房地產商將該申請書銷毀。這個叫“清除中斷標誌”。
- 好啦,現在你可以去房地產商自己去要回以前交的押金,身份證啊等等。這個叫“恢複現場”。
- 最後,房地產商辦完了,讓RETFIE小姐打個電話給GIE科長(執行RETFIE指令),GIE科長才起來,把“請勿打擾”的牌子取下,讓其他的帶著申請書的人進來。當然,如果你的事情還沒搞定,GIE科長的關係戶打了他的手機(你在辦事時-處理中斷時,若有GIE被置1),他也會開門取下“請勿打擾” 的牌子,讓關係戶進來,給他蓋好章。這下就對不起了,人家有關係,所以你的事情要馬上停下來,先等關係戶辦完他的事情之後,再給你辦你的事情。這個叫“中斷嵌套”,要注意GIE科長有8個關係戶(硬件堆棧的深度為8級)哦。
二、需要注意的問題:
1. 中斷現場的保護(可以參考以前的帖子,在xieyubing版主的指點下,有恰當的例子);
2. 初次上電複位、電源跌落複位和其他情況下的複位,均使得全局中斷位GIE和其他中斷使能位xxIE=0;
3. 中斷標誌位的狀態與(yu) 該中斷源是否被屏蔽無關(guan) ,與(yu) 全局中斷使能位GIE也無關(guan) 。
4. 當開放某一中斷源時,該中斷源就是通過中斷標誌向CPU申請中斷的,無論什麽(me) 原因,隻要標誌位IF置1(可以用軟件強行置1),均會(hui) 產(chan) 生中斷請求。
5. 當中斷標誌位為(wei) 1,如果該中斷被屏蔽或者被禁止了,隻要不清除標誌位,那麽(me) 該中斷請求會(hui) 被潛伏下來,一旦屏蔽解除,立即產(chan) 生中斷響應。反之,如果在屏蔽/禁止條件解除之前清除了該標誌位,那麽(me) 則無中斷請求。
6. 當CPU響應任一中斷時,全局中斷使能位GIE會(hui) 自動清零;當中斷返回時,它有自動置1。如果在中斷處理期間,用軟件將已經清零的GIE位又重新置位,這個(ge) 時候若再出現中斷請求,就可以形成了中斷嵌套。即:在處理某一中斷期間又響應了其他中斷請求,就形成了中斷嵌套,此時,前一中斷處理過程會(hui) 被暫停而進入新的中斷處理,當新中斷處理完畢後,才會(hui) 繼續處理前一個(ge) 被擱置的中斷。此方式可以形成多級嵌套,但不能超過硬件堆棧的深度8級,以免造成堆棧溢出而不能正常返回。
7. 如果同時發生多個(ge) 中斷請求,則中斷處理的順序取決(jue) 於(yu) 中斷程序中的檢查中斷源的順序。
8. 若要防止中斷請求被丟(diu) 失:則要注意下麵兩(liang) 種情況:如果同一中斷源的中斷發生間隔時間大於(yu) 該中斷服務的處理時間,則可能出現中斷事件被忽略(體(ti) 現在中斷服務的過程中,標誌位被連續發生來兩(liang) 次置位),例如:中斷事件發生的時間間隔為(wei) 30ms,中斷服務處理加上跳轉判斷的時間為(wei) 50ms,則情況將會(hui) 如下所示:
[中斷次數----------1][中斷次數----------2][中斷次數----------3][中斷次數----------4]
[處理次數------------------------1][處理次數------------------------2][處理次數------------------------4]
如果在中斷處理一開始就清除IF,那麽(me) 如上圖所示,中斷事件3、4 在處理次數2的過程中發生來兩(liang) 次,那麽(me) 即使IF清除發生在中斷次數3發生之前,也將丟(diu) 失第三次中斷。
另外,即使中斷出現的時間間隔大於(yu) 中斷服務的時間間隔,如果清除中斷標誌位的指令安排在中斷服務子程序的尾部,就有可能造成丟(diu) 失該中斷請求(即兩(liang) 次中斷標誌置位的事件隻對應一條清除指令和一次中斷處理。
9. 在進行查表操作時必須禁止CPU響應中斷,以避免中斷返回時跳轉到不希望的地址上去。
三、一個(ge) 疑惑
一個(ge) 疑問:一些書(shu) 上提到:如果對寄存器INTCON進行“讀-改-寫(xie) ”操作的時候,要事先將GIE清0,再對INTCON進行操作,然後將GIE恢複為(wei) 1
即BCF INTCON,GIE
BSF INTCON,XX
BSF INTCON,GIE
所提到的理由是:當CPU正在執行一條對INTCON寄存器進行“讀-改-寫(xie) ”操作的指令時,如果恰好發生了中斷請求,則中斷服務程序會(hui) 被執行兩(liang) 次。這是因為(wei) 當中斷請求發生後INTCON寄存器的GIE寄存器會(hui) 被硬件自動清零(屏蔽所有中斷),並且程序轉入中斷例程入口(0004h)。當GIE被清零後,這時如果CPU正在執行一條對INTCON“讀-改-寫(xie) ”的指令時,則GIE位還會(hui) 被寫(xie) 會(hui) 操作重新置1,這樣就會(hui) 造成CPU兩(liang) 次進入中斷服務程序。
該段解釋晦澀難懂,根據中斷發生過程的時序(PICmicro中檔單片機係列參考手冊(ce) 的第8-2頁):在第n個(ge) 指令周期裏,CPU檢測到IF標誌位為(wei) 1,則在n+1個(ge) 周期內(nei) 將自動使得GIE=0,該周期內(nei) 既不取指也不執行指令,然後在n+2個(ge) 指令周期裏,0004h指針裝入PC指針,該周期也不運行其他指令,隻完成0004H->(PC)的取指過程,第n+3個(ge) 指令周期裏,CPU執行0004h地址的指令碼,並同時取0005h的指令碼。
顯然,作者提到的“當GIE被清零後,這時如果CPU正在執行一條對INTCON“讀-改-寫(xie) ”的指令時,則GIE位還會(hui) 被寫(xie) 會(hui) 操作重新置1,這樣就會(hui) 造成CPU兩(liang) 次進入中斷服務程序。”的解釋存在下麵的問題:GIE被硬件自動清零時的那個(ge) 周期,是一個(ge) 空運行周期,CPU並不執行指令,下一個(ge) 周期也是空運行周期,不過是完成將0004h地址中的代碼取指操作。然後就開始了0004h地址的代碼的執行操作和0005h地址代碼的取指過程。那麽(me) GIE 在被硬件自動清零後要想置會(hui) 1,隻有兩(liang) 種方法:RETFIE指令使GIE自動置1;通過軟件指令對GIE人為(wei) 置1。顯然,如果對GIE人為(wei) 置1的指令執行在對該標誌位清零前,那麽(me) 會(hui) 出現前文所述的中斷嵌套(設該中斷為(wei) A),如果沒有其他中斷發生且執行順序先於(yu) 中斷A且對中斷A的標誌清零的話,那麽(me) 中斷A的嵌套是一個(ge) 死循環。就不是執行兩(liang) 次的問題了----因為(wei) 同一個(ge) 中斷嵌套時,GIE在自動清零被軟件置一永遠都發生在清除IF之前,那麽(me) IF一直得不到清除,而GIE又幾乎一直都是1。
作者所說的情況似乎是這樣的:讀改寫(xie) INTCON指令按如下過程分解:讀INTCON的時候,GIE先是為(wei) 1的,此時發生了中斷,GIE被硬件清零,開始執行中斷服務程序,然後再IF標誌沒有清除之前,執行INTCON的其他位的修改和寫(xie) 回操作,也將中斷發生前的GIE讀為(wei) 1的信息寫(xie) 回GIE,這樣,CPU被迫發生了第二次中斷。顯然,這樣是將BSF INTCON, XX指令分解得支離破碎---本來一個(ge) 指令周期可以完成的指令被跨了多個(ge) 指令周期;而且一個(ge) 指令周期的指令被CPU在不同地址處分解執行讀改寫(xie) 過程。
如果不是這樣的話,那麽(me) 作者的解釋就自相矛盾:“當CPU正在執行一條對INTCON寄存器的‘讀-改-寫(xie) ’操作的指令時,如果恰好發生了中斷請求 ”與(yu) “當GIE被清零後,這是如果CPU正在執行一條對INTCON‘讀-改-寫(xie) ’的指令時”相互矛盾