AVR教程系列一(12):ATmega16 简介(六)

上传人:枫** 文档编号:431720581 上传时间:2023-10-21 格式:DOC 页数:9 大小:263.50KB
返回 下载 相关 举报
AVR教程系列一(12):ATmega16 简介(六)_第1页
第1页 / 共9页
AVR教程系列一(12):ATmega16 简介(六)_第2页
第2页 / 共9页
AVR教程系列一(12):ATmega16 简介(六)_第3页
第3页 / 共9页
AVR教程系列一(12):ATmega16 简介(六)_第4页
第4页 / 共9页
AVR教程系列一(12):ATmega16 简介(六)_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《AVR教程系列一(12):ATmega16 简介(六)》由会员分享,可在线阅读,更多相关《AVR教程系列一(12):ATmega16 简介(六)(9页珍藏版)》请在金锄头文库上搜索。

1、ATmega16 简介(六)ATmega16 控制和状态寄存器MCUCSRAVR 控制和状态寄存器提供了有关引起AVR复位的复位源的信息。? Bit 4 JTRF: JTAG 复位标志通过JTAG 指令AVR_RESET 可以使JTAG 复位寄存器置位,并引发MCU 复位,并使JTRF 置位。上电复位将使其清零,也可以通过写”0” 来清除。? Bit 3 WDRF: 看门狗复位标志看门狗复位发生时置位。上电复位将使其清零,也可以通过写”0” 来清除。? Bit 2 BORF: 掉电检测复位标志掉电检测复位发生时置位。上电复位将使其清零,也可以通过写”0” 来清除。? Bit 1 EXTRF:

2、外部复位标志外部复位发生时置位。上电复位将使其清零,也可以通过写”0” 来清除。? Bit 0 PORF: 上电复位标志上电复位发生时置位。只能通过写”0” 来清除。为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复位。如果在其他复位发生之前将此寄存器复位,则后续复位源可以通过检查复位标志来了解。 ATmega16 基准电压使能信号和启动时间ATmega16 具有片内能隙基准源,用于掉电检测,或者是作为模拟比较器或ADC的输入。ADC 的2.56V 基准电压由此片内能隙基准源产生。电压基准的启动时间可能影响其工作方式。启动时间列于Table 16。为了降低功耗,可以

3、控制基准源仅在如下情况打开:1. BOD 使能 ( 熔丝位BODEN 被编程)2. 能隙基准源连接到模拟比较器(ACSR 寄存器的ACBG 置位)3. ADC 使能因此,当BOD 被禁止时,置位ACBG 或使能ADC 后要启动基准源。为了降低掉电模式的功耗,用户可以禁止上述三种条件,并在进入掉电模式之前关闭基准源。ATmega16 看门狗定时器看门狗定时器由独立的1 Mhz 片内振荡器驱动。这是VCC = 5V 时的典型值。请参见特性数据以了解其他VCC 电平下的典型值。通过设置看门狗定时器的预分频器可以调节看门狗复位的时间间隔,如P41Table 17 所示。看门狗复位指令WDR 用来复位看

4、门狗定时器。此外,禁止看门狗定时器或发生复位时定时器也被复位。复位时间有8 个选项。如果没有及时复位定时器,一旦时间超过复位周期, ATmega16 就复位,并执行复位向量指向的程序。具体的看门狗复位时序在P39 有说明。为了防止无意之间禁止看门狗定时器,在看门狗禁用后必须跟一个特定的修改序列。详见看门狗定时器控制寄存器。看门狗定时器控制寄存器WDTCR ? Bits 7.5 Res: 保留位ATmega16 保留位,读操作返回值为零。? Bit 4 WDTOE: 看门狗修改使能清零WDE 时必须置位WDTOE,否则不能禁止看门狗。一旦置位,硬件将在紧接的4 个时钟周期之后将其清零。请参考有关

5、WDE 的说明来禁止看门狗。? Bit 3 WDE: 使能看门狗WDE为1“ 时,看门狗使能,否则看门狗将被禁止。只有在WDTOE为1“ 时WDE 才能清零。以下为关闭看门狗的步骤:1. 在同一个指令内对WDTOE 和WDE 写1“,即使WDE 已经为1“2. 在紧接的4 个时钟周期之内对WDE 写0”? Bits 2.0 WDP2, WDP1, WDP0: 看门狗定时器预分频器2, 1 和 0WDP2、WDP1 和WDP0 决定看门狗定时器的预分频器,如Table 17 所示。下面的例子分别用汇编和C 语言实现了关闭WDT 的操作。在此假定中断处于用户控制之下 ( 比如禁止全局中断) ,因而

6、在执行下面程序时中断不会发生。 汇编代码例程WDT_off:; WDT 复位WDR; 置位 WDTOE 和 WDEin r16, WDTCRori r16, (1WDTOE)|(1WDE)out WDTCR, r16; 关闭WDTldi r16, (0WDE)out WDTCR, r16retC 代码例程void WDT_off(void)/* WDT 复位*/_WDR();/* 置位 WDTOE 和 WDE*/WDTCR |= (1WDTOE) | (1WDE);/* 关闭WDT */WDTCR = 0x00;ATmega16 中断向量本节描述ATmega16的中断处理。Table 19给出

7、了不同的BOOTRST/IVSEL设置下的复位和中断向量的位置。如果程序永远不使能中断,中断向量就没有意义。用户可以在此直接写程序。同样,如果复位向量位于应用区,而其他中断向量位于Boot 区,则复位向量之后可以直接写程序。反过来亦是如此。 ATmega16 典型的复位和中断设置如下:地址符号代码说明$000 jmp RESET ; 复位中断向量$002 jmp EXT_INT0 ; IRQ0 中断向量$004 jmp EXT_INT1 ; IRQ1 中断向量$006 jmp TIM2_COMP ; Timer2 比较中断向量$008 jmp TIM2_OVF ; Timer2 溢出中断向量$

8、00A jmp TIM1_CAPT ; Timer1 捕捉中断向量$00C jmp TIM1_COMPA ; Timer1 比较A 中断向量$00E jmp TIM1_COMPB ; Timer1 比较B 中断向量$010 jmp TIM1_OVF ; Timer1 溢出中断向量$012 jmp TIM0_OVF ; Timer0 溢出中断向量$014 jmp SPI_STC ; SPI 传输结束中断向量$016 jmp USART_RXC ; USART RX 结束中断向量$018 jmp USART_UDRE ; UDR 空中断向量$01A jmp USART_TXC ; USART TX

9、 结束中断向量$01C jmp ADC ; ADC 转换结束中断向量$01E jmp EE_RDY ; EEPROM 就绪中断向量$020 jmp ANA_COMP ; 模拟比较器中断向量$022 jmp TWSI ; 两线串行接口中断向量$024 jmp EXT_INT2 ; IRQ2 中断向量$026 jmp TIM0_COMP ; 定时器0 比较中断向量$028 jmp SPM_RDY ; SPM 就绪中断向量;$02A RESET: ldi r16,high(RAMEND) ; 主程序$02B out SPH,r16 ; 设置堆栈指针为RAM 的顶部$02C ldi r16,low(R

10、AMEND)$02D out SPL,r16$02E sei ; 使能中断$02F xxx. . .当熔丝位BOOTRST 未编程,Boot 区为 2K 字节,且寄存器GICR 的IVSEL 置位时,典型的复位和中断设置如下:地址符号代码说明$000 RESET: ldi r16,high(RAMEND) ; 主程序$001 out SPH,r16 ; 设置堆栈指针为RAM 的顶部$002 ldi r16,low(RAMEND)$003 out SPL,r16$004 sei ; 使能中断$005 xxx;.org $1C02$1C02 jmp EXT_INT0 ; IRQ0 中断向量$1C0

11、4 jmp EXT_INT1 ; IRQ1 中断向量. . . ;$1C28 jmp SPM_RDY ; SPM 就绪中断向量当熔丝位BOOTRST 已编程,且Boot 区为 2K 字节时,典型的复位和中断设置如下:地址符号代码说明.org $002$002 jmp EXT_INT0 ; IRQ0 中断向量$004 jmp EXT_INT1 ; IRQ1 中断向量. . . ;$028 jmp SPM_RDY ; SPM 就绪中断向量;.org $1C00$1C00 RESET: ldi r16,high(RAMEND) ; 主程序$1C01 out SPH,r16 ; 设置堆栈指针为RAM

12、的顶部$1C02 ldi r16,low(RAMEND)$1C03 out SPL,r16$1C04 sei ; 使能中断$1C05 xxx当熔丝位BOOTRST 已编程,Boot 区为2K 字节,且寄存器GICR 的IVSEL 置位时,典型的复位和中断设置如下:地址符号代码说明.org $1C00$1C00 jmp RESET ; Reset 中断向量$1C02 jmp EXT_INT0 ; IRQ0 中断向量$1C04 jmp EXT_INT1 ; IRQ1 中断向量. . . ;$1C28 jmp SPM_RDY ; SPM 就绪中断向量;$1C2A RESET: ldi r16,hig

13、h(RAMEND) ; 主程序$1C2B out SPH,r16 ; 设置堆栈指针为RAM 的顶部$1C2C ldi r16,low(RAMEND)$1C2D out SPL,r16$1C2E sei ; 使能中断$1C2F xxx在应用区和Boot 区之间移动中断向量 通用中断控制寄存器决定中断向量表的放置地址通用中断控制寄存器 GICR? Bit 1 IVSEL: 中断向量选择当IVSEL 为0“ 时,中断向量位于Flash 存储器的起始地址;当IVSEL 为1“ 时,中断向量转移到Boot 区的起始地址。实际的Boot 区起始地址由熔丝位BOOTSZ 确定。具体请参考P234“ 支持引导

14、装入程序 在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” 。为了防止无意识地改变中断向量表,修改IVSEL 时需要遵照如下过程:1. 置位中断向量修改使能位IVCE2. 在紧接的4 个时钟周期里将需要的数据写入IVSEL,同时对IVCE 写”0”执行上述序列时中断自动被禁止。其实,在置位IVCE 时中断就被禁止了,并一直保持到写IVSEL 操作之后的下一条语句。如果没有IVSEL 写操作,则中断在置位IVCE 之后的4 个时钟周期保持禁止。需要注意的是,虽然中断被自动禁止,但状态寄存器的位I 的值并不受此操作的影响。Note: 若中断向量位于Boot区,且Bo

15、ot锁定位BLB02被编程,则执行应用区的程序时中断被禁止;若中断向量位于应用区,且Boot 锁定位BLB12 被编程,则执行Boot 区的程序时中断被禁止。有关Boot 锁定位的细节请参见P234“ 支持引导装入程序 在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” 。? Bit 0 IVCE: 中断向量修改使能改变IVSEL 时IVCE 必须置位。在IVCE 或IVSEL 写操作之后4 个时钟周期, IVCE 被硬件清零。如前面所述,置位IVCE 将禁止中断。代码如下:汇编代码例程:Move_interrupts:; 使能中断向量的修改ldi r16, (1IVCE)out GICR, r16; 将中断向量转移到boot 区ldi r16, (1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号