AVRATmega16中文说明书.docx

上传人:b****6 文档编号:8495667 上传时间:2023-01-31 格式:DOCX 页数:41 大小:794.63KB
下载 相关 举报
AVRATmega16中文说明书.docx_第1页
第1页 / 共41页
AVRATmega16中文说明书.docx_第2页
第2页 / 共41页
AVRATmega16中文说明书.docx_第3页
第3页 / 共41页
AVRATmega16中文说明书.docx_第4页
第4页 / 共41页
AVRATmega16中文说明书.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

AVRATmega16中文说明书.docx

《AVRATmega16中文说明书.docx》由会员分享,可在线阅读,更多相关《AVRATmega16中文说明书.docx(41页珍藏版)》请在冰豆网上搜索。

AVRATmega16中文说明书.docx

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设置上拉电阻。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文学研究

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1