官术网_书友最值得收藏!

1.2.1 ATmega128單片機的內核

ATmega128單片機的內核由算術邏輯單元ALU、狀態寄存器SREG、通用寄存器、堆棧、RAM頁碼選擇寄存器RAMPZ、中斷和復位處理模塊等構成。

1. 算術邏輯單元ALU

算術邏輯單元(ALU)是ATmega128單片機內核中執行各種算術和邏輯運算操作的部件,其基本操作包括加、減、乘、除四則運算(算術運算),與、或、非、異或等邏輯操作(邏輯預算),以及移位、比較和傳送等操作。ALU與32個通用工作寄存器直接相連,ATmega128單片機的寄存器與寄存器之間、寄存器與立即數之間的ALU運算只需要一個時鐘周期。ALU的操作分為3類:算術、邏輯和位操作。此外,ALU還能支持有符號數和分數乘法。

2. 狀態寄存器SREG

ATmega128單片機的狀態寄存器包含了最近執行的算術指令的相關結果信息,用戶可以根據這些信息來實現條件操作,狀態寄存器內部結構如表1.1所示。

表1.1 ATmega1 28單片機狀態寄存器SREG的內部結構

注意

在進入中斷服務程序時,狀態寄存器不會自動保存;在中斷返回時,也不會自動恢復,這些工作需要中斷服務子程序的用戶代碼來處理。

●I:全局中斷使能位。當I被置位時,使能全局中斷,單獨的中斷使能由其他獨立的控制寄存器控制;如果I被清零,則不論單獨中斷標志置位與否,都不會產生中斷。任意一個中斷發生后,I將被清零。而執行RETI(中斷服務程序退出)指令后,I恢復置位,以使能中斷。I也可以通過SEI(置位全局中斷使能位)和CLI(清除全局中斷使能位)指令來置位和清零。

●T:位復制存儲位。位復制指令BLD和BST利用T作為目的地址或源地址,BST指令把寄存器的的某一位復制到T,而BLD把T復制到寄存器的某一位。

● H:半進位標志位。H被置位時,表示算術操作發生了半進位,此標志對于BCD運算非常有用。

● S:負數標志位,用于存放N與2的補碼和溢出標志V的異或結果。

● V:補碼溢出標志位,支持二進制補碼運算。

● N:負數標志位,表明算術或邏輯操作結果為負。

● Z:零標志位,表明算術或邏輯操作結果為零。

● C:進位標志位,表明算術或邏輯操作發生了進位。

3. 通用寄存器

ATmega128單片機有32個通用寄存器,其針對ATmega128單片機的指令集進行了優化,支持以下的輸入/輸出方案。

● 輸入為一個8位操作數,輸出一個8位結果。

● 輸入為兩個8位操作數,輸出一個8位結果。

● 輸入為兩個8位操作數,輸出一個16位結果。

● 輸入為一個16位操作數,輸出一個16位結果。

圖1.3所示為ATmega128單片機的通用寄存器結構示意圖。每個通用寄存器都有一個對應的地址,將它們直接映射到用戶數據空間的頭32個地址。X、Y、Z寄存器可以設置為指向任意寄存器的指針。

圖1.3 ATmega128單片機的通用寄存器結構示意圖

通用寄存器R26~R3 1除了用作通用寄存器外,還可以作為數據間接尋址用的地址指針X、Y、Z,如圖1.4所示。在不同的尋址模式中,這些地址寄存器可以實現固定偏移量、自動加1和自動減1功能。

圖1.4 X、Y、Z寄存器

4. 堆棧

ATmega128單片機的堆棧主要用來保存臨時數據、局部變量、子程序和中斷子程序的返回地址,堆棧指針總是指向堆棧的頂部。

注意

ATmega128單片機的堆棧是向下生長的,即當有新數據被推入堆棧時,堆棧指針的數值將減小。

ATmega128單片機的堆棧指針指向位于SRAM的函數或中斷堆棧,在調用子程序和使能中斷之前必須先初始化堆棧,并且堆棧指針必須指向高于0x60的地址空間。

● 當使用PUSH指令將數據推入堆棧時,堆棧指針減1。

● 當子程序或中斷返回地址被推入堆棧時,堆棧指針將減2。

● 使用POP指令將數據彈出堆棧時,堆棧指針加1。

● 使用RET或RETI指令從子程序或中斷返回時,堆棧指針加2。

ATmega128單片機的堆棧指針實質上是I/O空間中的兩個8位寄存器,如表1.2所示。

表1.2 ATmega1 28單片機的堆棧指針寄存器

5. 頁面選擇寄存器RAMPZ

ATmega128單片機支持不超過64KB的數據存儲器空間,頁面選擇寄存器RAMPZ用于選擇ATmega128單片機訪問的是哪一個數據存儲器空間,其內部結構如表1.3所示。

表1.3 ATmega1 28單片機的頁面選擇寄存器RAMPZ內部結構

● BIT7~BIT1:保留位。

● RAMPZ0:RAM頁面擴展選擇指針,當RAMPZ0 =0時,ELPM/SPM指令用于訪問ATmega128寄存器的低64KB地址空間0x0000~0x7FFF;當RAMPZ0 =1時,ELPM/SPM指令用于訪問ATmega128寄存器的高64KB地址空間0x7FFF~0xFFFF。

說明

LPM指令不受RAMPZ位設置的影響。

6. 中斷和復位處理模塊

ATmega128單片機的中斷事件都在程序空間對應獨立的中斷向量,所有的中斷模塊都有自己的使能位。當使能位被置位,并且狀態寄存器的全局中斷使能位I也被置位時,可以產生中斷事件。根據程序計數器PC的不同,在引導鎖定位BLB02或BLB12被編程的情況下,中斷可能被自動禁止,這個特性提高了軟件的安全性。

ATmega128單片機的程序存儲區的最低地址默認為復位向量和中斷向量,向量列表列出了不同中斷的優先級,向量所在的地址越低,優先級越高。RESET具有最高的優先級,第2個為INT0(外部中斷請求0)。通過置位通用中斷控制寄存器(GICR)的IVSEL,中斷向量可以移至引導Flash的起始處,編程熔絲位BOOTRST也可以將復位向量移至引導Flash的起始處。

在任一中斷發生時,全局中斷使能位I被清零,從而禁止了所有其他的中斷,用戶軟件可以在中斷程序里置位I來實現中斷嵌套。此時,所有的中斷都可以中斷當前的中斷服務程序,在執行RETI指令后,I自動置位。

ATmega128單片機有兩種類型的中斷。第1種由中斷事件觸發并置位中斷標志位。對于這些中斷,程序計數器跳轉到實際的中斷向量,以執行中斷處理程序,同時硬件將清除相應的中斷標志。中斷標志位也可以通過對其寫“1”的方式來清除。當中斷發生后,如果相應的中斷使能位為“0”,則中斷標志位置位,并一直保持到中斷執行,或者被軟件清除。類似的,如果全局中斷標志被清零,則所有已發生的中斷都不會被執行,直到I被置位。然后掛起的各個中斷按中斷優先級依次執行。

對于第2種類型的中斷,只要中斷條件滿足,就會一直觸發。這些中斷不需要中斷標志位,若中斷條件在中斷使能之前就消失了,中斷不會被觸發。

ATmega128單片機在退出中斷后,總是回到主程序后并至少執行一條指令,才可以去執行其他被掛起的中斷。

注意

進入中斷服務程序時,狀態寄存器不會自動保存,中斷返回時也不會自動恢復,這些工作必須由用戶通過軟件來完成;當使用CLI指令來禁止中斷時,中斷禁止立即生效,沒有中斷可以在執行CLI指令后發生,即使它是在執CLI指令的同時發生的。

【例1.1】 利用CLI指令來防止中斷發生,以避免在對E2 PROM進行寫操作時,對E2 PROM內容的破壞。

            char cSREG;
            cSREG=SREG;             //保存SREG內容
            CLI();                   //關閉中斷
            EECR | =(1 <<EEMWE);    //啟動E2 PROM寫操作
            EECR | =(1 <<EEWE);
            SREG=cSREG;             //恢復SREG內容,同時打開了內部中斷位

注意

當使用SEI指令使能中斷時,在執行任何中斷之前一定會先執行完SEI指令之后的那一條指令。

ATmega128單片機的中斷響應操作最少為4個時鐘周期。在4個時鐘周期后,程序跳轉到實際的中斷處理例程。在這4個時鐘期期間,PC將自動入棧。在通常情況下,中斷向量為一個跳轉指令,此跳轉需要3個時鐘周期。如果中斷在一個多時鐘周期指令執行期間發生,則在此多周期指令執行完畢后,ATmega128單片機才會執行中斷程序。若中斷發生時ATmega128單片機處于休眠模式,中斷響應時間還需增加4個時鐘周期。此外,還要考慮到不同的休眠模式所需要的啟動時間。

ATmega128單片機的中斷返回操作也需要4個時鐘周期,在此期間PC(兩個字節)將被彈出棧,堆棧指針加2,狀態寄存器SREG的I位被置位。

主站蜘蛛池模板: 团风县| 时尚| 大庆市| 卢氏县| 肥城市| 玉田县| 瓮安县| 兰西县| 益阳市| 布尔津县| 会理县| 苏尼特右旗| 玛曲县| 朝阳县| 海丰县| 于田县| SHOW| 靖西县| 合作市| 岢岚县| 牙克石市| 济阳县| 河池市| 永丰县| 高青县| 瓦房店市| 五常市| 苏尼特左旗| 黑龙江省| 古田县| 连城县| 习水县| 铜山县| 北票市| 会理县| 牡丹江市| 浪卡子县| 邵东县| 清水河县| 庐江县| 宁晋县|