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位被置位。