AVRATmega16中文说明书.docx
- 文档编号:8495667
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:41
- 大小:794.63KB
AVRATmega16中文说明书.docx
《AVRATmega16中文说明书.docx》由会员分享,可在线阅读,更多相关《AVRATmega16中文说明书.docx(41页珍藏版)》请在冰豆网上搜索。
AVRATmega16中文说明书
ALU-算术逻辑单元AVRALU与32个通用工作寄放器(R0-R31)直接相连。
寄放器与寄放器之间、寄放器与当即数之间的ALU运算只需要一个时钟周期。
ALU操作分为3类:
算术、逻辑和位操作。
另外还提供了支持无/有符号数和分数乘法的乘法器。
具体请参见指令集。
状态寄放器状态寄放器包括了最近执行的算术指令的结果信息。
这些信息能够用来改变程序流程以实现条件操作。
如指令集所述,所有ALU运算都将阻碍状态寄放器的内容。
如此,在许多情形下就不需要专门的比较指令了,从而使系统运行更快速,代码效率更高。
在进入中断效劳程序时状态寄放器可不能自动保留,中断返回时也可不能自动恢复。
这些工作
需要软件来处置。
AVR中断寄放器SREG概念如下:
•Bit7–I:
全局中断使能
I置位时使能全局中断。
单独的中断使能由其他独立的操纵寄放器操纵。
若是I清零,那么不
论单独中断标志置位与否,都可不能产生中断。
任意一个中断发生后I清零,而执行RETI
指令后I恢复置位以使能中断。
I也能够通过SEI和CLI指令来置位和清零。
•Bit6–T:
位拷贝存储
位拷贝指令BLD和BST利用T作为目的或源地址。
BST把寄放器的某一名拷贝到T,而
BLD把T拷贝到寄放器的某一名。
•Bit5–H:
半进位标志
半进位标志H表示算术操作发生了半进位。
此标志关于BCD运算超级有效。
详见指令集
的说明。
•Bit4–S:
符号位,S=N⊕V
S为负数标志N与2的补码溢出标志V的异或。
详见指令集的说明。
•Bit3–V:
2的补码溢出标志
支持2的补码运算。
详见指令集的说明。
•Bit2–N:
负数标志
说明算术或逻辑操作结果为负。
详见指令集的说明。
•Bit1–Z:
零标志
说明算术或逻辑操作结果为零。
详见指令集的说明。
•Bit0–C:
进位标志
说明算术或逻辑操作发生了进位。
详见指令集的说明
利用CLI指令来禁止中断时,中断禁止当即生效。
没有中断能够在执行CLI指令后发生,即便它是在执行CLI指令的同时发生的。
下面的例子说明了如安在写EEPROM时利用那个指令来避免中断发生以幸免对EEPROM内容的可能破坏。
汇编代码例程
inr16,SREG;保留SREG
cli;禁止中断
sbiEECR,EEMWE;启动EEPROM写操作
sbiEECR,EEWE
outSREG,r16;恢复SREG(I位)
C代码例程
charcSREG;
cSREG=SREG;/*保留SREG*/
/*禁止中断*/
_CLI();
EECR|=(1< EECR|=(1< SREG=cSREG;/*恢复SREG(I位)*/ 利用SEI指令使能中断时,紧跟其后的第一条指令在执行任何中断之前必然会第一取得执行。 汇编代码例程 sei;置位全局中断使能标志 sleep;进入休眠模式,等待中断发生 ;注意: 在执行任何被挂起的中断之前MCU将第一进入休眠模式 C代码例程 _SEI();/*置位全局中断使能标志*/ _SLEEP();/*进入休眠模式,等待中断发生*/ /*注意: 在执行任何被挂起的中断之前MCU将第一进入休眠模式*/ X、Y、Z寄放器寄放器R26-R31除用作通用寄放器外,还能够作为数据间接寻址用的地址指针。 这三个间接寻址寄放器示于Figure5。 堆栈指针 堆栈指针要紧用来保留临时数据、局部变量和中断/子程序的返回地址。 堆栈指针老是指向堆栈的顶部。 要注意AVR的堆栈是向下生长的,即新数据推入堆栈时,堆栈指针的数值将减小。 若是在挪用或中断后读程序计数器,未用位(15: 13)应屏蔽。 堆栈指针指向数据SRAM堆栈区。 在此聚集了子程序堆栈和中断堆栈。 挪用子程序和使能中断之前必需概念堆栈空间,且堆栈指针必需指向高于0x60的地址空间。 利用PUSH 指令将数据推入堆栈时指针减一;而子程序或中断返回地址推入堆栈时指针将减二。 使 用POP指令将数据弹出堆栈时,堆栈指针加一;而用RET或RETI指令从子程序或中断 返回时堆栈指针加二。 AVR的堆栈指针由I/O空间中的两个8位寄放器实现。 实际利用的位数与具体器件有关。 请注意某些AVR器件的数据区过小,用SPL就足够了。 现在将不给出SPH寄放器。 EEPROM地址寄放器-EEARH和EEARL •Bits15..9–Res: 保留 保留位,读操作返回值为零。 •Bits8..0–EEAR8..0: EEPROM地址 EEPROM地址寄放器–EEARH和EEARL指定了512字节的EEPROM空间。 EEPROM地址是线性的,从0到511。 EEAR的初始值没有概念。 在访问EEPROM之前必需为其给予正确的数据。 EEPROM数据寄放器-EEDR •Bits7..0–: EEPROM数据 关于EEPROM写操作,EEDR是需要写到EEAR单元的数据;关于读操作,EEDR是从地址EEAR读取的数据。 EEPROM操纵寄放器-EECR •Bits7..4–Res: 保留 保留位,读操作返回值为零。 •Bit3–EERIE: 使能EEPROM预备好中断 假设SREG的I为"1",那么置位EERIE将使能EEPROM预备好中断。 清零EERIE那么禁止其中断。 当EEWE清零时EEPROM预备好中断即可发生。 •Bit2–EEMWE: EEPROM主机写使能 EEMWE决定了EEWE置位是不是能够启动EEPROM写操作。 当EEMWE为"1"时,在4个时钟周期内置位EEWE将把数据写入EEPROM的指定地址;假设EEMWE为"0“,那么操作EEWE不起作用。 EEMWE置位后4个周期,硬件对其清零。 见EEPROM写进程中对EEWE位的描述。 •Bit1–EEWE: EEPROM写使能 EEWE为EEPROM写操作的使能信号。 当EEPROM数据和地址设置好以后,需置位EEWE以便将数据写入EEPROM。 现在EEMWE必需置位,不然EEPROM写操作将可不能发生。 写时序如下(第3步和第4步的顺序并非重要): 1.等待EEWE位变成零 2.等待SPMCSR中的SPMEN位变成零 3.将新的EEPROM地址写入EEAR(可选) 4.将新的EEPROM数据写入EEDR(可选) 5.对EECR寄放器的EEMWE写"1",同时清零EEWE 6.在置位EEMWE的4个周期内,置位EEWE 在CPU写Flash存储器的时候不能对EEPROM进行编程。 在启动EEPROM写操作之前软件必需检查Flash写操作是不是已经完成。 步骤 (2)仅在软件包括引导程序并许诺CPU对Flash进行编程时才有效。 若是CPU永久都可不能写Flash,步骤 (2)可省略。 请参见P234“支持引导装入程序–在写的同时能够读(RWW,Read-While-Write)的自我编程能力”。 注意: 若是在步骤5和6之间发生了中断,写操作将失败。 因为现在EEPROM写使能操作将超时。 若是一个操作EEPROM的中断打断了另一个EEPROM操作,EEAR或EEDR寄放器可能被修改,引发EEPROM操作失败。 建议现在关闭全局中断标志I。 通过写访问时刻以后,EEWE硬件清零。 用户能够凭借这一名判定写时序是不是已经完成。 EEWE置位后,CPU要停止两个时钟周期才会运行下一条指令。 •Bit0–EERE: EEPROM读使能 EERE为EEPROM读操作的使能信号。 当EEPROM地址设置好以后,需置位EERE以便将数据读入EEAR。 EEPROM数据的读取只需要一条指令,且无需等待。 读取EEPROM后CPU要停止4个时钟周期才能够执行下一条指令。 用户在读取EEPROM时应该检测EEWE。 若是一个写操作正在进行,就无法读取EEPROM,也无法改变寄放器EEAR。 通过校准的片内振荡器用于EEPROM按时。 Table1为CPU访问EEPROM的典型时刻。 下面的代码别离用汇编和C函数说明如何实现EEPROM的写操作。 在此假设中断可不能在执行这些函数的进程当中发生。 同时还假设软件没有BootLoader。 假设BootLoader存在,那么EEPROM写函数还需要等待正在运行的SPM命令的终止。 汇编代码例程 EEPROM_write: ;等待上一次写操作终止 sbicEECR,EEWE rjmpEEPROM_write;设置地址寄放器(r18: r17) outEEARH,r18 outEEARL,r17;将数据写入数据寄放器(r16) outEEDR,r16;置位EEMWE sbiEECR,EEMWE;置位EEWE以启动写操作 sbiEECR,EEWE ret C代码例程 voidEEPROM_write(unsignedintuiAddress,unsignedcharucData) { /*等待上一次写操作终止*/ while(EECR&(1< EEAR=uiAddress; EEDR=ucData;/*置位EEMWE*/ EECR|=(1< EECR|=(1< } 下面的例子说明如何用汇编和C函数来读取EEPROM,在此假设中断可不能在执行这些函数的进程当中发生。 汇编代码例程 EEPROM_read: ;等待上一次写操作终止 sbicEECR,EEWE rjmpEEPROM_read;设置地址寄放器(r18: r17) outEEARH,r18 outEEARL,r17;设置EERE以启动读操作 sbiEECR,EERE;自数据寄放器读取数据 inr16,EEDR ret C代码例程 unsignedcharEEPROM_read(unsignedintuiAddress) {/*等待上一次写操作终止*/ while(EECR&(1< EEAR=uiAddress;/*设置EERE以启动读操作*/ EECR|=(1< 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设置上拉电阻。 然
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVRATmega16 中文说明书
![提示](https://static.bdocx.com/images/bang_tan.gif)