returnEEDR;}
电源治理及睡眠模式
睡眠模式能够使应用程序关闭MCU中没有利用的模块,从而降低功耗。
AVR具有不同的睡眠模式,许诺用户依照自己的应用要求实施剪裁。
进入眠眠模式的条件是置位寄放器MCUCR的SE,然后执行SLEEP指令。
具体哪一种模式(空闲模式、ADC噪声抑制模式、掉电模式、省电模式、Standby模式和扩展Standby模式)由MCUCR的SM二、SM1和SM0决定,如Table13所示。
使能的中断能够将进入眠眠模式的MCU唤醒。
通过启动时刻,外加4个时钟周期后,MCU就能够够运行中断例程了。
然后返回到SLEEP的下一条指令。
唤醒时可不能改变寄放器文件和SRAM的内容。
若是在睡眠进程中发生了复位,那么MCU唤醒后从中断向量开始执行。
P22Figure11介绍了ATmega16不同的时钟系统及其散布。
此图在选择适合的睡眠模式时超级有效。
MCU操纵寄放器-MCUCRMCU操纵寄放器包括了电源治理的操纵位。
•Bits7,5,4–SM2..0:
休眠模式选择位2、1和0
如Table13所示,这些位用于选择具体的休眠模式。
•Bit6–SE:
休眠使能
为了使MCU在执行SLEEP指令后进入休眠模式,SE必需置位。
为了确保进入休眠模
式是程序员的成心行为,建议仅在SLEEP指令的前一条指令置位SE。
MCU一旦唤醒立
即清除SE。
空闲模式当
SM2..0为000时,SLEEP指令将使MCU进入空闲模式。
在此模式下,CPU停止运行,而LCD操纵器、SPI、USART、模拟比较器、ADC、USI、按时器/计数器、看门狗和中断系统继续工作。
那个休眠模式只停止了clkCPU和clkFLASH,其他时钟那么继续工作。
象按时器溢出与USART传输完成等内外部中断都能够唤醒MCU。
若是不需要从模拟比较器中断唤醒MCU,为了减少功耗,能够切断比较器的电源。
方式是置位模拟比较器操纵和状态寄放器ACSR的ACD。
若是ADC使能,进入此模式后将自动启动一次转换。
ADC噪声抑制模式
当SM2..0为001时,SLEEP指令将使MCU进入噪声抑制模式。
在此模式下,CPU停止运行,而ADC、外部中断、两线接口地址配置、按时器/计数器0和看门狗继续工作。
那个睡眠模式只停止了clkI/O、clkCPU和clkFLASH,其他时钟那么继续工作。
此模式提高了ADC的噪声环境,使得转换精度更高。
ADC使能的时候,进入此模式将自动启动一次AD转换。
ADC转换终止中断、外部复位、看门狗复位、BOD复位、两线接口地址匹配中断、按时器/计数器2中断、SPM/EEPROM预备好中断、外部中断INT0或INT1,或外部中断INT2能够将MCU从ADC噪声抑制模式唤醒。
掉电模式
当SM2..0为010时,SLEEP指令将使MCU进入掉电模式。
在此模式下,外部晶体停振,而外部中断、两线接口地址匹配及看门狗(若是使能的话)继续工作。
只有外部复位、看门狗复位、BOD复位、两线接口地址匹配中断、外部电平中断INT0或INT1,或外部中断INT2能够使MCU离开掉电模式。
那个睡眠模式停止了所有的时钟,只有异步模块能够继续工作。
当利用外部电平中断方式将MCU从掉电模式唤醒时,必需维持外部电平必然的时刻。
具
体请参见P65“外部中断”。
从施加掉电唤醒条件到真正唤醒有一个延迟时刻,现在刻用于时钟从头启动并稳固下来。
唤醒周期与由熔丝位CKSEL概念的复位周期是一样的,如P23“时钟源”所示。
省电模式
当SM2..0为011时,SLEEP指令将使MCU进入省电模式。
这一模式与掉电模式只有
一点不同:
若是按时器/计数器2为异步驱动,即寄放器ASSR的AS2置位,那么按时器/计数器2在睡眠时继续运行。
除掉电模式的唤醒方式,按时器/计数器2的溢出中断和比较匹配中断也能够将MCU从休眠方式唤醒,只要TIMSK使能了这些中断,而且SREG的全局中
断使能位I置位。
若是异步按时器不是异步驱动的,建议利用掉电模式,而不是省电模式。
因为在省电模式下,假设AS2为0,那么MCU唤醒后异步按时器的寄放器数值是没有概念的。
那个睡眠模式停止了除clkASY之外所有的时钟,只有异步模块能够继续工作。
Standby模式
当SM2..0为110时,SLEEP指令将使MCU进入Standby模式。
这一模式与掉电模式唯一的不同的地方在于振荡器继续工作。
其唤醒时刻只需要6个时钟周期。
扩展Standby模式
当SM2..0为111时,SLEEP指令将使MCU进入扩展的Standby模式。
这一模式与省掉电模式唯一的不同的地方在于振荡器继续工作。
其唤醒时刻只需要6个时钟周期。
MCU操纵和状态寄放器-MCUCSR
MCU操纵和状态寄放器提供了有关引发MCU复位的复位源的信息。
•Bit4–JTRF:
JTAG复位标志
通过JTAG指令AVR_RESET能够使JTAG复位寄放器置位,并引发MCU复位,并使
JTRF置位。
上电复位将使其清零,也能够通过写”0”来清除。
•Bit3–WDRF:
看门狗复位标志
看门狗复位发生时置位。
上电复位将使其清零,也能够通过写”0”来清除。
•Bit2–BORF:
掉电检测复位标志
掉电检测复位发生时置位。
上电复位将使其清零,也能够通过写”0”来清除。
•Bit1–EXTRF:
外部复位标志
外部复位发生时置位。
上电复位将使其清零,也能够通过写”0”来清除。
•Bit0–PORF:
上电复位标志
上电复位发生时置位。
只能通过写”0”来清除。
为了利用这些复位标志来识别复位条件,用户应该及早读取此寄放器的数据,然后将其复位。
若是在其他复位发生之前将此寄放器复位,那么后续复位源能够通过检查复位标志来了
解。
看门狗按时器操纵寄放器-WDTCR
•Bits7..5–Res:
保留位
ATmega16保留位,读操作返回值为零。
•Bit4–WDTOE:
看门狗修改使能
清零WDE时必需置位WDTOE,不然不能禁止看门狗。
一旦置位,硬件将在紧接的4个时钟周期以后将其清零。
请参考有关WDE的说明来禁止看门狗。
•Bit3–WDE:
使能看门狗
WDE为"1“时,看门狗使能,不然看门狗将被禁止。
只有在WDTOE为"1“时WDE才能清零。
以下为关闭看门狗的步骤:
1.在同一个指令内对WDTOE和WDE写"1“,即便WDE已经为"1“
2.在紧接的4个时钟周期之内对WDE写"0”
•Bits2..0–WDP2,WDP1,WDP0:
看门狗按时器预分频器2,1和0
WDP二、WDP1和WDP0决定看门狗按时器的预分频器,如Table17所示.
下面的例子别离用汇编和C语言实现了关闭WDT的操作。
在此假定中断处于用户操纵之
下(比如禁止全局中断),因此在执行下面程序时中断可不能发生。
汇编代码例程
WDT_off:
;WDT复位
WDR;置位WDTOE和WDE
inr16,WDTCR
orir16,(1<outWDTCR,r16;关闭WDT
ldir16,(0<outWDTCR,r16
ret
C代码例程
voidWDT_off(void)
{/*WDT复位*/
_WDR();/*置位WDTOE和WDE*/
WDTCR|=(1<WDTCR=0x00;
}
通用中断操纵寄放器-GICR
•Bit1–IVSEL:
中断向量选择
当IVSEL为"0“时,中断向量位于Flash存储器的起始地址;当IVSEL为"1“时,中断向
量转移到Boot区的起始地址。
实际的Boot区起始地址由熔丝位BOOTSZ确信。
具体请参考P234“支持引导装入程序–在写的同时能够读(RWW,Read-While-Write)的自我编程能力”。
为了避免无心识地改变中断向量表,修改IVSEL时需要遵循如下进程:
1.置位中断向量修改使能位IVCE
2.在紧接的4个时钟周期里将需要的数据写入IVSEL,同时对IVCE写”0”
执行上述序列时中断自动被禁止。
其实,在置位IVCE时中断就被禁止了,并一直维持到写IVSEL操作以后的下一条语句。
若是没有IVSEL写操作,那么中断在置位IVCE以后的4个时钟周期维持禁止。
需要注意的是,尽管中断被自动禁止,但状态寄放器的位I的值并非受此操作的阻碍。
Note:
假设中断向量位于Boot区,且Boot锁定位BLB02被编程,那么执行应用区的程序时中断被禁止;假设中断向量位于应用区,且Boot锁定位BLB12被编程,那么执行Boot区的程序时中断被禁止。
有关Boot锁定位的细节请参见P234“支持引导装入程序–在写的同时能够读
(RWW,Read-While-Write)的自我编程能力”。
•Bit0–IVCE:
中断向量修改使能
改变IVSEL时IVCE必需置位。
在IVCE或IVSEL写操作以后4个时钟周期,IVCE被硬件清零。
如前面所述,置位IVCE将禁止中断。
代码如下:
汇编代码例程:
Move_interrupts:
;使能中断向量的修改
ldir16,(1<outGICR,r16;将中断向量转移到boot区
ldir16,(1<outGICR,r16
ret
C代码例程
voidMove_interrupts(void)
{/*使能中断向量的修改*/
GICR=(1<GICR=(1<}
ATmega16的引脚
每一个端口都有三个I/O存储器地址:
数据寄放器–PORTx、数据方向寄放器–DDRx和端
口输入引脚–PINx。
数据寄放器和数据方向寄放器为读/写寄放器,而端口输入引脚为只读寄放器。
可是需要专门注意的是,对PINx寄放器某一名写入逻辑"1“将造成数据寄放器相应位的数据发生"0“与““的交替转变。
当寄放器MCUCR的上拉禁止位PUD置位时所有端口引脚的上拉电阻都被禁止。
配置引脚
每一个端口引脚都具有三个寄放器位:
DDxn、PORTxn和PINxn,如P63“/O端口寄放器
的说明”所示。
DDxn位于DDRx寄放器,PORTxn位于PORTx寄放器,PINxn位于
PINx寄放器。
DDxn用来选择引脚的方向。
DDxn为"1“时,Pxn配置为输出,不然配置为输入。
引脚配置为输入时,假设PORTxn为"1“,上拉电阻将使能。
若是需要关闭那个上拉电阻,能够将PORTxn清零,或将那个引脚配置为输出。
复位时各引脚为高阻态,即便现在并无时钟在运行。
引脚配置为输出时,假设PORTxn为"1“,输出高电平
(1),不然低电平(0)。
在(高阻态)三态({DDxn,PORTxn}=0b00)输出高电平({DDxn,PORTxn}=0b11)两种状态之间进行切换时,上拉电阻使能({DDxn,PORTxn}=0b01)或输出低电平({DDxn,PORTxn}=0b10)这两种模式必然会有一个发生。
通常,上拉电阻使能是完全能够同意的,因为高阻环境不在意是强高电平输出仍是上拉输出。
若是利用情形不是如此子,能够通过置位SFIOR寄放器的PUD来禁止所有端口的上拉电阻。
在上拉输入和输出低电平之间切换也有一样的问题。
用户必需选择高阻态({DDxn,PORTxn}=0b00)或输出高电平({DDxn,PORTxn}=0b10)作为中间步骤。
Table20总结了引脚的操纵信号。
不论如何配置DDxn,都能够通过读取PINxn寄放器来取得引脚电平。
下面的例子演示了如何置位端口B的引脚0和1,清零引脚2和3,和将引脚4到7设置为输入,而且为引脚6和7设置上拉电阻。
然