AVR教程12.docx

上传人:b****5 文档编号:3729372 上传时间:2022-11-25 格式:DOCX 页数:9 大小:283.74KB
下载 相关 举报
AVR教程12.docx_第1页
第1页 / 共9页
AVR教程12.docx_第2页
第2页 / 共9页
AVR教程12.docx_第3页
第3页 / 共9页
AVR教程12.docx_第4页
第4页 / 共9页
AVR教程12.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

AVR教程12.docx

《AVR教程12.docx》由会员分享,可在线阅读,更多相关《AVR教程12.docx(9页珍藏版)》请在冰豆网上搜索。

AVR教程12.docx

AVR教程12

AVR教程(12):

ATmega16 简介(六)

作者:

微雪电子文章来源:

点击数:

89更新时间:

2008-4-123:

45:

28

ATmega16控制和状态寄存器MCUCSR

AVR控制和状态寄存器提供了有关引起AVR复位的复位源的信息。

?

Bit4–JTRF:

JTAG复位标志

通过JTAG指令AVR_RESET可以使JTAG复位寄存器置位,并引发MCU复位,并使JTRF置位。

上电复位将使其清零,也可以通过写”0”来清除。

?

Bit3–WDRF:

看门狗复位标志

看门狗复位发生时置位。

上电复位将使其清零,也可以通过写”0”来清除。

?

Bit2–BORF:

掉电检测复位标志

掉电检测复位发生时置位。

上电复位将使其清零,也可以通过写”0”来清除。

?

Bit1–EXTRF:

外部复位标志

外部复位发生时置位。

上电复位将使其清零,也可以通过写”0”来清除。

?

Bit0–PORF:

上电复位标志

上电复位发生时置位。

只能通过写”0”来清除。

为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复位。

如果在其他复位发生之前将此寄存器复位,则后续复位源可以通过检查复位标志来了解。

ATmega16基准电压使能信号和启动时间

ATmega16具有片内能隙基准源,用于掉电检测,或者是作为模拟比较器或ADC的输入。

ADC的2.56V基准电压由此片内能隙基准源产生。

电压基准的启动时间可能影响其工作方式。

启动时间列于Table16。

为了降低功耗,可以控制基准源仅在如下情况打开:

1.BOD使能(熔丝位BODEN被编程)

2.能隙基准源连接到模拟比较器(ACSR寄存器的ACBG置位)

3.ADC使能

因此,当BOD被禁止时,置位ACBG或使能ADC后要启动基准源。

为了降低掉电模式的功耗,用户可以禁止上述三种条件,并在进入掉电模式之前关闭基准源。

 

ATmega16看门狗定时器

看门狗定时器由独立的1Mhz片内振荡器驱动。

这是VCC=5V时的典型值。

请参见特性数据以了解其他VCC电平下的典型值。

通过设置看门狗定时器的预分频器可以调节看门狗复位的时间间隔,如P41Table17所示。

看门狗复位指令WDR用来复位看门狗定时器。

此外,禁止看门狗定时器或发生复位时定时器也被复位。

复位时间有8个选项。

如果没有及时复位定时器,一旦时间超过复位周期,ATmega16就复位,并执行复位向量指向的程序。

具体的看门狗复位时序在P39有说明。

为了防止无意之间禁止看门狗定时器,在看门狗禁用后必须跟一个特定的修改序列。

详见看门狗定时器控制寄存器。

看门狗定时器控制寄存器-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

WDP2、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<

/*关闭WDT*/

WDTCR=0x00;

ATmega16中断向量

本节描述ATmega16的中断处理。

Table19给出了不同的BOOTRST/IVSEL设置下的复位和中断向量的位置。

如果程序永远不使能中断,中断向量就没有意义。

用户可以在此直接写程序。

同样,如果复位向量位于应用区,而其他中断向量位于Boot区,则复位向量之后可以直接写程序。

反过来亦是如此。

ATmega16典型的复位和中断设置如下:

地址 符号代码说明

$000jmpRESET;复位中断向量

$002jmpEXT_INT0;IRQ0中断向量

$004jmpEXT_INT1;IRQ1中断向量

$006jmpTIM2_COMP;Timer2比较中断向量

$008jmpTIM2_OVF;Timer2溢出中断向量

$00AjmpTIM1_CAPT;Timer1捕捉中断向量

$00CjmpTIM1_COMPA;Timer1比较A中断向量

$00EjmpTIM1_COMPB;Timer1比较B中断向量

$010jmpTIM1_OVF;Timer1溢出中断向量

$012jmpTIM0_OVF;Timer0溢出中断向量

$014jmpSPI_STC;SPI传输结束中断向量

$016jmpUSART_RXC;USARTRX结束中断向量

$018jmpUSART_UDRE;UDR空中断向量

$01AjmpUSART_TXC;USARTTX结束中断向量

$01CjmpADC;ADC转换结束中断向量

$01EjmpEE_RDY;EEPROM就绪中断向量

$020jmpANA_COMP;模拟比较器中断向量

$022jmpTWSI;两线串行接口中断向量

$024jmpEXT_INT2;IRQ2中断向量

$026jmpTIM0_COMP;定时器0比较中断向量

$028jmpSPM_RDY;SPM就绪中断向量

;

$02ARESET:

ldir16,high(RAMEND);主程序

$02BoutSPH,r16;设置堆栈指针为RAM的顶部

$02Cldir16,low(RAMEND)

$02DoutSPL,r16

$02Esei;使能中断

$02Fxxx

.........

当熔丝位BOOTRST未编程,Boot区为2K字节,且寄存器GICR的IVSEL置位时,典

型的复位和中断设置如下:

地址符号代码说明

$000RESET:

ldir16,high(RAMEND);主程序

$001outSPH,r16;设置堆栈指针为RAM的顶部

$002ldir16,low(RAMEND)

$003outSPL,r16

$004sei;使能中断

$005xxx

;

.org$1C02

$1C02jmpEXT_INT0;IRQ0中断向量

$1C04jmpEXT_INT1;IRQ1中断向量

.........;

$1C28jmpSPM_RDY;SPM就绪中断向量

当熔丝位BOOTRST已编程,且Boot区为2K字节时,典型的复位和中断设置如下:

地址符号代码说明

.org$002

$002jmpEXT_INT0;IRQ0中断向量

$004jmpEXT_INT1;IRQ1中断向量

.........;

$028jmpSPM_RDY;SPM就绪中断向量

;

.org$1C00

$1C00RESET:

ldir16,high(RAMEND);主程序

$1C01outSPH,r16;设置堆栈指针为RAM的顶部

$1C02ldir16,low(RAMEND)

$1C03outSPL,r16

$1C04sei;使能中断

$1C05xxx

当熔丝位BOOTRST已编程,Boot区为2K字节,且寄存器GICR的IVSEL置位时,典

型的复位和中断设置如下:

地址符号代码说明

.org$1C00

$1C00jmpRESET;Reset中断向量

$1C02jmpEXT_INT0;IRQ0中断向量

$1C04jmpEXT_INT1;IRQ1中断向量

.........;

$1C28jmpSPM_RDY;SPM就绪中断向量

;

$1C2ARESET:

ldir16,high(RAMEND);主程序

$1C2BoutSPH,r16;设置堆栈指针为RAM的顶部

$1C2Cldir16,low(RAMEND)

$1C2DoutSPL,r16

$1C2Esei;使能中断

$1C2Fxxx

在应用区和Boot区之间移动中断向量

通用中断控制寄存器决定中断向量表的放置地址

通用中断控制寄存器-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<

/*将中断向量转移到boot区*/

GICR=(1<

}

ATmega16通用中断控制寄存器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<

/*将中断向量转移到boot区*/

GICR=(1<

}

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

当前位置:首页 > 小学教育 > 语文

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

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