中斷源和中斷向量:
缺省情況下,AVR的程序存儲區的最低端,即從Flash地址的0x0000開始用于放置中斷向量,稱做中斷向量區。中斷向量區大小 = 中斷源個數 * 每個中斷向量占據字數。對于Flash比較小的AVR處理器,每個中斷向量占據一個字的空間,用于放置一條相對轉移指令 rjmp(跳轉范圍-2K~+2K),而Flash較大的AVR,每個中斷向量占據兩個字空間,用于放置一條絕對轉移指令 jmp,用于跳轉到相應中斷的中斷服務程序的起始地址。
在這21個中斷中,包含1個非屏蔽中斷(RESET)3個外部中斷(INT0、INT1、INT2)和17個內部中斷。
RESET $000 | INT0 $002 | INT1 $004 | INT2 $024 |
INT0、INT1和INT2是3個外部中斷源,它們是分別由芯片外部引腳PD2、PD3、PB2上的電平變化或狀態觸發的。通過對控制寄存器MCUCR和控制與狀態寄存器MCUCSR的配置,外部中斷可以定義為由PD2、PD3、PB2引腳上的電平的下降沿、上升沿、邏輯電平變化,或者低電平觸發(INT2僅支持電平變化的邊沿觸發),這為外部硬件電路和設備向AVR申請中斷服務提供了很大的方便。
**關于計數器的中斷寄存器:TIMER2 COMP、TIMER2 OVF、TIMER1 CAPT、TIMER1 COMPA、TIMER1 COMPB、TIMER1 OVF、TIMER0 OVF、TIMER0 COMP這8個中斷是來自于ATmega16內部的3個定時計數器觸發的內部中斷。定時器處在不同的工作模式下時,這些中斷的發生條件和具體意義是不同的。
ATmega16的中斷控制:
1)、中斷優先級的確定
AVR單片機中,一個中斷在中斷向量區中的位置決定了它的優先級,位于低地址的中斷優先級高于位于高地址的中斷。所以 RESET 具有最高優先級。
AVR單片機采用固定的硬件優先級方式,不支持通過軟件對中斷優先級的重新設定。當有多個中斷源向MCU申請中斷的情況中,MCU根據中斷優先級的不同,把低優先級的中斷掛起,首先響應中斷優先級最高的那個中斷。待優先級最高的中斷服務程序執行完成返回后,再順序響應低優先級的中斷。
2)、中斷標志
AVR有兩種機制不同的中斷:帶有中斷標志的中斷(可掛起)和不帶中斷標志的中斷(不能掛起)。在 AVR 中,大多數的中斷都屬于帶中斷標志的中斷。所謂的中斷標志,是每個中斷源在其 I/O 空間寄存器中具有自己的一個中斷標志位。AVR 的硬件系統在每個時鐘周期內都會檢測(接受)外部(內部)中斷源的中斷條件。一旦中斷條件滿足,AVR 的硬件就會將置位相應的中斷標志位(置為“1”),表示向 MCU 提起中斷請求。
3)、中斷屏蔽與管理
AVR 對中斷采用兩級控制方式。兩級控制是指 AVR 有一個中斷允許的總控制位 I(既 AVR 標志寄存器 SREG 中的 I 標志位“SREG.7”),通常稱為全局中斷允許控制位。同時 AVR 為每一個中斷源都設置了獨立的中斷允許位,這些中斷允許位分散位于各中斷源所屬模塊的控制寄存器中。
▋AVR響應一個可屏蔽中斷源(假定為A中斷)的中斷的條件是: 響應A中斷 = 全局中斷允許標志 AND 中斷A允許標志位 AND 中斷A標志 當某個中斷條件成立后,硬件會自動將該中斷的標志位置"1",表示中斷產生,同時也作為申請中斷服務的請求信號。如果該中斷的允許位為"1",同時AVR的全局中斷允許位 I 也是"1"時,那么MCU在執行完當前一條指令之后就會響應該中斷。 ▋AVR復位后,各個中斷允許位以及全局中斷允許位均被清零,這保證了程序在開始執行時(一般程序開頭是對芯片內部以及外圍系統的初始化設置)不會受到中斷的干擾。 ▋AVR復位后的用戶初始化程序中,需要先對需要使用的中斷源進行必要的配置,待系統初始化過程結束后在置位 I ,使系統進入正常的工作狀態,開始響應中斷請求。 |
4)、中斷嵌套
AVR在響應一個中斷的過程中通過硬件將 I 標志位自動清零,這樣就阻止了MCU響應其它中斷。通常情況下,AVR是不能自動實現中斷嵌套的。如果系統中必須要實現中斷嵌套的應用,用戶可以在中斷服務程序中使用指令將全局中斷允許位開放,通過間接的方式實現中斷的嵌套處理。
濫用中斷嵌套會造成程序流程的不確定性。因此建議只有當某中斷確實需要得到實時響應時才考慮使用中斷嵌套處理,一般情況下盡量不要采用中斷嵌套,因為 AVR 本身是高速單片機,它運行速度是能足夠快速的將中斷服務程序執行完的。當然,用戶編寫中斷服務程序時,應遵循盡量短小的原則。
AVR的中斷響應過程:
1)、中斷響應的過程
AVR在響應中斷請求時,MCU會使用4個時鐘周期自動順序的完成以下任務:
? 清零狀態寄存器SREG中的全局中斷允許標志位 I ,禁止響應其他中斷。
? 將被響應中斷的標志位清零(這個只是部分中斷有此操作)。
? 將中斷斷點的地址(即當前程序計數器PC的值)壓入堆棧,并將SP寄存器中的堆棧指針減二。
? 自動將相應的中斷向量地址壓入程序計數器PC,即強行轉入執行中斷入口地址處的指令。
中斷響應過程全部由硬件自己實現,不需要用戶干預。
2)、中斷返回的過程
AVR一旦執行中斷返回RETI指令,MCU便開始了中斷返回的過程。AVR在中斷返回過程中,使用4個時鐘周期自動按順序完成以下任務:
? 從棧頂彈出2個字節的數據,將這兩個數據壓入程序計數器PC中,并將SP寄存器中的堆棧指針加2。
? 置位狀態寄存器SREG中的全局中斷允許標志位I,允許響應其他中斷。
中斷返回后,會檢測中斷標志,如果存在其他被掛起的中斷,則AVR在中斷返回后還需執行一條指令,被掛起的中斷才會得到響應。
3)、中斷現場的保護
AVR的中斷響應和返回過程主要都是由硬件自動完成的,而在整個過程中用戶程序的作用在于:
? 中斷入口處的指令。用于指引MCU轉移到中斷服務程序。
? 中斷服務程序。完成中斷服務的功能。
? 中斷返回指令。指引MCU從中斷服務程序中返回。
為了提高中斷響應的實時性,AVR在中斷響應和返回過程中,硬件上的處理僅僅保護和恢復了中斷的斷點(PC值)。而對中斷現場沒有采取任何處理。 因此,中斷現場的保護工作需要用戶在自己編寫的中斷服務程序中通過軟件完成,以保證主程序在被打斷時所使用的標志位和臨時寄存器等不會被中斷服務程序改變,例如,對狀態寄存器SREG的保護等! |
中斷服務程序編寫:(三個框架)中斷向量區部分、主程序部分和中斷服務程序部分。
1)、中斷向量區部分
缺省情況下,AVR的中斷向量區在Flash程序存儲器的最低端。最開始的0x0000是不可屏蔽的復位上電的中斷向量,此處有一條轉移到主程序開始處的跳轉指令。
2)、主程序部分
單片機主程序的開始階段通常要對整個系統已經芯片本身進行初始化設置,然后才能進入正常的工作流程中。分為:堆棧指針的初始化、中斷源設置、開放全局中斷、各中斷源相應的中斷允許設置。
開放中斷源本身的中斷允許位之前,最好先使用指令將該中斷的中斷標志位清除,然后馬上將中斷允許位置“1”。 在開放中斷前清楚可能存在的中斷標志,保證了中斷開放后不會形成一次“多余”的中斷,這個“多余”的中斷有時會造成致命的錯誤。因為在對中斷源進行設置過程中,或中斷源對應的硬件模塊在工作中都有可能改變中斷標志位。 |
3)、中斷服務程序
由于在中斷向量處通常放置一條轉移指令,用于再次跳轉到中斷服務程序的開始處,所以中斷服務程序可以放置在FLASH空間的任何地方。
中斷服務程序中要考慮被中斷現場的保護和恢復問題。中斷的產生和響應是隨機的,而且在中斷服務程序中經常要使用一些寄存器,或對RAM中的變量進行操作,也會有判斷和跳轉的操作,這些指令可能會改變SREG中的標志位,所以必須確保當從中斷服務程序返回時,被中斷服務程序改變的現場全部正確的恢復,這樣當中斷返回后,主程序才能正確繼續運行下去。 |
除了一些必須在中斷中完成的工作外,對于那些不需要馬上處理的工作,如鍵盤處理、掃描顯示等應該放在主程序中完成,也就是說,中斷服務程序應盡可能的短。中斷服務程序短,不是程序指令少,而是執行一次中斷服務程序所需要的時間短。盡量減少中斷服務程序的執行時間有以下優點:
▋可以不必采用中斷嵌套技術。AVR的硬件不支持自動的中斷嵌套處理,因此中斷執行時間短的話能夠盡快的響應其他被掛起的中斷,提供系統總體的實時響應速度。
▋能夠防止丟失周期性中斷或其它短時中斷。列如,當系統有一個1ms產生一次的周期型中斷源,你的中斷服務程序就必須在1ms完成,否則將會造成下一個中斷的“丟失”。
有很多情況下,中斷僅僅表示外圍設備或內部功能部件的工作過程已經達到某種狀態,但不需要馬上去處理,或者允許在一個比較充裕的限定時間內處理,這就可以將它們的處理工作放到主程序中完成。在這種情況下,最好的方式就是定義和使用信號量或標志變量,在中斷服務程序中只是簡單的對這些信號量或標志量進行必要的設置,不做其他處理就馬上返回主程序,由主程序中根據這些信號量或表質量的值進行和完成處理工作。 這樣做的另一個好處是,可以大大減少中斷服務程序中的對中斷現場保護和恢復的工作,從而又減少了中斷程序的執行時間,同時也節省了堆棧空間和FLASH空間(代碼少了)。 |
上一篇:codeblocks+winavr開發avr單片機(atmega16)
下一篇:使用AVR單片機驅動舵機
推薦閱讀
史海拾趣
在環保意識日益增強的今天,Caliber公司積極響應國家號召,推動綠色環保生產。公司投入大量資金引進環保設備和技術,減少生產過程中的污染排放。同時,Caliber還研發了一系列節能型電子產品,為用戶提供更加環保的選擇。這些舉措不僅提升了公司的社會形象,也為公司的可持續發展注入了新的動力。
Harris公司最初成立于1890年代,起初以無線電通信技術為核心業務。在早期,公司憑借其創新的無線電通信技術,在通信領域迅速嶄露頭角。這一時期,Harris不僅為軍事領域提供了關鍵的通信解決方案,還逐步拓展到商業和民用市場,為當時的電話、電報等通信方式帶來了革命性的變化。通過不斷的技術研發和產品創新,Harris逐漸奠定了其在電子行業的重要地位。
面對日益嚴峻的環境問題,宜源科技公司積極響應國家環保政策,致力于綠色環保和可持續發展。公司采用先進的生產工藝和設備,減少生產過程中的污染排放。同時,宜源科技還積極推動綠色產品的研發和推廣,為客戶提供更加環保、節能的電子產品解決方案。這些努力不僅有助于保護環境,也為公司的可持續發展奠定了基礎。
倍(DBIC)公司始終關注社會責任和可持續發展。公司積極參與環保活動,推動綠色生產。同時,倍(DBIC)公司還關注員工福利和社區發展,通過慈善捐贈和公益活動回饋社會。這些舉措不僅提升了倍(DBIC)公司的社會形象,也為公司的長期發展奠定了堅實基礎。
2008年,Amphenol公司看中了Nexus, Inc.在連接器領域的潛力,決定對其進行收購。收購完成后,Amphenol成立了提供全球銷售支持的Amphenol Nexus Technologies,同時仍保持了對客戶支持和開發的堅定承諾。這一舉措使Amphenol Nexus Technologies得以借助Amphenol的全球性的資源和網絡,進一步拓展其業務范圍和市場影響力。
在電子行業,產品質量是企業生存和發展的關鍵。Defense Supply Center Columbus公司始終將質量管理放在首位,建立起一套完善的質量管理體系。公司嚴格按照國際標準進行生產和檢測,確保每一件產品都符合質量要求。同時,公司還注重員工的培訓和教育,提高員工的質量意識和操作技能。這些措施的實施,使得公司的產品質量得到了顯著提升,贏得了客戶的廣泛贊譽。
我用的是周立功的EasyFPGA030,它只支持并口下載的,但是現在手上沒有并口的下載線,我的筆記本上也沒有,同學也沒有!!難道又要花幾十甚至幾百去買個并口下載線,望高手指點!!!!!!!!!… 查看全部問答∨ |
|
您好,我想在我的 /dev/mtd0 下掛載 jffs2 文件系統。 現在我的開發板的啟動信息如下: /*************************** 5-9 *****************************/ Auto detecting flash ...ok!!! Protected 2 sectors Flash: ...… 查看全部問答∨ |
|
linux-2.6.18內核移植及根文件系統的制做(簡易) 一、 去 http://www.kernel.org 下載內核,下面以 linux-2.6.18.tar.bz2 為例。 [root@Binnary ~ ]# tar –jxvf linux-2.6.18.tar.bz2 & ...… 查看全部問答∨ |
#include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit duan=P2^6; //申明U1鎖存器的鎖存端 sbit wei=P2^7; //申U2鎖存器 ...… 查看全部問答∨ |
問題是這樣的,在modelsim se中添加了altera的庫,可以看到了。但是在在quartus中調用modelsim se進行仿真時,仍然默認的是work這個庫,仍然會編譯一大堆的altera的東西,我自己添加的altera的庫沒有起到作用。 請問大俠們,該怎么設置可以在調用m ...… 查看全部問答∨ |
|
我在做msp430g2553的ADC10外部參考電壓時,想設置一個5V以上的外部參考電壓,可怎么也弄不出來!請各位大蝦指教指教! 下面是我的程序: #include <intrinsics.h> #include "1602-4.h" #include "1602-4.c" /******************** ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 搶先體驗:TI MSPM0L1306 LaunchPad開發套件,贏三模無線鍵盤
- 下載Intel《贏得大資料爆炸——大資料、智慧系統與物聯網的時代》白皮書
- 最后一周報名,STM32中國峰會暨粉絲狂歡節,5月12-13日深圳
- 有獎直播:當AI遇見仿真,會有什么樣的電子行業革新之路?
- 是德科技有獎直播:示波器在通用電子測量中的應用和技巧
- 是德科技直播 | 小探頭,大學問,別讓探頭拖累你的測試結果!
- 是德科技:五招教您最小化合格/不合格的誤判風險在線直播預報名、看直播、填問卷、好禮相送!
- 《模擬對話》50周年大合集(2013-2016)
- 下載贏禮 | 雅特生 PMBus 接口非隔離數字 DC-DC 轉換器