請教微控制器中斷的問題,請教一個微控制器中斷的問題

2023-02-04 02:35:32 字數 3718 閱讀 9135

1樓:匿名使用者

需要具體情況具體分析,因為不同的微控制器在中斷機制上有細微的差別,需要查他的資料。

一般來說,一箇中斷源請求中斷,對cpu來說,是一次性的做了一個「中斷**」。假如當時因條件不滿足(例如cpu正在「關中斷」,即沒有開啟「中斷允許」),而沒有響應中斷,則**資訊還在,這樣,將來一旦開啟了中斷允許,仍然會響應,只是晚了一點而已。

而中斷響應以後,必須有辦法把這個「中斷**」消除掉。有的cpu的功能是:只要響應了這個中斷,**就自動消除了。

也有的cpu不能自動清除**,必須在中斷服務程式中編入「清除中斷**」的操作,否則,一旦開啟了中斷允許,它又會重**生中斷。

現在的大多數微控制器裡,中斷控制器和cpu是在同一個晶片中,它可以做到自動消除中斷**。而過去許多種cpu,所配用的中斷控制器是另外一個晶片,自然就無法自動消除了。

也有的cpu中有另外一種「不**」的中斷請求。它必須由外界(發出中斷請求的那個裝置)來保持一直不停申請,等到響應中斷的時候,再設法(例如,在中斷服務程式中發出一個輸出訊號)通知那個裝置撤銷申請。

大多數的cpu中,一旦響應中斷進入了服務程式,就把「中斷允許」關掉了。故此時如果又有下一個中斷請求來了,不能立即響應,只能掛一個號,等以後「開中斷」時才能再響應。如果程式設計師希望能夠「巢狀中斷」(即在一次中斷服務程式的執行中途又進入了另一箇中斷服務程式),就需要在服務程式內編入「開中斷」的操作。

「巢狀中斷」原則上允許「自己巢狀自己」,也就是說,一次中斷服務程式的執行中途又被打斷並進入了和自己一樣的中斷服務程式,並從頭到尾執行一遍,結束後返回到先前打斷的那一點,並繼續執行後半截服務程式。這種情況會產生什麼效果,是需要程式設計師自己考慮的。

也有的cpu具有「優先次序」機制,可以在某一級的中斷服務程式裡禁止優先順序不比自己高的其他中斷來打斷自己。同時,也提供給程式設計師有「放棄優先權」以及「修改優先順序」的靈活性。

而被優先機制暫時「遮蔽」的那些較低優先順序的中斷申請,同樣**仍在,以後高優先順序的中斷結束以後,還能響應。

不過需要注意,大多數的cpu中,「中斷**」是隻能掛一個的。也就是說,在前一次的中斷申請所掛的號還沒有被清除以前,又來了下一個中斷申請,那麼,第二個**是掛不上的。

不過某些處理器中,中斷**可能分成幾個層次:cpu裡面是一層,外圍針對各個具體的裝置,還有另外一級「預備**」,那就比較複雜了。

【針對您的「問題補充」再說兩句】

上面已經說,程式設計師可以自己決定你的中斷服務程式允許還是不允許「巢狀」。

如果不允許,您可以採用關中斷的辦法,或者利用優先機制,來遮蔽同一中斷源的第二個中斷請求。

這樣,第二個中斷就不會被響應。但它仍可以掛上一個號(只要它發生在上一個中斷**已經被清除掉以後的時間)。然後,中斷服務程式結束時,一般都會開中斷並釋放優先順序遮蔽。

然後,第二個中斷請求就會被響應,於是再一次執行中斷服務程式。

如果允許「巢狀」,那就會如我上面所說:

一次中斷服務程式的執行中途又被打斷並進入了和自己一樣的中斷服務程式,並從頭到尾執行一遍,結束後返回到先前打斷的那一點,並繼續執行後半截服務程式。

2樓:匿名使用者

1. 如果是高優先順序的中斷來了,會打斷低優先順序的正在執行的中斷而執行高優先順序的中斷。

51微控制器的中斷可巢狀,但至多支援二級巢狀。

51微控制器的預設(此時的ip暫存器不做設定)中斷優先順序為:

外部中斷0 > 定時/計數器0 > 外部中斷1 > 定時/計數器1 > 序列中斷;

但這種優先順序只是邏輯上的優先順序,當同時有幾種中斷到達時,高優先順序中斷會先得到服務。這種優先順序實際上是中斷同時到達的情況下,誰先得到服務的優先順序,而不是可提供中斷巢狀能力的優先順序。這種優先順序被稱為邏輯優先順序。

例如:當計數器0中斷和外部中斷1(優先順序 計數器0中斷》外部中斷1)同時到達時,會進入計時器0的中斷服務函式;但是在外部中斷1的中斷服務函式正在服務的情況下,這時候任何中斷都是打斷不了它的,包括邏輯優先順序比它高的外部中斷0計數器0中斷。

2.51微控制器的中斷優先順序控制暫存器ip可以把預設的中斷優先順序設定為高或低階,

例如預設是外部中斷0 > 定時/計數器0 > 外部中斷1 > 定時/計數器1 > 序列中斷;

現在設為定時1 和序列中斷為高優先順序 其它為低 ,那麼中斷0執行時會被定時器1 或序列中斷打斷,如果設定的兩個高優先順序定時/計數器1 和序列中斷同時響應,會再自然排隊,先執行定時1中斷再執行序列中斷。

3樓:做而論道

正在中斷期間,不會理會 同級別 和 低階別 的中斷申請。

如果有高階的申請,就會出現「巢狀」。

4樓:匿名使用者

所以中斷程式寫的越短越好,儘量寫到主程式去。

請教大家個問題,就是51微控制器如果用外中斷時,當外部給一箇中斷訊號時,微控制器就會去執行中斷程式,如 10

5樓:做而論道

只有高階中斷源,才能中斷 當前正在執行的中斷程式。

當中斷程式結束,返回主程式後,如果,剛才出現的中斷申請標誌還存在,

那麼,會再次進入中斷程式。

6樓:我愛小

有一個東西叫做中斷優先順序,第一個任務叫做a,第二個任務叫做b。因為都是外部中斷,優先順序可能都一樣。下面是借用別人的話

所以,是a先執行完,再響應b的中斷。

請教一個微控制器外部中斷問題。

7樓:

不管是電壓還是邊緣觸發中斷,其功能只是觸發。剩下的就不是它的事了。

就如同開槍扣扳機。扣下扳機你就管不了子彈了。只能讓子彈飛。

觸發以後,進入中斷程式,執行完了中斷程式,就回主程式。

請教一個51微控制器問題

8樓:做而論道

嗯,這確實是個問題。

9樓:迷失的天平

額。。。確實是什麼問題啊。。。

請教一個微控制器的問題

10樓:喬熠暉

可以是可以,不過沒必要,你現在能寫一個電子鐘就可以了,以後你就發現時間用定時器來產生的話,是一種浪費,你可以用ds12c887或者ds1302來產生時間,至於走的不準的問題可以這樣解決,比如你的th0=0x4c;tl0=0x00;(這好像是11.0592的50ms)那麼在中斷服務程式中就可以不對tl0賦值,只對th0賦值,而進入中斷的時間不會影響到th0。或者也可以對tl進行修正。

11樓:偵探

定時器初值給小一點,會變慢的,用4節充電電池串聯給vcc跟gnd供電就可以了。

12樓:

可以在外部加一時鐘晶片之類的東西,微控制器讀取其時間。時鐘晶片可以加一電池,掉電後轉換為電池供電可以執行。

13樓:郭立村

直接用微控制器肯定不行,每次上電程式總是從頭開始,加電池可行,但更直接的方法是用ds1302或ds12c887(時鐘晶片)

14樓:傾風慕雨

根據你的說明,用專用時鐘晶片較好,建議用ds1302,再配備一個鈕釦電池即可,**低廉。

15樓:匿名使用者

數碼管用zlg7290可以驅動8位的,和64個按鍵,時鐘晶片用ds1302,ds1302備用電池選用2052電池即可。具體用法,看ds1302/zlg7290中文手冊即可

16樓:匿名使用者

當然可以,微控制器耗電比較少,電池完全可以為其供電的,不過電壓要一樣的。

請教一個51微控制器的問題

51微控制器的問題 是片選訊號,低電平有效,當為低電平時,8155才能工作時,51微控制器對ram進行操作,時,51微控制器對i o介面操作。不使用地址線為0,都為0 命令 狀態字埠為4000h a口 4001h b口 4002h 命令 狀態字埠為4000h 對於8155來說,技術手冊可查到。低三位地...

微控制器c語言程式設計的程式問題,一個微控制器c語言程式設計的程式問題!

define keyr p0 define keyc p0 這兩項後面去掉加分號!else p0 0x2f else p0 0x37 這些else多餘,一個if對應一個else define keyr p0 define keyc p0 char key 7 6 應該是全域性變數,應寫在主函式之前!...

微控制器定時器計算問題,一個微控制器 定時器 計算 問題

12m的晶振每秒可產生1m個機器週期,50ms就需要50000個機器週期,定時器在方 式1工作,是版16位計數器,最大值權為65536,所以需設定初值15536,即3cb0h,所以th0 0x3c,tl0 0xb0。11.0592m的晶振每秒可產生0.9216m個機器週期,50ms就需要46080個...