AVR教程12.docx
- 文档编号:3729372
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:9
- 大小:283.74KB
AVR教程12.docx
《AVR教程12.docx》由会员分享,可在线阅读,更多相关《AVR教程12.docx(9页珍藏版)》请在冰豆网上搜索。
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;使能中断 $02F ......... 当熔丝位BOOTRST未编程,Boot区为2K字节,且寄存器GICR的IVSEL置位时,典 型的复位和中断设置如下: 地址符号代码说明 $000RESET: ldir16,high(RAMEND);主程序 $001outSPH,r16;设置堆栈指针为RAM的顶部 $002ldir16,low(RAMEND) $003outSPL,r16 $004sei;使能中断 $005 ; .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;使能中断 $1C05 当熔丝位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;使能中断 $1C2F 在应用区和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< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVR 教程 12