Page 1
产品特性
• 高性能、低功耗的 8 位 AVR
• 先进的 RISC 结构
– 130 条指令 – 大多数指令执行时间为单个时钟周期
–32个 8 位通用工作寄存器
– 全静态工作
– 工作于 16 MHz 时性能高达 16 MIPS
– 只需两个时钟周期的硬件乘法器
• 非易失性程序和数据存储器
–8K 字节的系统内可编程 Flash
擦写寿命 : 10,000 次
– 具有独立锁定位的可选 Boot 代码区
通过片上 Boot 程序实现系统内编程
真正的同时读写操作
– 512 字节的 EEPROM
擦写寿命 : 100,000 次
–1K字节的片内 SRAM
– 可以对锁定位进行编程以实现用户程序的加密
• 外设特点
– 两个具有独立预分频器 8 位定时器 / 计数器 , 其中之一有比较功能
– 一个具有预分频器、比较功能和捕捉功能的 16 位定时器 / 计数器
– 具有独立振荡器的实时计数器 RTC
– 三通道 PWM
–TQFP与 MLF 封装的 8 路 ADC
8 路 10 位 ADC
–PDIP封装的 6 路 ADC
8 路 10 位 ADC
– 面向字节的两线接口
– 两个可编程的串行 USART
– 可工作于主机 / 从机模式的 SPI 串行接口
– 具有独立片内振荡器的可编程看门狗定时器
– 片内模拟比较器
• 特殊的处理器特点
– 上电复位以及可编程的掉电检测
– 片内经过标定的 RC 振荡器
– 片内 / 片外中断源
–5种睡眠模式 : 空闲模式、 ADC 噪声抑制模式、省电模式、掉电模式及 Standby 模式
• I/O 和封装
–23个可编程的 I/O 口
–28引脚 PDIP 封装 ,32 引脚 TQFP 封装 ,32 引脚 MLF 封装
• 工作电压
– 2.7 - 5.5V (ATmega8L)
– 4.5 - 5.5V (ATmega8)
• 速度等级
– 0 - 8 MHz (ATmega8L)
– 0 - 16 MHz (ATmega8)
• 4 Mhz 时功耗 , 3V, 25°C
– 工作模式 : 3.6 mA
– 空闲模式 : 1.0 mA
– 掉电模式 : 0.5 µA
®
微处理器
具有 8KB 系统内
可编程 Flash 的
8 位 微
控制器
ATmega8
ATmega8L
2486N–AVR–07/04
Page 2
引脚配置
PDIP
(RESET) PC6
(XCK/T0) PD4
(XTAL1/TOSC1) PB6
(XTAL2/TOSC2) PB7
(INT1) PD3
(XCK/T0) PD4
GND
VCC
GND
VCC
XTAL1/TOSC1) PB6
XTAL2/TOSC2) PB7
(RXD) PD0
(TXD) PD1
(INT0) PD2
(INT1) PD3
VCC
GND
(T1) PD5
(AIN0) PD6
(AIN1) PD7
(ICP1) PB0
TQFP Top View
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PD2 (INT0)
PD1 (TXD)
32313029282726
9101112131415
PD0 (RXD)
PC6 (RESET)
PC5 (ADC5/SCL)
28
27
26
25
24
23
22
21
20
19
18
17
16
15
PC4 (ADC4/SDA)
PC5 (ADC5/SCL)
PC4 (ADC4/SDA)
PC3 (ADC3)
PC2 (ADC2)
PC1 (ADC1)
PC0 (ADC0)
GND
AREF
AVCC
PB5 (SCK)
PB4 (MISO)
PB3 (MOSI/OC2)
PB2 (SS/OC1B)
PB1 (OC1A)
PC3 (ADC3)
PC2 (ADC2)
25
PC1 (ADC1)
24
PC0 (ADC0)
23
ADC7
22
GND
21
AREF
20
ADC6
19
AVCC
18
PB5 (SCK)
17
16
(T1) PD5
(ICP1) PB0
(AIN0) PD6
(AIN1) PD7
(MISO) PB4
(OC1A) PB1
(SS/OC1B) PB2
(MOSI/OC2) PB3
MLF Top View
PD2 (INT0)
PD1 (TXD)
PD0 (RXD)
PC6 (RESET)
PC5 (ADC5/SCL)
PC4 (ADC4/SDA)
PC3 (ADC3)
PC2 (ADC2)
32313029282726
(INT1) PD3
(XCK/T0) PD4
XTAL1/TOSC1) PB6
XTAL2/TOSC2) PB7
2
ATmega8(L)
GND
VCC
GND
VCC
1
2
3
4
5
6
7
8
9101112131415
(T1) PD5
(AIN0) PD6
(ICP1) PB0
(AIN1) PD7
25
16
(MISO) PB4
(OC1A) PB1
(SS/OC1B) PB2
MOSI/OC2) PB3
PC1 (ADC1)
24
PC0 (ADC0)
23
ADC7
22
GND
21
AREF
20
ADC6
19
AVCC
18
PB5 (SCK)
17
NOTE:
The large center pad underneath the ML
packages is made of metal and internally
connected to GND. It should be soldered
or glued to the PCB to ensure good
mechanical stability. If the center pad is
left unconneted, the package might
loosen from the PCB.
2486N–AVR–07/04
Page 3
ATmega8(L)
综述 ATmega8是基于增强的AV R RISC结构的低功耗8位CMOS微控制器。由于其先进的指令
集以及单时钟周期指令执行时间, ATmega8 的数据吞吐率高达 1MIPS/MHz ,从而可以
缓减系统在功耗和处理速度之间的矛盾。
方框图 Figure 1. 结构框图
XTAL1
RESET
VCC
PC0 - PC6 PB0 - PB7
XTAL2
GND
AGND
AREF
PORTC DRIVERS/BUFFERS
PORTC DIGITAL INTERFACE
MUX &
ADC
PROGRAM
COUNTER
PROGRAM
FLASH
INSTRUCTION
REGISTER
INSTRUCTION
DECODER
CONTROL
LINES
AVR CPU
ADC
INTERFACE
STACK
POINTER
SRAM
GENERAL
PURPOSE
REGISTERS
X
Y
Z
ALU
STATUS
REGISTER
PORTB DRIVERS/BUFFERS
PORTB DIGITAL INTERFACE
TWI
TIMERS/
COUNTERS
INTERNAL
OSCILLATOR
WATCHDOG
TIMER
MCU CTRL.
& TIMING
INTERRUPT
UNIT
EEPROM
OSCILLATOR
OSCILLATOR
2486N–AVR–07/04
PROGRAMMING
LOGIC
+
-
SPI
COMP.
INTERFACE
USART
PORTD DIGITAL INTERFACE
PORTD DRIVERS/BUFFERS
PD0 - PD7
3
Page 4
AVR 内核具有丰富的指令集和 32 个通用工作寄存器。所有的寄存器都直接与算逻单元
(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结
构大大提高了代码效率,并且具有比普通的 CISC 微控制器最高至 10 倍的数据吞吐率。
ATmega8 有如下特点 : 8K 字节的系统内可编程 Flash( 具有同时读写的能力,即 RWW),
512 字节 EEPROM, 1K 字节 SRAM, 32 个通用 I/O 口线, 32 个通用工作寄存器,三个
具有比较模式的灵活的定时器 / 计数器 (T/C), 片内 / 外中断,可编程串行 USART ,面向
字节的两线串行接口, 10 位 6 路 (8 路为 TQFP 与 MLF 封装 )ADC ,具有片内振荡器的
可编程看门狗定时器,一个 SPI 串行端口,以及五种可以通过软件进行选择的省电模式。
工作于空闲模式时 CPU 停止工作,而 SRAM 、 T/C 、 SPI 端口以及中断系统继续工作;
掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省
电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠
状态; ADC 噪声抑制模式时终止 CPU 和除了异步定时器与 ADC 以外所有 I/O 模块的工
作,以降低 ADC 转换时的开关噪声; Standby 模式下只有晶体或谐振振荡器运行,其余
功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力。
本芯片是以 Atmel 高密度非易失性存储器技术生产的。片内 ISP Flash 允许程序存储器通
过 ISP 串行接口,或者通用编程器进行编程,也可以通过运行于 AVR 内核之中的引导程
序进行编程。引导程序可以使用任意接口将应用程序下载到应用Flash 存储区 (Application
Flash Memory) 。在更新应用Flash 存储区时引导 Flash 区 (Boot Flash Memory) 的程序继续
运行,实现了 RWW 操作。 通过将 8 位 RISC CPU 与系统内可编程的 Flash 集成在一个
芯片内, ATmega8 成为一个功能强大的单片机,为许多嵌入式控制应用提供了灵活而低
成本的解决方案。
ATmega8 具有一整套的编程与系统开发工具,包括:C 语言编译器、宏汇编、 程序调试
器 / 软件仿真器、仿真器及评估板。
声明 本数据手册的典型值来源于对器件的仿真,以及其他基于相同产生工艺的 AVR 微控制器
的标定特性。本器件经过特性化之后将给出实际的最大值和最小值。
4
ATmega8(L)
2486N–AVR–07/04
Page 5
引脚说明
VCC 数字电路的电源。
GND 地。
ATmega8(L)
端口 B(PB7..PB0)
XTAL1/XTAL2/TOSC1/TOSC2
端口 C(PC5..PC0) 端口 C 为 7 位双向 I/O 口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特
PC6/RESET
端口 D(PD7..PD0) 端口 D 为 8 位双向 I/O 口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特
端口 B 为 8 位双向 I/O 口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特
性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉
低时将输出电流。在复位过程中,即使系统时钟还未起振,端口 B 处于高阻状态。
通过时钟选择熔丝位的设置, PB6 可作为反向振荡放大器或时钟操作电路的输入端。
通过时钟选择熔丝位的设置 PB7 可作为反向振荡放大器的输出端。
若将片内标定 RC 振荡器作为芯片时钟源,且 ASSR 寄存器的 AS2 位设置,PB7..6 作为
异步 T/C2 的 TOSC2..1 输入端。
端口 B 的其他功能见 P 55“ 端口 B 的第二功能 ” 及 P 22“ 系统时钟及时钟选项 ” 。
性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉
低时将输出电流。在复位过程中,即使系统时钟还未起振,端口 C 处于高阻状态。
若 RSTDISBL 熔丝位编程, PC6 作为 I/O 引脚使用。注意 PC6 的电气特性与端口 C 的
其他引脚不同
若 RSTDISBL 熔丝位未编程,PC6 作为复位输入引脚。持续时间超过最小门限时间的低
电平将引起系统复位。门限时间见 P 35Table 15 。持续时间小于门限时间的脉冲不能保
证可靠复位。
端口 C 的其他功能见后。
性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路
拉低时将输出电流。在复位过程中,即使系统时钟还未起振,端口 D 处于高阻状态。
RESET
2486N–AVR–07/04
端口 D 的其他功能见后。
复位输入引脚。持续时间超过最小门限时间的低电平将引起系统复位。门限时间见 P
35Table 15 。持续时间小于门限时间的脉冲不能保证可靠复位。
5
Page 6
AV
CC
AREF A/D 的模拟基准输入引脚。
ADC7..6(TQFP 与 MLF 封装 ) TQFP 与MLF 封装的ADC7..6 作为A/D 转换器的模拟输入。为模拟电源 且作为10 位ADC 通
AVCC 是 A/D 转换器、端口 C (3..0) 及ADC (7..6) 的电源。不使用 ADC 时,该引脚应直接与
V
连接。使用 ADC 时应通过一个低通滤波器与 VCC连接。注意,端口 C (5..4) 为数字电
CC
源, V
道。
CC
。
代码例子 本数据手册包含了一些简单的代码例子以说明如何使用芯片各个不同的功能模块。这些
例子都假定在编译之前已经包含了正确的头文件。有些 C 编译器在头文件里并没有包含
位定义,而且各个 C 编译器对中断处理有自己不同的处理方式。请注意查阅相关文档以
获取具体的信息。
6
ATmega8(L)
2486N–AVR–07/04
Page 7
ATmega8(L)
AVR CPU 内核
介绍 本节从总体上讨论 AVR 内核的结构。CPU 的主要任务是保证程序的正确执行。因此它必
须能够访问存储器、执行运算、控制外设以及处理中断。
结构综述 Figure 2. AVR M C U 结构的方框图
Data Bus 8-bit
Flash
Program
Memory
Instruction
Register
Instruction
Decoder
Control Lines
Program
Counter
Direct Addressing
Indirect Addressing
Status
and Control
32 x 8
General
Purpose
Registrers
ALU
Data
SRAM
EEPROM
Interrupt
Unit
SPI
Unit
Watchdog
Timer
Analog
Comparator
i/O Module1
i/O Module 2
i/O Module n
2486N–AVR–07/04
I/O Lines
为了获得最高的性能以及并行性, AVR 采用了 Harvard 结构,具有独立的数据和程序总
线。程序存储器里的指令通过一级流水线运行。 CPU 在执行一条指令的同时读取下一条
指令 ( 在本文称为预取 )。这个概念实现了指令的单时钟周期运行。程序存储器是可以在
线编程的 Flash 。
快速访问寄存器文件包括 32 个 8 位通用工作寄存器,访问时间为一个时钟周期。从而实
现了单时钟周期的 ALU 操作。在典型的 ALU 操作中,两个位于寄存器文件中的操作数同
时被访问,然后执行运算,结果再被送回到寄存器文件。整个过程仅需一个时钟周期。
寄存器文件里有 6 个寄存器可以用作 3 个 16 位的间接寻址寄存器指针以寻址数据空间,
实现高效的地址运算。其中一个指针还可以作为程序存储器查询表的地址指针。这些附加
的功能寄存器即为 16 位的 X、 Y、 Z 寄存器。
ALU 支持寄存器之间以及寄存器和常数之间的算术和逻辑运算。ALU也可以执行单寄存器
操作。运算完成之后状态寄存器的内容得到更新以反映操作结果。
7
Page 8
程序流程通过有 / 无条件的跳转指令和调用指令来控制,从而直接寻址整个地址空间。大
多数指令长度为 16 位,亦即每个程序存储器地址都包含一条 16 位或 32 位的指令。
程序存储器空间分为两个区:引导程序区 (Boot 区 ) 和应用程序区。这两个区都有专门的
锁定位以实现读和读 / 写保护。用于写应用程序区的 SPM 指令必须位于引导程序区。
在中断和调用子程序时返回地址的程序计数器 (PC) 保存于堆栈之中。堆栈位于通用数据
SRAM,因此其深度仅受限于 SRAM 的大小。在复位例程里用户首先要初始化堆栈指针
SP。这个指针位于 I/O 空间,可以进行读写访问。数据 SRAM 可以通过 5 种不同的寻址模
式进行访问。
AVR 存储器空间为线性的平面结构。
AVR有一个灵活的中断模块。控制寄存器位于I/O空间。状态寄存器里有全局中断使能位。
每个中断在中断向量表里都有独立的中断向量。各个中断的优先级与其在中断向量表的
位置有关,中断向量地址越低,优先级越高。
I/O 存储器空间包含 64 个可以直接寻址的地址,作为 CPU 外设的控制寄存器、 SPI,以 及
其他 I/O 功能。映射到数据空间即为寄存器文件之后的地址 0x20 - 0x5F 。
8
ATmega8(L)
2486N–AVR–07/04
Page 9
ATmega8(L)
ALU -算术逻辑单元 AVR ALU 与 32 个通用工作寄存器直接相连。寄存器与寄存器之间、寄存器与立即数之间
的 ALU 运算只需要一个时钟周期。 ALU 操作分为 3 类:算术、逻辑和位操作。此外还提
供了支持无 / 有符号数和分数乘法的乘法器。具体请参见指令集。
状态寄存器 状态寄存器包含了最近执行的算术指令的结果信息。这些信息可以用来改变程序流程以
实现条件操作。如指令集所述,所有 ALU 运算都将影响状态寄存器的内容。这样,在许
多情况下就不需要专门的比较指令了,从而使系统运行更快速,代码效率更高。
在进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢复。这些工作
需要软件来处理。
AVR 中断寄存器 SREG 定义如下:
B i t 76543210
I T H S V N Z C SREG
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bit 7 – I: 全局中断使能
I 置位时使能全局中断。单独的中断使能由其他独立的控制寄存器控制。如果 I 清零,则不
论单独中断标志置位与否,都不会产生中断。任意一个中断发生后 I 清零,而执行 RETI
指令后 I 恢复置位以使能中断。 I 也可以通过 SEI 和 CLI 指令来置位和清零。
• Bit 6 – T: 位拷贝存储
位拷贝指令 BLD 和 BST 利用 T 作为目的或源地址。BST 把寄存器的某一位拷贝到 T ,而
BLD 把 T 拷贝到寄存器的某一位。
• Bit 5 – H: 半进位标志
半进位标志 H 表示算术操作发生了半进位。此标志对于 BCD 运算非常有用。详见指令集
的说明。
• Bit 4 – S: 符号位 , S = N
S 为负数标志 N 与 2 的补码溢出标志 V 的异或。详见指令集的说明。
• Bit 3 – V:2 的补码溢出标志
支持 2 的补码运算。详见指令集的说明。
• Bit 2 – N: 负数标志
表明算术或逻辑操作结果为负。详见指令集的说明。
• Bit 1 – Z: 零标志
表明算术或逻辑操作结果为零。详见指令集的说明。
• Bit 0 – C: 进位标志
表明算术或逻辑操作发生了进位。详见指令集的说明。
⊕ V
通用寄存器文件 寄存器文件针对 AVR 增强型 RISC 指令集做了优化。为了获得需要的性能和灵活性,寄
存器文件支持以下的输入 / 输出方案:
• 输出一个 8 位操作数,输入一个 8 位结果。
• 输出两个 8 位位操作数,输入一个 8 位结果。
• 输出两个 8 位位操作数,输入一个 16 位结果。
• 输出一个 16 位位操作数,输入一个 16 位结果。
2486N–AVR–07/04
Figure 3 为 CPU 32 个通用工作寄存器的结构。
9
Page 10
Figure 3. AVR CPU 通用工作寄存器
7 0 Addr.
R0 0x00
R1 0x01
R2 0x02
…
R13 0x0D
通用 R14 0x0E
工作 R15 0x0F
寄存器 R16 0x10
R17 0x11
…
R26 0x1A X 寄存器,低字节
R27 0x1B X 寄存器,高字节
R28 0x1C Y 寄存器,低字节
R29 0x1D Y 寄存器,高字节
R30 0x1E Z 寄存器,低字节
R31 0x1F Z 寄存器,高字节
大多数操作寄存器文件的指令都可以直接访问所有的寄存器,而且多数这样的指令的执
行时间为单个时钟周期。
如 Figure 3 所示,每个寄存器都有一个数据内存地址,将他们直接映射到用户数据空间的
头 32 个地址。虽然寄存器文件的物理实现不是 SRAM ,这种内存组织方式在访问寄存器
方面具有极大的灵活性,因为 X、 Y、 Z 寄存器可以设置为指向任意寄存器的指针。
10
ATmega8(L)
2486N–AVR–07/04
Page 11
ATmega8(L)
X、Y、Z 寄存器 寄存器 R26..R31 除了用作通用寄存器外,还可以作为数据间接寻址用的地址指针。这三
个间接寻址寄存器示于 Figure 4 。
Figure 4. X、 Y 、 Z 寄存器
15 XH XL 0
X 寄存器 70 7 0
R27 (0x1B) R26 (0x1A)
15 YH YL 0
Y 寄存器 70 7 0
R29 (0x1D) R28 (0x1C)
15 ZH ZL 0
Z 寄存器 70 7 0
R31 (0x1F) R30 (0x1E)
在不同的寻址模式中,这些地址寄存器可以实现固定偏移量,自动加一和自动减一功能。
具体细节请参见指令集。
堆栈指针 堆栈指针主要用来保存临时数据、局部变量和中断 / 子程序的返回地址。堆栈指针总是指
向堆栈的顶部。要注意 AVR 的堆栈是向下生长的,即新数据推入堆栈时,堆栈指针的数
值将减小。
堆栈指针指向数据 SRAM 堆栈区。在此聚集了子程序堆栈和中断堆栈。调用子程序和使
能中断之前必须定义堆栈空间,且堆栈指针必须指向高于 0x60 的地址空间。使用 PUSH
指令将数据推入堆栈时指针减一;而子程序或中断返回地址推入堆栈时指针将减二。使
用 POP 指令将数据弹出堆栈时,堆栈指针加一;而用 RET 或 RETI 指令从子程序或中断
返回时堆栈指针加二。
AVR 的堆栈指针由I/O 空间中的两个8 位寄存器实现。实际使用的位数与具体器件有关。请
注意某些 AVR 器件的数据区太小,用 SPL 就足够了。此时将不给出 SPH 寄存器。
B i t 1 51 41 31 21 11 0 9 8
SP15 SP14 SP13 SP12 SP11 SP10 SP9 SP8 SPH
SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0 SPL
76543210
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
00000000
指令执行时序 这一节介绍指令执行过程中的访问时序。AVR CPU 由系统时钟 clk
来自选定的时钟源。芯片内部不对此时钟进行分频。
Figure 5 说明了由 Harvard 结构决定的并行取指和指令执行,以及可以进行快速访问的寄
存器文件的概念。这是一个基本的流水线概念,性能高达 1 MIPS /MHz ,具有优良的性价
比、功能 / 时钟比、功能 / 功耗比。
驱动。此时钟直接
CPU
2486N–AVR–07/04
11
Page 12
Figure 5. 并行取指和指令执行
T1 T2 T3 T4
clk
CPU
1st Instruction Fetch
1st Instruction Execute
2nd Instruction Fetch
nd Instruction Execute
3rd Instruction Fetch
3rd Instruction Execute
4th Instruction Fetch
Figure 6 演示的是寄存器文件内部访问时序。在一个时钟周期里,ALU 可以同时对两个寄
存器操作数进行操作,同时将结果保存到目的寄存器中去。
Figure 6. 单时钟周期 ALU 操作
T1 T2 T3 T4
clk
CPU
Total Execution Time
egister Operands Fetch
ALU Operation Execute
Result Write Back
复位与中断处理 AVR 有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件
都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位 I 也置位时,中断可
以发生。根据程序计数器 PC 的不同,在引导锁定位 BLB02 或 BLB12 被编程的情况下,
中断可能被自动禁止。这个特性提高了软件的安全性。详见 P 209“ 存储器编程 ” 的描述。
程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见 P 43“ 中断 ”
列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具有最高
的优先级,第二个为 INT0 – 外部中断请求 0。通过置位通用中断控制寄存器 (GICR) 的
IVSEL,中断向量可以移至引导Flash 的起始处,参见P 43“中断” 。编程熔丝位BOOTRST
也可以将复位向量移至引导 Flash 的起始处。具体参见 P 196“ 支持引导装入程序 -在写
的同时可以读 (RWW, Read-While-Write) 的自我编程能力 ” 。
任一中断发生时全局中断使能位 I 被清零,从而禁止了所有其他的中断。用户软件可以在
中断程序里置位 I 来实现中断嵌套。此时所有的中断都可以中断当前的中断服务程序。执
行 RETI 指令后 I 自动置位。
从根本上说有两种类型的中断。第一种由事件触发并置位中断标志。对于这些中断,程序
计数器跳转到实际的中断向量以执行中断处理程序,同时硬件将清除相应的中断标志。中
断标志也可以通过对其写 ”1” 的方式来清除。当中断发生后,如果相应的中断使能位为
"0" ,则中断标志位置位,并一直保持到中断执行,或者被软件清除。类似的,如果全局
中断标志被清零,则所有已发生的中断都不会被执行,直到 I 置位。然后挂起的各个中断
按中断优先级依次执行。
12
ATmega8(L)
2486N–AVR–07/04
Page 13
ATmega8(L)
第二种类型的中断则是只要中断条件满足,就会一直触发。这些中断不需要中断标志。若
中断条件在中断使能之前就消失了,中断不会被触发。
AVR 退出中断后总是回到主程序并至少执行一条指令才可以去执行其他被挂起的中断。
要注意的是,进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢
复。这些工作必须由用户通过软件来完成。
使用 CLI 指令来禁止中断时,中断禁止立即生效。没有中断可以在执行 CLI 指令后发生,
即使它是在执行 CLI 指令的同时发生的。下面的例子说明了如何在写 EEPROM 时使用这
个指令来防止中断发生以避免对 EEPROM 内容的破坏。
汇编代码例程
in r16, SREG ; 保存SREG
cli ; 禁止中断
启动
sbi EECR, EEMWE ;
sbi EECR, EEWE
out SREG, r16 ;
C 代码例程
char cSREG;
cSREG = SREG; /*
/* 禁止中断 */
_CLI();
EECR |= (1<<EEMWE); /*
EECR |= (1<<EEWE);
SREG = cSREG; /*
EEPROM
恢复
SREG (I位)
保存
SREG */
启动
恢复
SREG (I位) */
写操作
EEPROM
写操作
*/
使用 SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前一定会首先得到执
行。
汇编代码例程
sei ;
sleep ;
; 注意 : 在执行任何被挂起的中断之前 MCU 将首先进入休眠模式
置位全局中断使能标志
进入休眠模式,等待中断发生
C 代码例程
_SEI(); /*
_SLEEP(); /*
/* 注意 : 在执行任何被挂起的中断之前 MCU 将首先进入休眠模式 */
置位全局中断使能标志
进入休眠模式,等待中断发生
*/
*/
中断响应时间 AVR 中断响应时间最少为 4 个时钟周期。4 个时钟周期后,程序跳转到实际的中断处理例
程。在这 4 个时钟期期间 PC 自动入栈。在通常情况下,中断向量为一个跳转指令,此跳
转需要 3 个时钟周期。如果中断在一个多时钟周期指令执行期间发生,则在此多周期指令
执行完毕后 MCU 才会执行中断程序。若中断发生时 MCU 处于休眠模式,中断响应时间
还需增加 4 个时钟周期。此外还要考虑到不同的休眠模式所需要的启动时间。
中断返回需要 4 个时钟。在此期间 PC( 两个字节 ) 将被弹出栈,堆栈指针加二,状态寄存
器 SREG 的 I 置位。
2486N–AVR–07/04
13
Page 14
AVR ATmega8 存储器 本节讲述 ATmega8 的存储器。 AVR 结构具有两个主要的存储器空间:数据存储器空间
和程序存储器空间。此外, ATmega8 还有 EEPROM 存储器以保存数据。这三个存储器
空间都为线性的平面结构。
系统内可编程的 Flash 程序
存储器
ATmega8具有 8K字节的在线编程 Flash,用于存放程序指令代码。因为所有的AVR指令为
16位或 32位,故而Flash 组织成4K x 16 位的形式。用户程序的安全性要根据Flash程序存
储器的两个区:引导 (Boot) 程序区和应用程序区,分开来考虑。
Flash 存储器至少可以擦写 10,000 次。ATmega8的程序计数器 (PC) 为 12 位,因此可以寻
址 4K 字的程序存储器空间。引导程序区以及相关的软件安全锁定位请参见 P 196“ 支持引
导装入程序 -在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” ,而 P 209“
存储器编程 ” 详述了用 SPI 或平行编程模式实现对 Flash 编程。
常数可以保存于整个程序存储器地址空间 ( 参考 LPM 加载程序存储器指令的说明 )。
取指与执行时序图请参见 P 11“ 指令执行时序 ” 。
Figure 7. 程序存储器映像
$00
Application Flash Section
14
Boot Flash Section
$FF
ATmega8(L)
2486N–AVR–07/04
Page 15
SRAM 数据存储器 Figure 8 给出了 ATmega8 SRAM 空间的组织结构。
前 1120 个数据存储器包括了寄存器文件、 I/O 存储器及内部数据 SRAM 。起始的 96 个
地址为寄存器文件与 I/O 存储器,接着是 1024 字节的内部数据 SRAM 。
数据存储器的寻址方式分为 5 种:直接寻址、带偏移量的间接寻址、间接寻址、带预减量
的间接寻址和带后增量的间接寻址。寄存器文件中的寄存器 R26 到 R31 为间接寻址的指
针寄存器。
直接寻址范围可达整个数据区。
带偏移量的间接寻址模式能够寻址到由寄存器 Y 和 Z 给定的基址附近的 63 个地址。
在自动预减和后加的间接寻址模式中,寄存器 X、 Y 和 Z 自动增加或减少。
ATmega8 的全部32 个通用寄存器、64个I/O 寄存器及 1024 个字节的内部数据SRAM 可以
通过所有上述的寻址模式进行访问。寄存器文件的描述见 P 9“ 通用寄存器文件 ” 。
Figure 8. 数据存储器映像
Register File
ATmega8(L)
Data Address Space
R0
R1
R2
...
R29
R30
R31
I/O Registers
$00
$01
$02
...
$3D
$3E
$3F
$0000
$0001
$0002
...
$001D
$001E
$001F
$0020
$0021
$0022
...
$005D
$005E
$005F
Internal SRAM
$0060
$0061
...
$045E
$045F
2486N–AVR–07/04
15
Page 16
数据存储器访问时间 本节说明访问内部存储器的时序,内部数据 SRAM 访问时间为两个 clk
9 所示。
Figure 9. 片上数据 SRAM 存取周期
T1 T2 T3
clk
CPU
ddress
Data
WR
Data
RD
Compute Address
Address Valid
时钟,如 Figure
CPU
Write
Read
Memory Vccess Instruction
Next Instruction
EEPROM 数据存储器 ATmega8 包含 512 字节的 EEPROM 数据存储器。它是作为一个独立的数据空间而存在
的,可以按字节读写。 EEPROM 的寿命至少为 100,000 次擦除周期。 EEPROM 的访问
由地址寄存器、数据寄存器和控制寄存器决定。
P 209“ 存储器编程 ” 包含使用 SPI 或并行编程模式对 EEPROM 编程。
EEPROM 读 / 写访问 EEPROM 的访问寄存器位于 I/O 空间。
EEPROM 的写访问时间由Table 1 给出。自定时功能可以让用户软件监测何时可以开始写
下一字节。用户操作 EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路
中,上电 / 下电时 V
的电源电压。请参见 P 20 “ 防止 EEPROM 数据丢失 ” 以避免出现 EEPROM 数据丢失的
问题。
为了防止无意间对 EEPROM 的写操作,需要执行一个特定的写时序。具体参看 EEPROM
控制寄存器的内容。
执行 EEPROM 读操作时, CPU 会停止工作 4 个周期,然后再执行后续指令;执行
EEPROM 写操作时, CPU 会停止工作 2 个周期,然后再执行后续指令。
上升 / 下降速度会比较慢。此时 CPU 可能工作于低于晶振所要求
CC
16
ATmega8(L)
2486N–AVR–07/04
Page 17
ATmega8(L)
EEPROM 地址寄存器- EEARH
和 EEARL
EEPROM 数据寄存器- EEDR
B i t 1 51 41 31 21 11 0 9 8
–––––––E E A R 8 E E A R H
EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 EEARL
76543210
读/写 RRRRRRRR/ W
R/W R/W R/W R/W R/W R/W R/W R/W
初始值 0000000X
XXXXXXXX
• Bits 15..9 – Res: 保留
保留位,读操作返回值为零。
• Bits 8..0 – EEAR8..0: EEPROM 地址
EEPROM 地址寄存器– EEARH 和EEARL 指定了512 字节的EEPROM 空间。EEPROM 地
址是线性的,从 0 到 511。EEAR 的初始值没有定义。在访问 EEPROM 之前必须为其赋
予正确的数据。
B i t 76543210
MSB LSB EEDR
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bits 7..0 – EEDR7..0: EEPROM 数据
EEPROM 控制寄存器- EECR
对于 EEPROM 写操作, EEDR 是需要写到 EEAR 单元的数据;对于读操作, EEDR 是
从地址 EEAR 读取的数据。
B i t 76543210
– – – – EERIE EEMWE EEWE EERE EECR
读/写 R R R R R/W R/W R/W R/W
初始值 000000X0
• Bits 7..4 – Res: 保留
保留位,读操作返回值为零。
• Bit 3 – EERIE: EEPROM 就绪中断使能
若 SREG 的 I 为 "1" ,则置位 EERIE 将使能 EEPROM 就绪中断。清零 EERIE 则禁止此
中断。当 EEWE 清零时 EEPROM 就绪中断即可发生。
• Bit 2 – EEMWE: EEPROM 主机写使能
EEMWE 决定了EEWE 置位是否可以启动EEPROM 写操作。当EEMWE 为 "1" 时,在 4 个时
钟周期内置位 EEWE 将把数据写入 EEPROM 的指定地址;若 EEMWE 为 "0“ ,则操作
EEWE 不起作用。 EEMWE 置位后 4 个周期,硬件对其清零。见 EEPROM 写过程中对
EEWE 位的描述。
• Bit 1 – EEWE: EEPROM 写使能
EEWE 为 EEPROM 写操作的使能信号。当 EEPROM 数据和地址设置好之后,需置位
EEWE 以便将数据写入 EEPROM。此 时 EEMWE 必须置位,否则 EEPROM 写操作将不会
发生。写时序如下 ( 第 3 步和第 4 步的次序并不重要 ):
1. 等待 EEWE 位变为零。
2. 等待 SPMCSR 中的 SPMEN 位变为零。
3. 将新的 EEPROM 地址写入 EEAR(可选)。
2486N–AVR–07/04
17
Page 18
4. 将新的 EEPROM 数据写入 EEDR(可选)。
5. 对 EECR 寄存器的 EEMWE 写 "1",同时清零 EEWE。
6. 在置位 EEMWE 的 4 个周期内,置位 EEWE。
在 CPU 写 Flash 存储器的时候不能对 EEPROM 进行编程。在启动 EEPROM 写操作之
前软件必须检查 Flash 写操作是否已经完成。步骤 (2 ) 仅在软件包含引导程序并允许 CPU
对 Flash 进行编程时才有用。如果 CPU 永远都不会写 Flash ,步骤 (2 ) 可省略。请参见 P
196“ 支持引导装入程序 -在写的同时可以读 (RWW, Read-While-Write) 的自我编程能力
” 。
注意:如果在步骤 5 和 6 之间发生了中断,写操作将失败。因为此时 EEPROM 写使能操
作将超时。如果一个操作 EEPROM 的中断打断了另一个 EEPROM 操作,EEAR 或 EEDR
寄存器可能被修改,引起 EEPROM 操作失败。建议此时关闭全局中断标志 I。
经过写访问时间之后,EEWE 硬件清零。用户可以凭借这一位判断写时序是否已经完成。
EEWE 置位后, CPU 要停止两个时钟周期才会运行下一条指令。
• Bit 0 – EERE: EEPROM 读使能
EERE 为EEPROM 读操作的使能信号。当EEPROM 地址设置好之后,需置位 EERE 以便将
数据读入 EEAR 。 EEPROM 数据的读取只需要一条指令,且无需等待。读取 EEPROM
后 CPU 要停止 4 个时钟周期才可以执行下一条指令。
用户在读取 EEPROM 时应该检测 EEWE 。如果一个写操作正在进行,就无法读取
EEPROM ,也无法改变寄存器 EEAR 。
经过校准的片内振荡器用于 EEPROM 定时。Table 1 为 CPU 访问 EEPROM 的典型时间。
Table 1. EEPROM 编程时间
符号 校准的 RC 振荡器周期数
EEPROM 写操作 (CPU) 8448 8.5 ms
Note: 1. 使用时钟频率为 1 MHz,不倚赖 CKSEL 熔丝位的设置。
(1)
典型的编程时间
18
ATmega8(L)
2486N–AVR–07/04
Page 19
ATmega8(L)
下面的代码分别用汇编和 C 函数说明如何实现 EEPROM 的写操作。在此假设中断不会在
执行这些函数的过程当中发生。同时还假设软件没有 Boot Loader 。若 Boot Loader 存在,
则 EEPROM 写函数还需要等待正在运行的 SPM 命令的结束。
汇编代码例程
EEPROM_write:
等待上一次写操作结束
;
sbic EECR,EEWE
rjmp EEPROM_write
设置地址寄存器
;
out EEARH, r18
out EEARL, r17
将数据写入数据寄存器
;
out EEDR,r16
置位
EEMWE
;
sbi EECR,EEMWE
置位
EEWE
;
sbi EECR,EEWE
ret
C 代码例程
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
等待上一次写操作结束
/*
while(EECR & (1<<EEWE))
;
设置地址和数据寄存器
/*
EEAR = uiAddress;
EEDR = ucData;
置位
置位
EEMWE */
EEWE
/*
EECR |= (1<<EEMWE);
/*
EECR |= (1<<EEWE);
}
(r18:r17)
以启动写操作
以启动写操作
(r16)
*/
*/
*/
2486N–AVR–07/04
19
Page 20
下面的例子说明如何用汇编和 C 函数来读取 EEPROM ,在此假设中断不会在执行这些函
数的过程当中发生。
汇编代码例程
EEPROM_read:
等待上一次写操作结束
;
sbic EECR,EEWE
rjmp EEPROM_read
设置地址寄存器
;
out EEARH, r18
out EEARL, r17
设置
EERE
;
sbi EECR,EERE
自数据寄存器读取数据
;
in r16,EEDR
ret
(r18:r17)
以启动读操作
C 代码例程
unsigned char EEPROM_read(unsigned int uiAddress)
{
等待上一次写操作结束
/*
while(EECR & (1<<EEWE))
;
设置地址寄存器
/*
EEAR = uiAddress;
设置
EERE
/*
EECR |= (1<<EERE);
自数据寄存器返回数据
/*
return EEDR;
}
以启动读操作
*/
*/
*/
*/
在掉电休眠模式下的 EEPROM
写操作
若程序执行掉电指令时 EEPROM 的写操作正在进行, EEPROM 的写操作将继续,并在
指定的写访问时间之前完成。但写操作结束后,振荡器还将继续运行,芯片并非处于完全
的掉电模式。因此在执行掉电指令之前应结束 EEPROM 的写操作。
防止 EEPROM 数据丢失 若电源电压过低,CPU 和 EEPROM 有可能工作不正常,造成 EEPROM 数据的毁坏 ( 丢
失 )。这种情况在使用独立的 EEPROM 器件时也会遇到。因而需要使用相同的保护方案。
由于电压过低造成 EEPROM 数据损坏有两种可能:一是电压低于 EEPROM 写操作所需
要的最低电压;二是 CPU 本身已经无法正常工作。
EEPROM 数据损坏的问题可以通过以下方法解决:
当电压过低时保持 AVR RESET 信号为低。这可以通过使能芯片的掉电检测电路 BOD 来
实现。如果 BOD 电平无法满足要求则可以使用外部复位电路。若写操作过程当中发生了
复位,只要电压足够高,写操作仍将正常结束。
I/O 存储器 ATmega8 的 I/O 空间定义见 P 271“” 。
ATmega8 所有的I/O 及外设都被放置于I/O 空间。所有的I/O 位置都可以通过 IN 与 OUT 指令
来访问,在 32 个通用工作寄存器和 I/O 之间传输数据。 地址为 0x00 - 0x1F 的 I/O 寄存器
还可用 SBI 和 CBI 指令直接进行位寻址,而 SBIS 和 SBIC 则用来检查某一位的值。更多
内容请参见指令集。使用 IN 和 OUT 指令时地址必须在 0x00 - 0x3F 之间。如果要象 SRAM
一样通过 LD 和 ST 指令访问 I/O 寄存器,相应的地址要加上 0x20 。
20
ATmega8(L)
2486N–AVR–07/04
Page 21
ATmega8(L)
为了与后续产品兼容,保留未用的未应写 "0",而保留的 I/O 寄存器则不应进行写操作。
一些状态标志位的清除是通过写 "1" 来实现的。要注意的是,与其他大多数 AVR 不同,
CBI 和 SBI 指令只能对某些特定的位进行操作,因而可以用于包含这些状态标志的寄存
器。 CBI 与 SBI 指令只对 0x00 到 0x1F 的寄存器有效。
I/O 和外设控制寄存器在后续其他章节进行介绍。
2486N–AVR–07/04
21
Page 22
系统时钟及时钟选项
时钟系统及其分布 Figure 10 为AVR 的主要时钟系统及其分布。这些时钟并不需要同时工作。为了降低功耗,
可以通过使用不同的睡眠模式来禁止无需工作的模块的时钟,详见 P 30“ 电源管理及睡眠
模式 ” 。时钟系统详见 Figure 10 。
Figure 10. 时钟分布
Asynchronous
Timer/Counter
Timer/Counter
Oscillator
General I/O
Modules
clk
clk
ASY
External RC
Oscillator
ADC CPU Core RAM
clk
ADC
I/O
AVR Clock
Control Unit
Source Clock
Clock
Multiplexer
External Clock
clk
CPU
clk
FLASH
Reset Logic
Crystal
Oscillator
Watchdog Timer
Watchdog Clock
Watchdog
Oscillator
Low-Frequency
Crystal Oscillator
Flash and
EEPROM
Calibrated RC
Oscillator
CPU 时钟- clk
I/O 时钟- clk
I/O
Flash 时钟- clk
22
ATmega8(L)
CPU
FLASH
CPU 时钟与操作AVR 内核的子系统相连,如通用寄存器文件、状态寄存器及保存堆栈指针
的数据存储器。终止 CPU 时钟将使内核停止工作和计算。
I/O 时钟用于主要的I/O 模块,如定时器 /计数器、SPI 和 USART 。I/O 时钟还用于外部中断
模块。要注意的是有些外部中断由异步逻辑检测,因此即使 I/O 时钟停止了这些中断仍然
可以得到监控。此外, USI 模块的起始条件检测在没有 clk
的情况下也是异步实现的,
I/O
使得这个功能在任何睡眠模式下都可以正常工作。
Flash 时钟控制 Flash 接口的操作。此时钟通常与 CPU 时钟同时挂起或激活。
2486N–AVR–07/04
Page 23
ATmega8(L)
异步定时器时钟- clk
ASY
异步定时器时钟允许异步定时器 / 计数器直接由外部 32 kHz 时钟晶体驱动。使得此定时
器 / 计数器即使在睡眠模式下仍然可以为系统提供一个实时时钟。异步定时器 / 计数器与
CPU 主时钟使用相同的 XTAL 引脚,但其需要的时钟频率是振荡器频率的四倍。因此,只
有当芯片使用内部振荡器时异步操作才有效。
ADC 时钟- clk
ADC
ADC 具有专门的时钟。这样可以在ADC 工作的时候停止 CPU 和 I/O 时钟以降低数字电路产
生的噪声,从而提高 ADC 转换精度。
时钟源 ATmega8芯片有如下几种通过Flash熔丝位进行选择的时钟源。时钟输入到AVR 时钟发生
器,再分配到相应的模块。
Table 2. 时钟源选择
芯片时钟选项 CKSEL3..0
外部晶体 / 陶瓷振荡器 1111 - 1010
外部低频晶振 1001
外部 RC 振荡器 1000 - 0101
标定的内部 RC 振荡器 0100 - 0001
外部时钟 0000
Note: 1. 对于所有的熔丝位, “1” 表示未编程, “0” 表示已编程。
不同的时钟选项将在后续部分进行介绍。当 CPU 自掉电模式或省电模式唤醒之后,被选
择的时钟源用来为启动过程定时,保证振荡器在开始执行指令之前进入稳定状态。当CPU
从复位开始工作时,还有额外的延迟时间以保证在 MCU 开始正常工作之前电源达到稳定
电平。这个启动时间的定时由看门狗振荡器完成。看门狗溢出时间所对应的 WDT 振荡器
周期数列于 Table 3 。看门狗振荡器的频率由工作电压决定,详见 “ ATmega8 典型特性 ”。
芯片出厂时 CKSEL = “0001” , SUT = “10” (1 MHz 片内 RC 振荡器,电源缓慢上升 )。
(1)
Table 3. 看门狗振荡器周期数
典型的溢出时间 (V CC = 5.0V) 典型的溢出时间 (VCC = 3.0V) 时钟周期数
4.1 ms 4.3 ms 4K (4,096)
65 ms 69 ms 64K (65,536)
2486N–AVR–07/04
23
Page 24
晶体振荡器 XTAL1 与 XTAL2 分别为用作片内振荡器的反向放大器的输入和输出,如 Figure 11 所示,
这个振荡器可以使用石英晶体,也可以使用陶瓷谐振器。熔丝位 CKOPT 用来选择这两种
放大器模式的其中之一。当 CKOPT 被编程时振荡器在输出引脚产生满幅度的振荡。这种
模式适合于噪声环境,以及需要通过 XTAL2 驱动第二个时钟缓冲器的情况。而且这种模
式的频率范围比较宽。当保持 CKOPT 为未编程状态时,振荡器的输出信号幅度比较小。
其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。
对于谐振器, CKOPT 未编程时的最大频率为 8 MHz , CKOPT 编程时为 16 MHz 。 C1
和 C2 的数值要一样,不管使用的是晶体还是谐振器。最佳的数值与使用的晶体或谐振器
有关,还与杂散电容和环境的电磁噪声有关。 Table 4 给出了针对晶体选择电容的一些指
南。对于陶瓷谐振器,应该使用厂商提供的数值。若想得到更多的有关如何选择电容以及
振荡器如何工作的信息,请参考多用途振荡器应用手册。
Figure 11. 晶体振荡器连接图
C2
C1
XTAL
XTAL
GND
振荡器可以工作于三种不同的模式,每一种都有一个优化的频率范围。工作模式通过熔丝
位 CKSEL3..1 来选择,如 Table 4 所示。
Table 4. 晶体振荡器工作模式
使用晶体时电容 C1 和 C2 的推荐范围
CKOPT CKSEL3..1 频率范围 (MHz)
1 101
1 110 0.9 - 3.0 12 - 22
1 111 3.0 - 8.0 12 - 22
0 101, 110, 111 1.0 ≤ 12 - 22
Note: 1. 此选项不适用于晶体,只能用于陶瓷谐振器。
(1)
0.4 - 0.9 –
(pF)
24
如 Table 5 所示,熔丝位 CKSEL0 以及 SUT1..0 用于选择启动时间。
ATmega8(L)
2486N–AVR–07/04
Page 25
Table 5. 晶体振荡器时钟选项对应的启动时间
ATmega8(L)
掉电与节电模式下
CKSEL0 SUT1..0
0 00 258 CK
0 01 258 CK
01 0 1 K C K
01 1 1 K C K
10 0 1 K C K
10 1 1 6 K C K – 石英振荡器, BOD 使能
1 10 16K CK 4.1 ms
11 1 1 6 K C K 6 5 m s
Notes: 1. 这些选项只能用于工作频率不太接近于最大频率,而且启动时的频率稳定性对于应用
而言不重要的情况。不适用于晶体。
2. 这些选项是为陶瓷谐振器设计的,可以保证启动时频率足够稳定。若工作频率不太接
近于最大频率,而且启动时的频率稳定性对于应用而言不重要时也适用于晶体。
的启动时间
(1)
(1)
(2)
(2)
(2)
复位时额外的延迟
时间 (V CC = 5.0V) 推荐用法
4.1 ms
65 ms
– 陶瓷谐振器, BOD 使能
4.1 ms
65 ms
陶瓷谐振器,电源快速上
升
陶瓷谐振器,电源缓慢上
升
陶瓷谐振器,电源快速上
升
陶瓷谐振器,电源缓慢上
升
石英振荡器,电源快速上
升
石英振荡器,电源慢速上
升
低频晶体振荡器 为了使用 32.768 kHz 钟表晶体作为器件的时钟源,必须将熔丝位 CKSEL 设置为 “1001”
以选择低频晶体振荡器。晶体的连接方式如 Figure 11 所示。通过对熔丝位 CKOPT 的编
程,用户可以使能 XTAL1 和 XTAL2 的内部电容,从而去除外部电容。内部电容的标称数
值为 36 pF 。
选择了这个振荡器之后,启动时间由熔丝位 SUT 确定,如 Table 6 所示。
Table 6. 低频晶体振荡器的启动时间
掉电模式和省电模式
SUT1..0
00 1K CK
01 1K CK
10 32K CK 65 ms 启动时频率已经稳定
11 保留
Note: 1. 这些选项只能用于启动时的频率稳定性对应用而言不重要的情况。
的启动时间
(1)
(1)
复位时的额外延迟
时间 (V CC = 5.0V) 推荐用法
4.1 ms 电源快速上升,或是 BOD 使能
65 ms 电源缓慢上升
外部 RC 振荡器 对于时间不敏感的应用可以使用 Figure 12 对于时间不敏感的应用可以使用 Figure 12 的
外部 RC 振荡器。频率可以通过方程 f = 1/(3RC) 进行粗略地鼓估计。电容 C 至少要 22
pF 。通过编程熔丝位 CKOPT ,用户可以使能 XTAL1 和 GND 之间的片内 36 pF 电容,从而
无需外部电容。
2486N–AVR–07/04
25
Page 26
Figure 12. 外部 RC 配置
CC
NC
XTAL
XTAL
GND
振荡器可以工作于四个不同的模式,每个模式有自己的优化频率范围。工作模式通过熔丝
位 CKSEL3..0 选取,如 Table 7 所示。
Table 7. 外部 RC 振荡器工作模式
CKSEL3..0 频率范围 (MHz)
0101 ≤ 0.9
0110 0.9 - 3.0
0111 3.0 - 8.0
1000 8.0 - 12.0
选择了这个振荡器之后,启动时间由熔丝位 SUT 确定,如 Table 8 所示。
Table 8. 外部 RC 振荡器的启动时间
掉电模式和省电模式
SUT1..0
00 18 CK – BOD 使能
的启动时间
复位时的额外延迟
时间 (V CC = 5.0V) 推荐用法
01 18 CK 4.1 ms 电源快速上升
10 18 CK 65 ms 电源缓慢上升
11 6 CK
Note: 1. 这些选项只能用于工作频率不太接近于最大频率时的情况。
(1)
4.1 ms 电源快速上升,或是 BOD 使能
26
ATmega8(L)
2486N–AVR–07/04
Page 27
ATmega8(L)
标定的片内 RC 振荡器 标定的片内 RC 振荡器提供了固定的 1.0、 2.0、 4.0 或 8.0 MHz 的时钟。这些频率都是
5V、 25°C 下的标称数值。这个时钟也可以作为系统时钟,只要按照 Table 9 对熔丝位
CKSEL进行编程即可。选择这个时钟(此时不能对CKOPT进行编程)之后就无需外部器件
了。复位时硬件将标定字节加载到 OSCCAL 寄存器,自动完成对 RC 振荡器的标定。在
5V, 25°C 和频率为 1.0 MHz 时,这种标定可以提供标称频率 ± 3% 的精度;使用
www.atmel.com/avr 中所给出的方法,可在任何电压、任何温度下,使精度达到 ± 1% 。当
使用这个振荡器作为系统时钟时,看门狗仍然使用自己的看门狗定时器作为溢出复位的
依据。更多的有关标定数据的信息请参见 P 211“ 标定字节 ” 。
Table 9. 片内标定的 RC 振荡器工作模式
CKSEL3..0 标称频率 (MHz)
(1)
0001
0010 2.0
0011 4.0
0100 8.0
Note: 1. 出厂时的设置。
选择了这个振荡器之后,启动时间由熔丝位 SUT 确 定,如 Table 10 所示。 PB6
(XTAL1/TOSC1) 与 PB7(XTAL2/TOSC2) 即可作为通用 I/O 引脚,又可作为定时振荡器引
脚。
1.0
Table 10. 内部标定 RC 振荡器的启动时间
掉电模式与省电模式的启
SUT1..0
00 6 CK – BOD 使能
01 6 CK 4.1 ms 电源快速上升
(1)
10
11 保留
Note: 1. 出厂时的设置。
动时间
6 CK 65 ms 电源缓慢上升
复位时的额外延迟时
间 (V CC = 5.0V) 推荐用法
2486N–AVR–07/04
27
Page 28
振荡器标定寄存器- OSCCAL
B i t 76543210
CAL7 CAL6 CAL5 CAL4 CAL3 CAL2 CAL1 CAL0 OSCCAL
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 标定数据
• Bits 7..0 – CAL7..0: 振荡器标定数据
将标定数据写入这个地址可以对内部振荡器进行调节以消除由于生产工艺所带来的振荡
器频率偏差。复位时 1 MHz 的标定数据 ( 标识数据的高字节,地址为 0x00) 自动加载到
OSCCAL 寄存器。如果需要内部 RC 振荡器工作于其他频率,标定数据必须人工加载:首
先通过编程器读取标识数据,然后将标定数据保存到 Flash 或 EEPROM 之中。这些数据
可以通过软件读取,然后加载到 OSCCAL 寄存器。当 OSCCAL 为零时振荡器以最低频
率工作。当对其写如不为零的数据时内部振荡器的频率将增长。写入 0xFF 即得到最高频
率。标定的振荡器用来为访问 EEPROM 和 Flash 定时。有写 EEPROM 和 Flash 的操作
时不要将频率标定到超过标称频率的 10% ,否则写操作有可能失败。要注意振荡器只对
1.0 、2.0、4.0和8.0 MHz 这四种频率进行了标定,其他频率则无法保证,如Table 11 所示。
Table 11. 内部 RC 振荡器频率范围
OSCCAL 数值 最小频率,标称频率的百分比 (%) 最大频率,标称频率的百分比 (%)
0x00 50 100
0x7F 75 150
0xFF 100 200
28
ATmega8(L)
2486N–AVR–07/04
Page 29
ATmega8(L)
外部时钟 为了从外部时钟源驱动芯片, XTAL1 必须如 Figure 13 所示的进行连接。同时,熔丝位
CKSEL必须编程为 “0000”。若熔丝位CKOPT也被编程,用户就可以使用内部的XTAL1和
GND 之间的 36 pF 电容。
Figure 13. 外部时钟驱动配置图
EXTERNAL
CLOCK
SIGNAL
选择了这个振荡器之后,启动时间由熔丝位 SUT 确定,如 Table 12 所示。
Table 12. 外部时钟的启动时间
掉电模式与省电模式的启
SUT1..0
00 6 CK – BOD 使能
01 6 CK 4.1 ms 电源快速上升
10 6 CK 65 ms 电源缓慢上升
11 保留
动时间
复位时的额外延迟时
间 (V CC = 5.0V) 推荐用法
为了保证 MCU 能够稳定工作,不能突然改变外部时钟源的振荡频率。工作频率突变超过
2% 将会产生异常现象。应该在 MCU 保持复位状态时改变外部时钟的振荡频率。
定时器 / 计时器振荡器 对于拥有定时器 / 振荡器引脚 (TOSC1 和 TOSC2) 的 AVR 微处理器,晶体可以直接与这
两个引脚连接,无需外部电容。此振荡器针对 32.768 kHz 的钟表晶体作了优化。不建议
在 TOSC1 引脚输入振荡信号。
2486N–AVR–07/04
29
Page 30
电源管理及睡眠模式 睡眠模式可以使应用程序关闭 MCU 中没有使用的模块,从而降低功耗。 AVR 具有不同
的睡眠模式,允许用户根据自己的应用要求实施剪裁。
进入睡眠模式的条件是置位寄存器 MCUCR 的 SE ,然后执行 SLEEP 指令。具体哪一种
模式 ( 空闲模式、ADC 噪声抑制模式、掉电模式、省电模式及 Standby 模式 ) 由 MCUCR
的 SM2 、SM1 和 SM0 决定,如 Table 13 所示。使能的中断可以将进入睡眠模式的 MCU
唤醒。经过启动时间,外加 4 个时钟周期后, MCU 就可以运行中断例程了。然后返回到
SLEEP 的下一条指令。唤醒时不会改变寄存器文件和SRAM 的内容。如果在睡眠过程中发
生了复位,则 MCU 唤醒后从中断向量开始执行。
注意,由于 TOSC 与 XTAL 共用同一引脚,对于许多 AVR MCU 中有的扩展 Standby 模
式在 ATmega8 中已删除。
P 22Figure 10 介绍了ATmega8 不同的时钟系统及其分布。此图在选择合适的睡眠模式时
非常有用。
MCU 控制寄存器- MCUCR MCU 控制寄存器包含了电源管理的控制位。
B i t 76543210
SE SM2 SM1 SM0
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bit 7 – SE: 休眠使能
为了使 MCU 在执行 SLEEP 指令后进入休眠模式, SE 必须置位。为了确保进入休眠模
式是程序员的有意行为,建议仅在 SLEEP 指令的前一条指令置位 SE 。MCU 一旦唤醒立
即清除 SE 。
• Bits 6..4 – SM2..0: 休眠模式选择位 2、 1 和 0
ISC11 ISC10 ISC01 ISC00 MCUCR
如 Table 13 所示,这些位用于选择具体的休眠模式。
Table 13. 休眠模式选择
SM2 SM1 SM0 休眠模式
000空闲模式
001 A D C噪声抑制模式
010掉电模式
011省电模式
100保留
101保留
(1)
110 S t a n d b y
Note: 1. 仅在使用外部晶体或谐振器时 Standby 模式才可用。
模式
30
ATmega8(L)
2486N–AVR–07/04
Page 31
ATmega8(L)
空闲模式 当 SM2..0 为 000 时, SLEEP 指令将使 MCU 进入空闲模式。在此模式下,CPU 停止运
行,而 SPI 、 USART 、模拟比较器、 ADC 、两线串行接口、定时器 / 计数器、看门狗和
中断系统继续工作。这个睡眠模式只停止了 clk
象定时器溢出与 USART 传输完成等内外部中断都可以唤醒 MCU 。如果不需要从模拟比
较器中断唤醒 MCU ,为了减少功耗,可以切断比较器的电源。方法是置位模拟比较器控
制和状态寄存器 ACSR 的 ACD 。如果 ADC 使能,进入此模式后将自动启动一次转换。
ADC 噪声抑制模式 当 SM2..0 为 001 时, SLEEP 指令将使 MCU 进入噪声抑制模式。在此模式下,CPU 停
止运行,而 ADC 、外部中断、两线接口地址配置、定时器 / 计数器 2 和看门狗继续工作。
这个睡眠模式只停止了 clk
I/O
、 clk
CPU
和 clk
FLASH
此模式提高了 ADC 的噪声环境,使得转换精度更高。 ADC 使能的时候,进入此模式将
自动启动一次 AD 转换。 ADC 转换结束中断、外部复位、看门狗复位、BOD 复位、两线
接口地址匹配中断、定时器 / 计数器 2 中断、SPM/EEPROM 准备好中断、外部电平中断
INT0 或 INT1 ,或外部中断 INT2 可以将 MCU 从 ADC 噪声抑制模式唤醒。
掉电模式 当 SM2..0 为 010 时, SLEEP 指令将使 MCU 进入掉电模式。在此模式下,外部晶体停
振,而外部中断、两线接口地址匹配及看门狗 (如果使能的话)继续工作。只有外部复
位、看门狗复位、 BOD 复位、两线接口地址匹配中断、外部电平中断 INT0 或 INT1 ,或
外部中断 INT2 可以使 MCU 脱离掉电模式。这个睡眠模式停止了所有的时钟,只有异步
模块可以继续工作。
CPU
和 clk
,其他时钟则继续工作。
FLASH
,其他时钟则继续工作。
当使用外部电平中断方式将 MCU 从掉电模式唤醒时,必须保持外部电平一定的时间。具
体请参见 P 62“ 外部中断 ” 。
从施加掉电唤醒条件到真正唤醒有一个延迟时间,此时间用于时钟重新启动并稳定下来。
唤醒周期与由熔丝位 CKSEL 定义的复位周期是一样的,如 P 23“ 时钟源 ” 。
省电模式 当 SM2..0 为 011 时, SLEEP 指令将使 MCU 进入省电模式。这一模式与掉电模式只有
一点不同:
如果定时器 / 计数器 2 为异步驱动,即寄存器 ASSR 的 AS2 置位,则定时器 / 计数器 2 在
睡眠时继续运行。除了掉电模式的唤醒方式,定时器 / 计数器 2 的溢出中断和比较匹配中
断也可以将 MCU 从休眠方式唤醒,只要 TIMSK 使能了这些中断,而且 SREG 的全局中
断使能位 I 置位。
如果异步定时器不是异步驱动的,建议使用掉电模式,而不是省电模式。因为在省电模式
下,若 AS2 为 0 ,则 MCU 唤醒后异步定时器的寄存器数值是没有定义的。
这个睡眠模式停止了除 clk
以外所有的时钟,只有异步模块可以继续工作。
ASY
Standby 模式 当 SM2..0 为 110 时, SLEEP 指令将使 MCU 进入 Standby 模式。这一模式与掉电模式
唯一的不同之处在于振荡器继续工作。其唤醒时间只需要 6 个时钟周期。
Table 14. 在不同睡眠模式下活动的时钟以及唤醒源
工作的时钟 振荡器 唤醒源
2
SPM/
EEPROM
就绪 ADC 其他I/O
使能的定时
CPU
clk
睡眠模式
空闲模式 XX X X X
clk
FLASH
clkIOclk
ADC
clk
ASY
使能的主时钟
器时钟
(2)
INT1
TWI 地址
INT0
匹配
XX X X XX
定时
器
ADC 噪声
抑制模式
2486N–AVR–07/04
XX X X
(2)
(3)
X
XX XX
31
Page 32
Table 14. 在不同睡眠模式下活动的时钟以及唤醒源
工作的时钟 振荡器 唤醒源
睡眠模式
clk
CPU
clk
FLASH
clkIOclk
ADC
clk
ASY
使能的主时钟
使能的定时
器时钟
INT1
INT0
掉电模式 X
省电模式 X
Standby 模
(1)
式
(2)
XX
(2)
X
X
(3)
(3)
(3)
TWI 地址
匹配
X
XX
X
定时
器
2
(2)
SPM/
EEPROM
就绪 ADC其他I/O
Notes: 1. 时钟源为外部晶体或谐振器。
2. ASSR 的 AS
2 置位。
3. 电平中断 INT1 与 INT0。
最小化功耗 试图降低 AVR 控制系统的功耗时需要考虑几个问题。一般来说,要尽可能利用睡眠模式,
并且使尽可能少的模块继续工作。不需要的功能必须禁止。下面的模块需要特殊考虑以达
到尽可能低的功耗。
模数转换器 (ADC) 使能时, ADC 在睡眠模式下继续工作。为了降低功耗,在进入睡眠模式之前需要禁止
ADC 。重新启动后的第一次转换为扩展的转换。具体请参照 P 183“ 模数转换器 ” 。
模拟比较器 在空闲模式时,如果没有使用模拟比较器,可以将其关闭。在 ADC 噪声抑制模式下也是
如此。在其他睡眠模式模拟比较器是自动关闭的。如果模拟比较器使用了内部电压基准
源,则不论在什么睡眠模式下都需要关闭它。否则内部电压基准源将一直使能。请参见 P
180“ 模拟比较器 ” 以了解如何配置模拟比较器。
32
ATmega8(L)
2486N–AVR–07/04
Page 33
ATmega8(L)
掉电检测 BOD 如果系统没有使用掉电检测器 BOD,这个模块也可以关闭。如果熔丝位 BODEN 被编程,
从而使能了 BOD 功能,它将在各种休眠模式下继续工作。在深层次的休眠模式下,这个
电流将占总电流的很大比重。请参看 P 37“ 掉电检测 ” 以了解如何配置 BOD 。
片内基准电压 使用 BOD 、模拟比较器和 ADC 时可能需要内部电压基准源。若这些模块都禁止了,则基
准源也可以禁止。重新使能后用户必须等待基准源稳定之后才可以使用它。如果基准源在
休眠过程中是使能的,其输出立即可以使用。请参见 P 39“ 片内基准电压 ” 以了解基准源
启动时间的细节。
看门狗定时器 如果系统无需使用看门狗,这个模块也可以关闭。若使能,则在任何休眠模式下都持续工
作,从而消耗电流。在深层次的睡眠模式下,这个电流将占总电流的很大比重。请参看 P
40“ 看门狗定时器 ” 以了解如何配置看门狗定时器。
端口引脚 进入休眠模式时,所有的端口引脚都应该配置为只消耗最小的功耗。最重要的是避免驱动
电阻性负载。在休眠模式下 I/O 时钟 clk
也禁止了,从而保证输入电路不会消耗电流。在某些情况下输入逻辑是使能的,用来检测
唤醒条件。用于此功能的具体引脚请参见 P 52“ 数字输入使能和睡眠模式 ” 。 如果输入缓
冲器是使能的,此时输入不能悬空,信号电平也不应该接近 V
耗额外的电流。
和 ADC 时钟 clk
I/O
都被停止了,输入缓冲器
ADC
/2,否则输入缓冲器会消
CC
2486N–AVR–07/04
33
Page 34
系统控制与复位
复位 AVR 复位时所有的 I/O 寄存器都被设置为初始值,程序从复位向量处开始执行。复位向量处的
指令必须是绝对跳转 JMP 指令,以使程序跳转到复位处理例程。如果程序永远不利用中
断功能,中断向量可以由一般的程序代码所覆盖。这个处理方法同样适用于当复位向量位
于应用程序区,中断向量位于 Boot 区 — 或者反过来 — 的时候。 Figure 14 为复位逻辑
的电路图。 Table 15 则定义了复位电路的电气参数。
复位源有效时 I/O 端口立即复位为初始值。此时不要求任何时钟处于正常运行状态。
所有的复位信号消失之后,芯片内部的一个延迟计数器被激活,将内部复位的时间延长。
这种处理方式使得在 MCU 正常工作之前有一定的时间让电源达到稳定的电平。延迟计数
器的溢出时间通过熔丝位 SUT 与 CKSEL 设定。延迟时间的选择请参见 P 23“ 时钟源 ” 。
复位源 ATmega8 有 4 个复位源:
• 上电复位。电源电压低于上电复位门限 V
• 外部复位。引脚 RESET
上的低电平持续时间大于最小脉冲宽度时 MCU 复位。
• 看门狗复位。看门狗使能并且看门狗定时器溢出时复位发生。
• 掉电检测复位。掉电检测复位功能使能,且电源电压低于掉电检测复位门限 V
MCU 即复位。
Figure 14. 复位逻辑
时, MCU 复位。
POT
DATA BUS
BOT
时
BODEN
BODLEVEL
Pull-up Resistor
SPIKE
FILTER
CKSEL[3:0]
Brown-Out
Reset Circuit
Watchdog
Oscillator
Clock
Generator
SUT[1:0]
MCU Control and Status
Register (MCUCSR)
BORF
PORF
WDRF
EXTRF
CK
Delay Counters
TIMEOUT
34
ATmega8(L)
2486N–AVR–07/04
Page 35
Table 15. 复位特性
符号 参数 条件
ATmega8(L)
最小值典型值最大
值单 位
V
POT
上电复位门限电压 ( 电压由低
到高上升 )
上电复位门限电压 ( 电压由高
(1)
到低跌落 )
V
t
V
RST
RST
BOT
RESET 门限电压 0.1 0.9 V
RESET 最小脉冲宽度 1.5 µs
掉电检测复位门限电压
(2)
触发掉电检测复位的低电平的
t
V
BOD
HYST
最小持续时间
掉电检测器的容限 130 mV
Notes: 1. 电压下降时,只有电压低于 V
2. 一些器件的 V
了 V CC = V
可能比标称的最小工作电压还要低。这些器件在生产测试过程中进行
BOT
的测试,保证在 VCC下降到处理器无法正常工作之前产生掉电检测复
BOT
BODLEVEL = 1 2.4 2.6 2.9
BODLEVEL = 0 3.7 4.0 4.5
BODLEVEL = 1 2 µs
BODLEVEL = 0 2 µs
时复位才会发生。
POT
1.4 2.3 V
1.3 2.3 V
CC
V
位。 ATmega8L的测试条件为 BODLEVEL=1 ,ATmega8的测试条件为 BODLEVEL=0 。
BODLEVEL=1 不适用于 ATmega8。
上电复位 上电复位 (POR) 脉冲由片内检测电路产生。检测电平请参见 Table 15 。 无论何时 V CC低
于检测电平 POR 即发生。 POR 电路可以用来触发启动复位,或者用来检测电源故障。
POR 电路保证器件在上电时复位。V
出之前器件一直保持为复位状态。当 V
达到上电门限电压后触发延迟计数器。在计数器溢
CC
下降时,只要低于检测门限, RESET 信号立即
CC
生效。
2486N–AVR–07/04
Figure 15. MCU 启动过程, RESET
V
V
CC
RESET
TIME-OUT
NTERNAL
POT
V
RST
t
TOUT
连接到 V
CC
35
Page 36
Figure 16. MCU 启动过程, RESET 由外电路控制
V
V
CC
RESET
TIME-OUT
NTERNAL
POT
V
RST
t
TOUT
36
ATmega8(L)
2486N–AVR–07/04
Page 37
ATmega8(L)
外部复位 外部复位由外加于 RESET 引脚的低电平产生。当复位低电平持续时间大于最小脉冲宽度
时 ( 参见 Table 15) 即触发复位过程,即使此时并没有时钟信号在运行。当外加信号达到
复位门限电压 V
Figure 17. 工作过程中发生外部复位
CC
掉电检测 ATmega8 具有片内 BOD(Brown-out Detection) 电路,通过与固定的触发电平的对比来检
测工作过程中V
未编程 ), 4.0V (BODLEVEL 已编程 )。 BOD 的触发电平具有迟滞功能以消除电源尖峰
的影响。这个迟滞功能可以解释为 V
BOD 电路的开关由熔丝位BODEN 控制。当BOD 使能后 (BODEN 被编程 ),一 旦 V
触发电平以下 (V
时(V
如果 V
,Figure 18),延时计数器开始计数,一旦超过溢出时间t
BOT+
一直低于触发电平并保持如 Table 15 所示的时间 t
CC
压跌落。
(上升沿)时, t
RST
的变化。此触发电平通过熔丝位 BODLEVEL来设定, 2.7V (BODLEVEL
CC
, Figure 18), BOD 复位立即被激发。当 V CC上升到触发电平以上
BOT-
延时周期开始。延时结束后 MCU 即启动。
TOUT
BOT+
= V
BOT
+ V
HYST
/2 以及 V
BOD
= V
BOT-
, MCU即恢复工作。
TOUT
, BOD 电路将只检测电
BOT
- V
HYST
下降到
CC
/2。
Figure 18. 工作过程中发生掉电检测复位
V
CC
RESET
TIME-OUT
NTERNAL
RESET
V
BOT-
V
BOT+
t
TOUT
37
2486N–AVR–07/04
Page 38
看门狗复位 看门狗定时器溢出时将产生持续时间为 1 个 CK 周期的复位脉冲。在脉冲的下降沿,延时
定时器开始对 t
记数。请参见看门狗定时器的具体操作过程。
TOUT
Figure 19. 工作过程中发生看门狗复位
CC
CK
MCU 控制和状态寄存器-
MCUCSR
MCU 控制和状态寄存器提供了有关引起 MCU 复位的复位源的信息。
B i t 76543210
– – – – WDRF BORF EXTRF PORF MCUCSR
读/写 RRRRR / WR / WR / WR / W
初始值 0000 见位说明
• Bit 7..4 – Res: 保留
这几位保留,读操作始终为 "0” 。
• Bit 3 – WDRF: 看门狗复位标志
看门狗复位发生时置位。上电复位将使其清零,也可以通过写 ”0” 来清除。
• Bit 2 – BORF: 掉电检测复位标志
掉电检测复位发生时置位。上电复位将使其清零,也可以通过写 ”0” 来清除。
• Bit 1 – EXTRF: 外部复位标志
外部复位发生时置位。上电复位将使其清零,也可以通过写 ”0” 来清除。
• Bit 0 – PORF: 上电复位标志
上电复位发生时置位。只能通过写 ”0” 来清除。
为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复
位。如果在其他复位发生之前将此寄存器复位,则后续复位源可以通过检查复位标志来了
解。
38
ATmega8(L)
2486N–AVR–07/04
Page 39
ATmega8(L)
片内基准电压 ATmega8 具有片内能隙基准源,用于掉电检测,或者是作为模拟比较器或 ADC 的输入。
ADC 的 2.56V 基准电压由此片内能隙基准源产生。
基准电压使能信号和启动时间 电压基准的启动时间可能影响其工作方式。启动时间列于 Table 16 。为了降低功耗,可以
控制基准源仅在如下情况打开:
1. BOD 使能 ( 熔丝位 BODEN 被编程 )。
2. 能隙基准源连接到模拟比较器 (ACSR 寄存器的 ACBG 置位 )。
3. ADC 使能。
因此,当 BOD 被禁止时,置位 ACBG 或使能 ADC 后要启动基准源。为了降低掉电模式
的功耗,用户可以禁止上述三种条件,并在进入掉电模式之前关闭基准源。
Table 16. 内部电压基准源的特性
最小值典型值最大
符号 参数
V
BG
t
BG
I
BG
能隙基准源电压 1.15 1.23 1.40 V
能隙基准源启动时间 40 70 µs
能隙基准源功耗 10 µA
值单 位
2486N–AVR–07/04
39
Page 40
看门狗定时器 看门狗定时器由独立的 1 MHz 片内振荡器驱动。这是 V
数据以了解其他V
复位的时间间隔,如 P 41Table 17 所示。看门狗复位指令 WDR 用来复位看门狗定时器。
此外,禁止看门狗定时器或发生复位时定时器也被复位。复位时间有 8 个选项。如果没有
及时复位定时器,一旦时间超过复位周期,ATmega8 就复位,并执行复位向量指向的程
序。具体的看门狗复位时序在 P 38 有说明。
为了防止无意之间禁止看门狗定时器,当看门狗禁用时,其后必须加入一个特定的关闭序
列,详见看门狗定时器控制寄存器说明。
Figure 20. 看门狗定时器
电平下的典型值。通过设置看门狗定时器的预分频器可以调节看门狗
CC
WATCHDOG
OSCILLATOR
= 5V 时的典型值。请参见特性
CC
看门狗定时器控制寄存器-
WDTCR
B i t 76543210
– – – WDCE WDE WDP2 WDP1 WDP0 WDTCR
读/写 R R R R/W R/W R/W R/W R/W
初始值 00000000
• Bits 7..5 – Res: 保留
保留位,读操作返回值为零。
• Bit 4 – WDCE: 看门狗修改使能
清零 WDE 时必须先置位 WDCE ,否则不能禁止看门狗。一旦置位,硬件将在紧接的 4 个
时钟周期之后将其清零。请参考有关 WDE 的说明来禁止看门狗。工作于安全级别 1 和 2
时也必须置位 WDCE 以修改预分频器的数据,详见代码例程。
40
ATmega8(L)
2486N–AVR–07/04
Page 41
ATmega8(L)
• Bit 3 – WDE: 看门狗使能
WDE 为"1“ 时,看门狗使能,否则看门狗将被禁止。只有在WDCE 为 "1“ 时 WDE 才能清零。
以下为关闭看门狗的步骤:
1. 在同一个指令内对 WDCE 和 WDE 写 "1“,即使 WDE 已经为 "1“。
2. 在紧接的 4 个时钟周期之内对 WDE 写 "0”。
• Bits 2..0 – WDP2, WDP1, WDP0: 看门狗定时器预分频器 2, 1, 和 0
WDP2、WDP1 和 WDP0 决定看门狗定时器的预分频器,其预分频值及相应的溢出周期如
Table 17 所示。
Table 17. 看门狗定时器预分频器选项
V
= 3.0V 时典型
WDP2 WDP1 WDP0 WDT 振荡器周期
0 0 0 16K (16,384) 17.1 ms 16.3 ms
0 0 1 32K (32,768) 34.3 ms 32.5 ms
0 1 0 64K (65,536) 68.5 ms 65 ms
0 1 1 128K (131,072) 0.14 s 0.13 s
1 0 0 256K (262,144) 0.27 s 0.26 s
CC
的溢出周期
VCC = 5.0V 时典型
的溢出周期
1 0 1 512K (524,288) 0.55 s 0.52 s
1 1 0 1,024K (1,048,576) 1.1 s 1.0 s
1 1 1 2,048K (2,097,152) 2.2 s 2.1 s
下面的例子分别用汇编和 C 实现了关闭 WDT 的操作。在此假定中断处于用户控制之下 (
比如禁止全局中断 ) ,因而在执行下面程序时中断不会发生。
2486N–AVR–07/04
41
Page 42
改变看门狗定时器配置的时
间序列
改变配置的序列根据不同的安全级别略有不同。下面将逐一说明。
汇编代码例程
WDT_off:
; 复位WDT
wdr
;
置位
WDCE 和 WDE
in r16, WDTCR
ori r16, (1<<WDCE)|(1<<WDE)
out WDTCR, r16
;
关闭
WDT
ldi r16, (0<<WDE)
out WDTCR, r16
ret
C 代码例程
void WDT_off(void )
{
/*
复位
WDT */
_WDR()
/*
置位
WDCE 和 WDE */
WDTCR |= (1<<WDCE) | (1<<WDE);
/*
关闭 WDT */
WDTCR = 0x00;
}
安全级别 1(WDTON 熔丝位未编
程 )
安全级别 2(WDTON 熔丝位已编
程 )
在这个模式下,看门狗定时器的初始状态是禁止的,可以没有限制地通过置位 WDE 来使
能它。改变定时器溢出周期及禁止 ( 已经使能的 ) 看门狗定时器时需要执行一个特定的时
间序列:
1. 在同一个指令内对 WDCE 和 WDE 写 "1“,即使 WDE 已经为 "1“。
2. 在紧接的 4 个时钟周期之内同时对 WDE 及 WDP 写入合适的数据,而 WDCE 则写
"0”。
在这个模式下,看门狗定时器总是使能的, WDE 的读返回值为 "1”。 改变定时器溢出周
期需要执行一个特定的时间序列:
1. 在同一个指令内对WDCE 和 WDE 写 "1“ 。虽 然 WDE 总是为置位状态,也必须写"1“
以启动时序。
在紧接的 4 个时钟周期之内同时对 WDCE 写 "0” ,以及为 WDP 写入合适的数据。 WDE
的数值可以任意。
42
ATmega8(L)
2486N–AVR–07/04
Page 43
ATmega8(L)
中断 本节说明ATmega8 的中断处理。更一般的 AVR 中断处理请参见 P 12“ 复位与中断处理 ” 。
ATmega8 的中断向量
Table 18. 复位和中断向量
程序
向量号
1 0x000
2 0x001 INT0 外部中断请求 0
3 0x002 INT1 外部中断请求 1
4 0x003 TIMER2 COMP 定时器 / 计数器 2 比较匹配
5 0x004 TIMER2 OVF 定时器 / 计数器 2 溢出
6 0x005 TIMER1 CAPT 定时器 / 计数器 1 捕捉事件
7 0x006 TIMER1 COMPA 定时器 / 计数器 1 比较匹配 A
8 0x007 TIMER1 COMPB 定时器 / 计数器 1 比较匹配 B
9 0x008 TIMER1 OVF 定时器 / 计数器 1 溢出
10 0x009 TIMER0 OVF 定时器 / 计数器 0 溢出
地址
(2)
中断源 中断定义
(1)
RESET 外部引脚,上电复位,掉电检测复位,看门狗
复位
11 0x00A SPI, STC SPI 串行传输结束
12 0x00B USART, RXC USART, Rx 结束
13 0x00C USART, UDRE USART 数据寄存器空
14 0x00D USART, TXC USART, Tx 结束
15 0x00E ADC ADC 转换结束
16 0x00F EE_RDY EEPROM 就绪
17 0x010 ANA_COMP 模拟比较器
18 0x011 TWI 两线串行接口
19 0x012 SPM_RDY 保存程序存储器内容就绪
Notes: 1. 熔丝位 BOOTRST 被编程时,MCU复位后程序跳转到 Boot Loader。请参见 P 196“ 支持
引导装入程序 -在写的同时可以读 (RWW, Read-While-Write ) 的自我编程能力 ” 。
2. 当寄存器 GICR的 IVSEL置位时,中断向量转移到 Boot 区的起始地址。此时各个中断向
量的实际地址为表中地址与 Boot 区起始地址之和。
Table 19给出了不同的BOOTRST/IVSEL设置下的复位和中断向量的位置。如果程序永远
不使能中断,中断向量就没有意义。用户可以在此直接写程序。同样,如果复位向量位于
应用区,而其他中断向量位于 Boot 区,则复位向量之后可以直接写程序。反过来亦是如
此。
Table 19. 复位和中断向量位置的确定
BOOTRST
(1)
IVSEL 复位地址 中断向量起始地址
1 0 0x000 0x001
1 1 0x000 Boot 区复位地址 + 0x001
2486N–AVR–07/04
00 B o o t区复位地址 0x001
01 B o o t区复位地址 Boot 区复位地址 + 0x001
43
Page 44
Note: 1. Boot 区复位地址列于P 207Table 82 。 对于熔丝位BOOTRST ,“1” 表示未编程, “0” 表
示已编程。
ATmega8 典型的复位和中断设置如下:
地址 符号 代码 说明
0x000 rjmp RESET ; 复位中断向量
0x001 rjmp EXT_INT0 ; IRQ0 中断向量
0x002 rjmp EXT_INT1 ; IRQ1 中断向量
0x003 rjmp TIM2_COMP ; Timer2 比较中断向量
0x004 rjmp TIM2_OVF ; Timer2 溢出中断向量
0x005 rjmp TIM1_CAPT ; Timer1 捕捉中断向量
0x006 rjmp TIM1_COMPA ; Timer1 比较 A 中断向量
0x007 rjmp TIM1_COMPB ; Timer1 比较 B 中断向量
0x008 rjmp TIM1_OVF ; Timer1 溢出中断向量
0x009 rjmp TIM0_OVF ; Timer0 溢出中断向量
0x00A rjmp SPI_STC ; SPI 传输结束中断向量
0x00B rjmp USART_RXC ; USART RX 结束中断向量
0x00C rjmp USART_UDRE ; UDR 空中断向量
0x00D rjmp USART_TXC ; USART TX 结束中断向量
0x00E rjmp ADC ; ADC 转换结束中断向量
0x00F rjmp EE_RDY ; EEPROM 就绪中断向量
0x010 rjmp ANA_COMP ; 模拟比较器中断向量
0x011 rjmp TWSI ; 两线串行接口中断向量
0x012 rjmp EXT_INT2 ; IRQ2 中断向量
0x013 rjmp TIM0_COMP ; Timer0 比较中断向量
0x014 rjmp SPM_RDY ; SPM 就绪中断向量
;
0x015 RESET: ldi r16,high(RAMEND) ;
0x016 out SPH,r16 ; 设置堆栈指针为 RAM 的顶部
0x017 ldi r16,low(RAMEND)
0x018 out SPL,r16
0x019 sei ;
0x020 <instr> xxx
... ... ...
主程序
使能中断
44
ATmega8(L)
2486N–AVR–07/04
Page 45
ATmega8(L)
当熔丝位 BOOTRST 未编程,Boot 区为 2K 字节,且寄存器 GICR 的 IVSEL 置位时,典
型的复位和中断设置如下:
地址 符号 代码 说明
$000 rjmp RESET ; 复位中断向量
;
$001 RESET:ldi r16,high(RAMEND);
$002 out SPH,r16 ; 设置堆栈指针为 RAM 的顶部
$003 ldi r16,low(RAMEND)
$004 out SPL,r16
$005 sei ;
$006 <instr> xxx
;
.org $c01
$c01 rjmp EXT_INT0 ; IRQ0
$c02 rjmp EXT_INT1 ; IRQ1 中断向量
... ... ...;
$c12 rjmp SPM_RDY ; SPM 就绪中断向量
当熔丝位 BOOTRST 已编程,且 Boot 区为 2K 字节时,典型的复位和中断设置如下:
主程序
使能中断
中断向量
丝位 BOOTRST 已编程,且 Boot 区为 2K 字节时,典型的复位和中断设置如下:
地址 符号 代码 说明
.org 0x001
0x001 rjmp EXT_INT0 ; IRQ0 中断向量
0x002 rjmp EXT_INT1 ; IRQ1 中断向量
... ... . .. ;
0x014 rjmp SPM_RDY ; SPM 就绪中断向量
;
.org $c00
$c00 rjmp RESET ; 复位中断向量
;
$c01 RESET:ldi r16,high(RAMEND);
$c02 out SPH,r16 ; 设置堆栈指针为 RAM 的顶部
$c03 ldi r16,low(RAMEND)
$c04 out SPL,r16
$c05 sei ;
$c06 <instr> xxx
主程序
使能中断
2486N–AVR–07/04
45
Page 46
当熔丝位 BOOTRST 已编程, Boot 区为 2K 字节,且寄存器 GICR 的 IVSEL 置位时,典
型的复位和中断设置如下:
地址 符号 代码 说明
;
.org $c00
$c00 rjmp RESET ; Reset
$c01 rjmp EXT_INT0 ; IRQ0 中断向量
$c02 rjmp EXT_INT1 ; IRQ1 中断向量
... ... ...;
$c12 rjmp SPM_RDY ;
$c13 RESET: ldi r16,high(RAMEND); 主程序
$c14 out SPH,r16 ; 设置堆栈指针为 RAM 的顶部
$c15 ldi r16,low(RAMEND)
$c16 out SPL,r16
$c17 sei ;
$c18 <instr> xxx
SPM 就绪中断向量
使能中断
在应用区和 Boot 区之间移动中断通用中断控制寄存器决定中断向量表的放置地址。
中断向量
通用中断控制寄存器- GICR
B i t 76543210
INT1 INT0 – – – – IVSEL IVCE GICR
读/写 R / WR / WRRRRR / WR / W
初始值 00000000
• Bit 1 – IVSEL: 中断向量选择
当 IVSEL 为 "0“ 时,中断向量位于 Flash 存储器的起始地址;当 IVSEL 为 "1“ 时,中断向
量转移到 Boot 区的起始地址。实际的 Boot 区起始地址由熔丝位 BOOTSZ 确定。具体请
参考 P 196“ 支持引导装入程序 -在写的同时可以读 (RWW, Read-While-Write) 的自我编
程能力 ” 。 为了防止无意识地改变中断向量表,修改 IVSEL 时需要遵照如下过程:
1. 置位中断向量修改使能位 IVCE。
2. 在紧接的 4 个时钟周期里将需要的数据写入 IVSEL,同时对 IVCE 写 ”0”。
执行上述序列时中断自动被禁止。其实,在置位 IVCE 时中断就被禁止了,并一直保持到
写 IVSEL 操作之后的下一条语句。如果没有 IVSEL 写操作,则中断在置位 IVCE 之后的
4 个时钟周期保持禁止。需要注意的是,虽然中断被自动禁止,但状态寄存器的位 I 的值并
不受此操作的影响。
注意:
若中断向量位于 Boot 区,且 Boot 锁定位 BLB02 被编程,则执行应用区的程序时中断被禁
止;若中断向量位于应用区,且 Boot 锁定位 BLB12 被编程, 则执行 Boot 区的程序时中断被禁止。
有关Boot 锁定位的细节请参见
P 196“ 支持引导装入程序 -在写的同时可以读(RWW, Read-
While-Write) 的自我编程能力 ” 。
46
ATmega8(L)
2486N–AVR–07/04
Page 47
ATmega8(L)
• Bit 0 – IVCE: 中断向量修改使能
改变 IVSEL 时 IVCE 必须置位。在 IVCE 或 IVSEL 写操作之后 4 个时钟周期, IVCE 被
硬件清零。如前面所述,置位 IVCE 将禁止中断。代码如下:
汇编代码例程:
Move_interrupts:
; 使能中断向量的修改
ldi r16, (1<<IVCE)
out GICR, r16
; 将中断向量转移到 boot
ldi r16, (1<<IVSEL)
out GICR, r16
ret
C 代码例程
void Move_interrupts(void )
{
/* 使能中断向量的修改 */
GICR = (1<<IVCE);
/* 将中断向量转移到 boot
GICR = (1<<IVSEL);
}
Flash 区
Flash 区 */
2486N–AVR–07/04
47
Page 48
I/O 端口
介绍 作为通用数字 I/O 使用时,所有 AVR I/O 端口都具有真正的读 - 修改 - 写功能。这意味着
用 SBI 或 CBI 指令改变某些管脚的方向 ( 或者是端口电平、禁止 / 使能上拉电阻 ) 时不会
无意地改变其他管脚的方向 ( 或者是端口电平、禁止 / 使能上拉电阻 )。输出缓冲器具有对
称的驱动能力,可以输出或吸收大电流,直接驱动 LED。所有的端口引脚都具有与电压无
关的上拉电阻。并有保护二极管与 V
气特性 ” 以了解完整的参数列表。
Figure 21. I/O 引脚等效原理图
和地相连,如 Figure 21 所示。请参见 P 226“ 电
CC
R
pu
Pxn
C
pin
本节所有的寄存器和位以通用格式表示:小写的 “x” 表示端口的序号,而小写的 “n” 代表
位的序号。但是在程序里要写完整。例如, PORTB3 表示端口 B 的第 3 位,而本节的通
用格式为 PORTxn 。物理 I/O 寄存器和位定义列于 P 61“ I/O 端口寄存器的说明 ” 。
每个端口都有三个 I/O 存储器地址:数据寄存器 – PORTx 、 数据方向寄存器 – DDRx 和
端口输入引脚 – PINx 。数据寄存器和数据方向寄存器为读 / 写寄存器,而端口输入引脚为
只读寄存器。但是需要特别注意的是,对 PINx 寄存器某一位写入逻辑 "1“ 将造成数据寄
存器相应位的数据发生 "0“ 与 “1“ 的交替变化。当寄存器 SFIOR 的上拉禁止位 PUD 置位
时所有端口引脚的上拉电阻都被禁止。
作为通用数字 I/O 时的端口请参见 P 48“ 作为通用数字 I/O 的端口 ” 。多数端口引脚是与
第二功能复用的,如 P 53“ 端口的第二功能 ” 所示。请参见各个模块的具体说明以了解引
脚的第二功能。
使能某些引脚的第二功能不会影响其他属于同一端口的引脚用于通用数字 I/O 目的
See Figure
"General Digital I/O" for
Logic
Details
作为通用数字 I/O 的端口 端口为具有可选上拉电阻的双向 I/O 端口。 Figure 22 为一个 I/O 端口引脚的说明。
48
ATmega8(L)
2486N–AVR–07/04
Page 49
ATmega8(L)
Figure 22. 通用数字 I/O
Pxn
(1)
SLEEP
SYNCHRONIZER
DLQ
D
PINxn
Q
PUD
Q
D
DDxn
Q
CLR
RESET
Q
D
PORTxn
Q
CLR
RESET
Q
Q
WDx
RDx
WPx
RRx
RPx
clk
DATA BUS
I/O
PUD: PULLUP DISABLE
SLEEP: SLEEP CONTROL
clk
: I/O CLOCK
I/O
Note: 1. WPx, WDx, RRx, RPx 和 RDx 对于同一端口的所有引脚都是一样的。 clk
WDx: WRITE DDRx
RDx: READ DDRx
WPx: WRITE PORTx
RRx: READ PORTx REGISTER
RPx: READ PORTx PIN
, SLEEP 和
I/O
PUD 则对所有的端口都是一样的。
配置引脚 每个端口引脚都具有三个寄存器位: DDxn、 PORTxn 和 PINxn ,如 P 61“I/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} = 0b11) 作为中间步骤。
2486N–AVR–07/04
49
Page 50
Table 20 总结了引脚的控制信号。
Table 20. 端口引脚配置
PUD
DDxn PORTxn
00 X输入 No 高阻态 (Hi-Z)
01 0输入 Ye s 被外部电路拉低时将输出电流
01 1输入 No 高阻态 (Hi-Z)
10 X输出 No 输出低电平 ( 漏电流 )
11 X输出 No 输出高电平 ( 源电流 )
(SFIOR 中)I / O
上拉电
阻说 明
读取引脚上的数据 不论如何配置 DDxn ,都可以通过读取 PINxn 寄存器来获得引脚电平。如 Figure 22 所示,
PINxn 寄存器的各个位与其前面的锁存器组成了一个同步器。这样就可以避免在内部时钟
状态发生改变的短时间范围内由于引脚电平变化而造成的信号不稳定。其缺点是引入了
延迟。 Figure 23 为读取引脚电平时同步器的时序图。最大和最小传输延迟分别为 t
和 t
pd,min
。
pd,max
Figure 23. 读取引脚数据时的同步
SYSTEM CLK
INSTRUCTIONS
XXX in r17, PINx
XXX
SYNC LATCH
PINxn
r17
0x00 0xFF
t
pd, max
t
pd, min
下面考虑第一个系统时钟下降沿之后起始的时钟周期。当时钟信号为低时锁存器是关闭
的;而时钟信号为高时信号可以自由通过,如图中 SYNC LATCH 信号的阴影区所示。时
钟为低时信号即被锁存,然后在紧接着的系统时钟上升沿锁存到 PINxn 寄存器。如 t
和 t
所示,引脚上的信号转换延迟界于 ½ ~ 1½ 个系统时钟。
pd,min
pd,max
如 Figure 24 所示,读取软件赋予的引脚电平时需要在赋值指令 out 和读取指令 in 之间有
一个时钟周期的间隔,如 nop 指令。 out 指令在时钟的上升沿置位 SYNC LATCH 信号。
此时同步器的延迟时间 t
为一个系统时钟。
pd
50
ATmega8(L)
2486N–AVR–07/04
Page 51
Figure 24. 读取软件赋予的引脚电平的同步
SYSTEM CLK
ATmega8(L)
r16
INSTRUCTIONS
SYNC LATCH
PINxn
r17
0xFF
out PORTx, r16 nop in r17, PINx
0x00 0xFF
t
pd
2486N–AVR–07/04
51
Page 52
下面的例子演示了如何置位端口 B 的引脚 0 和 1 ,清零引脚 2 和 3 ,以及将引脚 4 到 7 设
置为输入,并且为引脚 6 和 7 设置上拉电阻。然后将各个引脚的数据读回来。如前面讨论
的那样,我们在输出和输入语句之间插入了一个 nop 指令。
汇编代码例程
...
; 定义上拉电阻和设置高电平输出
; 为端口引脚定义方向
ldi r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0)
ldi r17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)
out PORTB,r16
out DDRB,r17
; 为了同步插入 nop 指令
nop
; 读取端口引脚
in r16,PINB
...
C 代码例程
unsigned char i;
...
/* 定义上拉电阻和设置高电平输出 */
/* 为端口引脚定义方向 */
PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
/* 为了同步插入 nop 指令 */
_NOP();
/* 读取端口引脚 */
i = PINB;
...
(1)
(1)
Note: 1. 在汇编程序里使用了两个暂存器。其目的是为了使整个操作过程的时间最短。通过拉
高引脚 0、 1、 6 与 7,直到方向位设置正确,定义位 2、 3 为低,且重新定义为 0 与
1 为强驱动。
数字输入使能和睡眠模式 如 Figure 22 所示,数字输入信号 ( 施密特触发器的输入 ) 可以钳位到地。图中的 SLEEP
信号由 MCU 休眠控制器在各种掉电模式、省电模式以及 Standby 模式下设置,以防止在
输入悬空或模拟输入电平接近 V
/2 时消耗太多的电流。
CC
引脚作为外部中断输入时 SLEEP 信号无效。但若外部中断没有使能, SLEEP 信号仍然
有效。引脚的第二功能使能时 SLEEP 也让位于第二功能,如 P 53“ 端口的第二功能 ” 里
描述的那样。
如果逻辑高电平 (“1”) 出现在一个被设置为 " 上升沿、下降沿或任何逻辑电平变化都引起
中断 " 的外部异步中断引脚上,即使该外部中断未被使能,但从上述休眠模式唤醒时,相
应的外部中断标志位仍会被置 "1”。这是因为引脚电平在休眠模式下被钳位到 "0” 电平。唤
醒过程造成了引脚电平从 "0” 到 ”1” 的变化。
未连接引脚的处理 如果有引脚未被使用,建议给这些引脚赋予一个确定电平。虽然如上文所述,在深层休眠
模式下大多数数字输入被禁用,但还是需要避免因引脚没有确定的电平而造成悬空引脚
在其它数字输入使能模式 ( 复位、工作模式、空闲模式 ) 消耗电流。
最简单的保证未用引脚具有确定电平的方法是使能内部上拉电阻。但要注意的是复位时
上拉电阻将被禁用。如果复位时的功耗也有严格要求则建议使用外部上拉或下拉电阻。不
52
ATmega8(L)
2486N–AVR–07/04
Page 53
ATmega8(L)
推荐直接将未用引脚与 V CC 或 GND 连接,因为这样可能会在引脚偶然作为输出时出现冲
击电流。
端口的第二功能 除了通用数字 I/O 功能之外,大多数端口引脚都具有第二功能。 Figure 25 说明了由Figure
22 简化得出的端口引脚控制信号是如何被第二功能取代的。这些被重载的信号不会出现
在所有的端口引脚,但本图可以看作是适合于AVR 系列处理器所有端口引脚的一般说明。
Figure 25. 端口的第二功能
Pxn
(1)
PUOExn
1
0
1
0
1
0
1
0
PUOVxn
DDOExn
DDOVxn
PVOExn
PVOVxn
DIEOExn
DIEOVxn
SLEEP
SYNCHRONIZER
SET
DLQ
D
PINxn
Q
CLR
PUD
Q
D
DDxn
Q
CLR
RESET
Q
D
PORTxn
Q
CLR
RESET
Q
Q
CLR
WDx
RDx
WPx
RRx
RPx
clk
DATA BUS
I/O
2486N–AVR–07/04
DIxn
AIOxn
PUOExn: Pxn PULL-UP OVERRIDE ENABLE
PUOVxn: Pxn PULL-UP OVERRIDE VALUE
DDOExn: Pxn DATA DIRECTION OVERRIDE ENABLE
DDOVxn: Pxn DATA DIRECTION OVERRIDE VALUE
PVOExn: Pxn PORT VALUE OVERRIDE ENABLE
PVOVxn: Pxn PORT VALUE OVERRIDE VALUE
DIEOExn: Pxn DIGITAL INPUT-ENABLE OVERRIDE ENABLE
DIEOVxn: Pxn DIGITAL INPUT-ENABLE OVERRIDE VALUE
SLEEP: SLEEP CONTROL
Note: 1. WPx, WDx, RRx, RPx和RDx对于同一个端口的所有引脚都是一样的。clk
PUD: PULLUP DISABLE
WDx: WRITE DDRx
RDx: READ DDRx
RRx: READ PORTx REGISTER
WPx: WRITE PORTx
RPx: READ PORTx PIN
clk
: I/O CLOCK
I/O
DIxn: DIGITAL INPUT PIN n ON PORTx
AIOxn: ANALOG INPUT/OUTPUT PIN n ON PORTx
, SLEEP和
I/O
PUD 则对所有的端口都是一样的。其他信号只对某一个引脚有效。
Table 21为重载信号的简介。表中没有给出Figure 25的引脚和端口索引。这些重载信号是
由第二功能模块产生的。
53
Page 54
Table 21. 第二功能重载信号的一般说明
信号名称 全 称 说 明
PUOE 上拉电阻
重载使能
若此信号置位,上拉电阻使能将受控于 PUOV ;若此
信号清零,则 {DDxn, PORTxn, PUD} = 0b010 时上拉
电阻使能。
PUOV 上拉电阻
重载值
DDOE 数据方向
重载使能
DDOV 数据方向
重载值
PVOE 端口数据
重载使能
PVOV 端口数据
重载值
DIEOE
DIEOV
DI 数字输入 此信号为第二功能的数字输入。在图中,这个信号与
AIO 模拟信号
数字输入使能
覆盖使能
数字输入使能
覆盖值
输入 / 输出
若 PUOE 置位,则不论 DDxn 、 PORTxn 和 PUD 寄存
器各个位如何配置, PUOV 置位 / 清零时上拉电阻使
能/禁止
如果此信号置位,则输出驱动使能由 DDOV 控制;若
此信号清零,输出驱动使能由 DDxn 寄存器控制。
若 DDOE 置位,则 DDOV 置位 / 清零时输出驱动使能
/ 禁止,而不管 DDxn 寄存器的设置如何。
如果这个信号置位,且输出驱动使能,端口数据由
PVOV 控制;若 PVOE 清零,且输出驱动使能,端口数
据由寄存器 PORTxn 控制。
若 PVOE 置位,端口值设置为 PVOV ,而不管寄存器
PORTxn 如何设置。
如果这个信号置位,数字输入使能由 DIEOV 控制;若
DIEOE清零,数字输入使能由 MCU的状态确定( 正常模
式,睡眠模式 )。
若 DIEOE 置位, DIEOV 置位 / 清零时数字输入使能 /
禁止,而不管 MCU 的状态如何 ( 正常模式,睡眠模式
)。
施密特触发相连,并且在同步器之前。除非数字输入
用作时钟源,否则第二功能模块将使用自己的同步器。
模拟输入 / 输出。信号直接与引脚接点相连,而且可以
用作双向端口。
54
下面的几小节将简单地说明每个端口的第二功能以及相关的信号。具体请参考有关第二
功能的说明。
ATmega8(L)
2486N–AVR–07/04
Page 55
ATmega8(L)
特殊功能 I/O 寄存器- SFIOR
Bit 7 6 5 4 3 2 1 0
读/写 R R R R R/W R/W R/W R/W
初始值 000 00000
• Bit 2 – PUD: 禁用上拉电阻
置位时,即使将寄存器 DDxn 和 PORTxn 配置为使能上拉电阻 ({DDxn, PORTxn} =
0b01) , I/O 端口的上拉电阻也被禁止。请参见 P 49“ 配置引脚 ” 。
端口 B 的第二功能 端口 B 的第二功能列于 Table 22 。
Table 22. 端口 B 的第二功能
端口引脚 第二功能
PB7
PB6
PB5 SCK (SPI 总线的主机时钟输入 )
PB4 MISO (SPI 总线的主机输入 / 从机输出信号 )
PB3
PB2
PB1 OC1A (T/C1 输出比较匹配 A 输出 )
PB0 ICP1 (T/C1 输入捕获引脚 )
XTAL2 ( 芯片时钟振荡器引脚
TOSC2 (
XTAL1 ( 芯片时钟振荡器引脚
TOSC1 ( 定时振荡器引脚 1)
MOSI (SPI 总线的主机输出 / 从机输入信号 )
OC2 (T/C2 输出比较匹配输出 )
SS (SPI 总线主从选择 )
OC1B (T/C1 输出比较匹配 B 输出 )
定时振荡器引脚 2)
ACME PUD PSR2 PSR10 SFIOR
2)
1 或外部时钟输入 )
引脚配置如下:
• XTAL2/TOSC2 – 端口 B, Bit 7
XTAL2 :芯片时钟振荡器引脚 2 。使用晶振或低频晶振作为时钟时的引脚。当其作为时钟
引脚时,不能作为 I/O 引脚使用。
TOSC2 :定时振荡器引脚 2 。当片内标定 RC 振荡器作为芯片时钟源,且异步定时器使能
时,作为时钟引脚。当 ASSR 寄存器的 AS2 位置 "1” 使能 T/C2 异步时钟, PB7 不与端
口连接,作为振荡放大器反向输出使用。在该模式下,晶振与该引脚连接,且该引脚不能
作为 I/O 引脚使用。
若 PB7 作为时钟引脚使用, DDB7 、 PORTB7 及 PINB7 的读出值为 ”0” 。
• XTAL1/TOSC1 – 端口 B, Bit 6
XTAL1:芯片时钟振荡器引脚 1。适用于所有芯片时钟源 ( 片内标定 RC 振荡器除外 )。当 其
作为时钟引脚时,不能作为 I/O 引脚使用。
TOSC1 :定时振荡器引脚 1 。当片内标定 RC 振荡器作为芯片时钟源,且异步定时器使能
时,作为时钟引脚。当 ASSR 寄存器的 AS2 位置 "1” 使能 T/C2 异步时钟, PB6 不与端
口连接,作为振荡放大器反向输出使用。在该模式下,晶振与该引脚连接,且该引脚不能
作为 I/O 引脚使用。
若 PB6 作为时钟引脚使用, DDB6 、 PORTB6 及 PINB6 的读出值为 ”0” 。
•SCK – 端口 B, Bit 5
2486N–AVR–07/04
55
Page 56
SCK :SPI 通道的主机时钟输出,从机时钟输入端口。工作于从机模式时,不论 DDB5 设
置如何,这个引脚都将设置为输入。工作于主机模式时,这个引脚的数据方向由 DDB5 控
制。设置为输入后,上拉电阻由 PORTB5 控制。
•MISO – 端口 B, Bit 4
MISO :SPI 通道的主机数据输入,从机数据输出端口。工作于主机模式时,不论 DDB4 设
置如何,这个引脚都将设置为输入。工作于从机模式时,这个引脚的数据方向由 DDB4 控
制。设置为输入后,上拉电阻由 PORTB4 控制。
• MOSI/OC2 – 端口 B, Bit 3
MOSI :SPI 通道的主机数据输出,从机数据输入端口。工作于从机模式时,不论 DDB3 设
置如何,这个引脚都将设置为输入。当工作于主机模式时,这个引脚的数据方向由 DDB3
控制。设置为输入后,上拉电阻由 PORTB3 控制。
OC2 ,输出比较匹配输出:PB3 引脚作为 T/C2 比较匹配的外部输出。此时, PB3 引脚将
设置为输出。 OC2 引脚在 PWM 模式定时器功能时作为输出引脚。
•SS
/OC1B – 端口 B, Bit 2
SS
: 从机选择输入。工作于从机模式时,不论 DDB2 设置如何,这个引脚都将设置为输
入。当此引脚为低时 SPI 被激活。工作于主机模式时,这个引脚的数据方向由 DDB2 控
制。设置为输入后,上拉电阻由 PORTB2 控制。
OC1B , 输出比较匹配输出:PB2 引脚作为 T/C1 比较匹配的外部输出。此时,PB2 引脚将
设置为输出。 OC1B 引脚在 PWM 模式定时器功能时作为输出引脚。
• OC1A – 端口 B, Bit 1
OC1A , 输出比较匹配输出:PB1 引脚作为 T/C1 比较匹配 A 的外部输出。此时,PB1 引脚
将设置为输出。 OC1A 引脚在 PWM 模式定时器功能时作为输出引脚。
• ICP1 – 端口 B, Bit 0
ICP1 – 输入捕获引脚:PB0 引脚作为 T/C1 的输入捕获引脚。
Table 23 与 Table 24 给出了端口 B 第二功能与 P 53Figure 25 重载信号的对应关系。 SPI
MSTR INPUT 和 SPI SLAVE OUTPUT 构成了MISO信号,而MOSI可以分解为SPI MSTR
OUTPUT 和 SPI SLAVE INPUT。
Table 23. PB7..PB4 的第二功能重载信号
信号
名称
PUOE EXT
PUO 0 0 PORTB5 • PUD
DDOE EXT • (INTRC +
DDOV 0 0 0 0
PVOE 0 0 SPE • MSTR SPE • MSTR
PVOV 0 0 SCK 输出 SPI 从机输出
DIEOE EXT
DIEOV 0 0 0 0
DI – – SCK 输入 SPI 主机输入
AIO 振荡器输出 振荡器 / 时钟输入 ––
PB7/XTAL2/
TOSC2
AS2)
AS2)
AS2)
(1)(2)
• (INTRC +
• (INTRC +
PB6/XTAL1/
(1)
TOSC1
INTRC + AS2 SPE • MSTR SPE • MSTR
INTRC + AS2 SPE • MSTR SPE • MSTR
INTRC + AS2 0 0
PB5/SCK PB4/MISO
PORTB4 • PUD
56
ATmega8(L)
2486N–AVR–07/04
Page 57
ATmega8(L)
Notes: 1. INTRC 表示选择片内 RC 振荡器 ( 通过设置 CKSEL 熔丝位 )。
2. EXT 表示选择外部 RC 振荡器或外部时钟 ( 通过设置 CKSEL 熔丝位 )。
Table 24. PB3..PB0 的第二功能重载信号
信号
名称 PB3/MOSI/OC2 PB2/SS/OC1B PB1/OC1A PB0/ICP1
PUOE SPE • MSTR
PUO PORTB3 • PUD
DDOE SPE • MSTR
DDOV 0 0 0 0
PVOE SPE • MSTR +
OC2 使能
PVOV SPI 主机输出 + O C 2O C 1 BO C 1 A0
D I E O E 0 000
D I E O V 0 000
DI SPI 从机输入 SPI SS
A I O – –––
端口 C 的第二功能 端口 C 的第二功能示于 Table 25。
Table 25. 端口 C 的第二功能
端口引脚 第二功能
PC6 RESET
PC5
PC4
( 复位引脚 )
ADC5 (ADC 输入通道 5)
SCL ( 两线串行总线时钟线 )
ADC4 (ADC 输入通道 4)
SDA ( 两线串行总线数据输入 / 输出线 )
SPE • MSTR 00
PORTB2 • PUD 00
SPE • MSTR 00
OC1B 使能 OC1A 使能 0
–I C P 1 输入
2486N–AVR–07/04
PC3 ADC3 (ADC 输入通道 3)
PC2 ADC2 (ADC 输入通道 2)
PC1 ADC1 (ADC 输入通道 1)
PC0 ADC0 (ADC 输入通道 0)
第二功能配置如下:
• RESET
RESET
– 端口 C, Bit 6
,复 位 引 脚:当 RSTDISBL 熔丝位编程,该引脚作为普通 I/O 引脚使用,且将上电
复位与掉电检测复位作为其复位源。若 RSTDISBL 熔丝位未编程,复位电路与该引脚连
接,该引脚不能作为普通 I/O 引脚使用。
若 PC6 作为时钟引脚使用, DDC6 、 PORTC6 及 PINC6 的读出值为 ”0” 。
• SCL/ADC5 – 端口 C, Bit 5
SCL ,两线串行接口时钟:当 TWCR 寄存器的 TWEN 位置 1 使能两线串行接口,引脚 PC5
未与端口连接,成为两线串行接口的串行时钟 I/O 引脚。在该模式下,在引脚处使用窄带
滤波器抑制低于 50 ns 的输入信号,且该引脚由斜率限制的开漏驱动器驱动。
PC5 还可用作 ADC 输入通道 5 。注意, ADC 输入通道 5 为数字电源。
• SDA/ADC4 – 端口 C, Bit 4
57
Page 58
SDA ,两线串行接口数据:当寄存器TWCR 的 TWEN 位置 1 使能两线串行接口 ,引 脚 PC1
不与端口相联,且成为两线串行接口的串行数据 I/O 引脚。在该模式下,在引脚处使用窄
带滤波器抑制低于 50 ns 的输入信号,且该引脚由斜率限制的开漏驱动器驱动。
PC4 还可用作 ADC 输入通道 4 。注意, ADC 输入通道 4 为数字电源。
• ADC3 – 端口 C, Bit 3
PC3 还可用作 ADC 输入通道 3 。注意, ADC 输入通道 3 为数字电源。
• ADC2 – 端口 C, Bit 2
PC2 还可用作 ADC 输入通道 2 。注意, ADC 输入通道 2 为数字电源。
• ADC1 – 端口 C, Bit 1
PC1 还可用作 ADC 输入通道 1 。注意, ADC 输入通道 1 为数字电源。
• ADC0 – 端口 C, Bit 0
PC0 还可用作 ADC 输入通道 0。注意, ADC 输入通道 0 为数字电源。
Table 26 和 Table 27 给出了端口 C 第二功能与 P 53Figure 25 重载信号的对应关系。
Table 26. PC6..PC4 的第二功能重载信号
信号名称 PC6/RESET PC5/SCL/ADC5 PC4/SDA/ADC4
PUOE RSTDISBL
PUOV 1 PORTC5 • PUD
DDOE RSTDISBL TWEN TWEN
DDOV 0 SCL_OUT SDA_OUT
PVOE 0 TWEN TWEN
PVOV 0 0 0
DIEOE RSTDISBL 00
DIEOV 0 0 0
DI – – –
AIO 复位输入 ADC5 输入 / SCL 输入 ADC4 输入 / SDA 输入
Table 27. PC3..PC0 的第二功能重载信号
信号名称 PC3/ADC3 PC2/ADC2 PC1/ADC1 PC0/ADC0
P U O E 0000
P U O V 0000
DDOE 0 0 0 0
DDOV 0 0 0 0
PVOE 0 0 0 0
PVOV 0 0 0 0
TWEN TWEN
PORTC4 • PUD
(1)
58
D I E O E 0000
D I E O V 0000
D I––––
AIO ADC3 输入 ADC2 输入 ADC1 输入 ADC0 输入
ATmega8(L)
2486N–AVR–07/04
Page 59
Note: 1. 使能后,两线串行接口使能输出引脚 PC4 与 PC5 的斜率控制。这在图中并未示出。另
外,窄带滤波器连在图中给出的 AIO 输出端口与 TWI 的数字逻辑模块之间。
端口 D 的第二功能 端口 D 的第二功能列于 Table 28 。
Table 28. 端口 D 的第二功能
端口引脚 第二功能
PD7 AIN1 ( 模拟比较器负输入 )
PD6 AIN0 ( 模拟比较器正输入 )
PD5 T1 (T/C1 外部计数器输入 )
ATmega8(L)
PD4
PD3 INT1 ( 外部中断 1 输入 )
PD2 INT0 ( 外部中断 0 输入 )
PD1 TXD (USART 输出引脚 )
PD0 RXD (USART 输入引脚 )
XCK (USART 外部时钟输入 / 输出 )
T0 (T/C0 外部计数器输入 )
第二功能配置如下:
• AIN1 – 端口 D, Bit 7
AIN1 ,模拟比较器负输入。配置为输入端口引脚时关闭内部上拉电阻,以避免模拟比较
器干扰数字端口功能。
• AIN0 – 端口 D, Bit 6
AIN0 ,模拟比较器正输入。配置为输入端口引脚时关闭内部上拉电阻,以避免模拟比较
器干扰数字端口功能。
• T1 – 端口 D, Bit 5
T1 , T/C1 计数器源。
• XCK/T0 – 端口 D, Bit 4
XCK, USART 外部时钟。
T0, T/C0 计数器源。
• INT1 – 端口 D, Bit 3
2486N–AVR–07/04
INT1,外部中断源 1: PD3 引脚作为外部中断源。
• INT0 – 端口 D, Bit 2
INT0,外部中断源 0: PD2 引脚作为外部中断源。
•TXD – 端口 D, Bit 1
TXD 是USART 的数据发送引脚。当使能了USART 的发送器后,这个引脚被强制设置为输
出,此时 DDD1 不起作用。
•RXD – 端口 D, Bit 0
RXD 是USART 的数据接收引脚。当使能了USART 的接收器后,这个引脚被强制设置为输
出,此时 DDD0 不起作用。但是 PORTD0 仍然控制上拉电阻。
Table 29 和 Table 30 将端口 D 的第二功能与 P 53Figure 25 的重载信号关联在了一起。
59
Page 60
Table 29. PD7..PD4 的第二功能
信号名称 PD7/AIN1 PD6/AIN0 PD5/T1 PD4/XCK/T0
PUOE 0 0 0 0
PUO 0 0 0 0
OOE 0 0 0 0
OO 0 0 0 0
PVOE 0 0 0 UMSEL
PVO 0 0 0 XCK 输出
DIEOE 0 0 0 0
DIEO 0 0 0 0
DI – – T1 输入 XCK 输入 / T0 输入
AIO AIN1 输入 AIN0 输入 ––
Table 30. PD3..PD0 的第二功能
信号名称 PD3/INT1 PD2/INT0 PD1/TXD PD0/RXD
PUOE 0 0 TXEN RXEN
PUO 0 0 0 PORTD0 • PUD
OOE 0 0 TXEN RXEN
O O 001 0
PVOE 0 0 TXEN 0
PVO 0 0 TXD 0
DIEOE INT1 使能 INT0 使能 00
D I E O 110 0
DI INT1 输入 INT0 输入 –R X D
A I O ––– –
60
ATmega8(L)
2486N–AVR–07/04
Page 61
I/O 端口寄存器的说明
ATmega8(L)
端口 B 数据寄存器- PORTB
端口 B 数据方向寄存器- DDRB
端口 B 输入引脚地址- PINB
端口 C 数据寄存器- PORTC
端口 C 数据方向寄存器- DDRC
B i t 76543210
PORTB7 PORTB6 PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB0 PORTB
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
DDB7 DDB6 DDB5 DDB4 DDB3 DDB2 DDB1 DDB0 DDRB
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
PINB7 PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB0 PINB
读/写 RRRRRRRR
初始值 N/A N/A N/A N/A N/A N/A N/A N/A
B i t 76543210
– PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0 PORTC
读/写 R R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
– DDC6 DDC5 DDC4 DDC3 DDC2 DDC1 DDC0 DDRC
读/写 R R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
端口 C 输入引脚地址- PINC
端口 D 数据寄存器- PORTD
端口 D 数据方向寄存器- DDRD
端口 D 输入引脚地址- PIND
B i t 76543210
– PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC0 PINC
读/写 RRRRRRRR
初始值 0 N/A N/A N/A N/A N/A N/A N/A
B i t 76543210
PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0 PORTD
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
DDD7 DDD6 DDD5 DDD4 DDD3 DDD2 DDD1 DDD0 DDRD
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0 PIND
读/写 RRRRRRRR
初始值 N/A N/A N/A N/A N/A N/A N/A N/A
2486N–AVR–07/04
61
Page 62
外部中断 外部中断通过引脚 INT0 、 INT1 触发。只要使能了中断,即使引脚 INT0..1 配置为输出,
只要电平发生了合适的变化,中断也会触发。这个特点可以用来产生软件中断。通过设置
MCU 控制寄存器 MCUCR ,中断可以由下降沿、上升沿,或者是低电平触发。当外部中断
使能并且配置为电平触发 ( INT0/INT1) ,只要引脚电平为低,中断就会产生。若要求 INT0
与 INT1 在信号下降沿或上升沿触发,I/O 时钟必须工作,如 P 22“ 时钟系统及其分布 ” 说
明的那样。INT0/INT1 的低电平中断检测是异步的。也就是说,这些中断可以用来将器件
从睡眠模式唤醒。在睡眠过程 ( 除了空闲模式 ) 中 I/O 时钟是停止的。
通过电平方式触发中断,从而将 MCU 从掉电模式唤醒时,要保证电平保持一定的时间,
以降低 MCU 对噪声的敏感程度。电平以看门狗的频率检测两次。在 5.0V 、 25 °C 的条件
下,看门狗的标称时钟周期为 1 µs 。看门狗时钟受电压的影响,具体请参考 P 226“ 电气
特性 ” 。只要在采样过程中出现了合适的电平,或是信号持续到启动过程的末尾, MCU
就会唤醒。启动过程由熔丝位 SUT 决定,如 P 22“ 系统时钟及时钟选项 ” 所示。若信号
出现于两次采样过程,但在启动过程结束之前就消失了, MCU 仍将唤醒,但不再会引发
中断了。要求的电平必须保持足够长的时间以使MCU 结束唤醒过程,然后触发电平中断。
MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用 MCU 功能。
B i t 76543210
SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00 MCUCR
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bit 3, 2 – ISC11, ISC10: 中断触发方式控制 1 Bit1 与 Bit 0
如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话,外部中断 1 由引脚 INT1 激
发。触发方式如 Table 31 所示。在检测边沿前 MCU 首先采样 INT1 引脚上的电平。如果
选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触
发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保
持到当前指令执行完成。
Table 31. 中断 1 触发方式控制
ISC11 ISC10 说明
00 I N T 1 为低电平时产生中断请求
01 I N T 1引脚上任意的逻辑电平变化都将引发中断
10 I N T 1的下降沿产生中断请求
11 I N T 1 的上升沿产生中断请求
62
ATmega8(L)
2486N–AVR–07/04
Page 63
ATmega8(L)
• Bit 1, 0 – ISC01, ISC00: 中断 0 触发方式控制 Bit 1 与 Bit 0
如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。触发方式如 Table 32 所示,
外部中断 0 由引脚 INT0 激发。在检测边沿前 MCU 首先采样 INT0 引脚上的电平。如果选
择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发
中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保持
到当前指令执行完成。
Table 32. 中断 0 触发方式控制
ISC01 ISC00 说明
00 I N T 0 为低电平时产生中断请求
01 I N T 0引脚上任意的逻辑电平变化都将引发中断
10 I N T 0的下降沿产生中断请求
11 I N T 0 的上升沿产生中断请求
通用中断控制寄存器- GICR
B i t 76543210
INT1 INT0
读/写 R / WR / WRRRRR / WR / W
初始值 00000000
– – – – IVSEL IVCE GICR
• Bit 7 – INT1: 外部中断请求 1 使能
当 INT1 为 '1’,而且状态寄存器 SREG 的 I 标志置位,相应的外部引脚中断就使能了。
MCU通用控制寄存器 – MCUCR的中断敏感电平控制 1位 1/0 (ISC11与 ISC10)决定中断是
由上升沿、下降沿,还是 INT1 电平触发的。只要使能,即使 INT1 引脚被配置为输出,
只要引脚电平发生了相应的变化,中断将产生。
• Bit 6 – INT0: 外部中断请求 0 使能
当 INT0 为 '1’ ,而且状态寄存器 SREG 的 I 标志置位,相应的外部引脚中断就使能了。
MCU 通用控制寄存器– MCUCR 的中断敏感电平控制0 位 1/0 (ISC01 与ISC00) 决定中断是
由上升沿、下降沿,还是 INT0 电平触发的。只要使能,即使 INT0 引脚被配置为输出,
只要引脚电平发生了相应的变化,中断将产生。
2486N–AVR–07/04
63
Page 64
通用中断标志寄存器- GIFR
B i t 76543210
INTF1 INTF0
读/写 R / WR / WRRRRRR
初始值 00000000
– – – – – –G I F R
• Bit 7 – INTF1: 外部中断标志 1
INT1 引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。如 果 SREG 的位
I以及 GICR寄存器相应的中断使能位 INT1 为 ”1”,MCU 即跳转到相应的中断向量。进入中
断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”1” 来清零。
• Bit 6 – INTF0: 外部中断标志 0
INT0 引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF0。如 果 SREG 的位
I以及 GICR寄存器相应的中断使能位 INT0 为 ”1”,MCU 即跳转到相应的中断向量。进入中
断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”1” 来清零。当 INT0 配
置为电平中断时,该标志会被清零。
64
ATmega8(L)
2486N–AVR–07/04
Page 65
ATmega8(L)
8 位定时器 / 计时器 0 T/C0 是一个通用的单通道 8 位定时器 / 计数器模块。其主要特点如下:
单通道计数器
•
• 频率发生器
• 外部事件计数器
• 10 位的时钟预分频器
综述 Figure 26 为8 位定时器/ 计数器的简化框图。实际引脚排列请参考P 2“ 引脚配置” 。CPU 可
以访问的 I/O 寄存器,包括位和引脚,以粗体显示。I/O 寄存器和位的位置列于 P 68“ 8位
定时器 / 计数器寄存器的说明 ” 。
Figure 26. 8 位 T/C 方框图
TCCRn
TOVn
count
Control Logic
clk
Tn
Clock Select
Edge
Detector
(Int.Req.)
Tn
DATA BUS
Timer/Counter
TCNTn
( From Prescaler )
= 0xFF
寄存器 T/C(TCNT0) 和输出比较寄存器(OCR0) 为 8 位寄存器。中断请求( 图中简写为 Int.Req. ) 信
号在定时器中断标志寄存器 TIFR 都有反映。 所有中断都可以通过定时器中断屏蔽寄存器
TIMSK 单独进行屏蔽。由于 TIFR 和 TIMSK 寄存器是与其他定时器单元共享,因此图中没
有给出。
T/C 可以通过预分频器由内部时钟源驱动,或者是通过T0 引脚的外部时钟源来驱动。时钟
选择逻辑模块控制使用哪一个时钟源与什么边沿来增加 ( 或降低 )T/C 的数值。如果没有
选择时钟源 T/C 就不工作。时钟选择模块的输出定义为定时器时钟 clk
定义 本文的许多寄存器及其各个位以通用的格式表示。小写的 “n” 取代了 T/C 的序号,在此即
为 0 。但是在写程序时要使用精确的格式,例如使用 TCNT0 来访问 T/C0 计数器值,等等。
Table 33 的定义适用于全文。
Table 33. 定义
BOTTOM 计数器计到 0x00 时即达到 BOTTOM。
MAX 计数器计到 0xFF ( 十进制的 255) 时即达到 MAX。
T0
。
T/C 的时钟源 T/C 可以由内部同步时钟或外部异步时钟驱动。时钟源是由时钟选择逻辑决定的,而时钟
选择逻辑是由位于 T/C 控制寄存器 TCCR0 的时钟选择位 CS02:0 控制的。P 70“ T/C0 与
T/C1 的预分频器 ” 对时钟源与预分频有详尽的描述。
计数器单元 8 位 T/C 的主要部分为可编程的双向计数单元。Figure 27 即为计数器和周边电路的框图。
65
2486N–AVR–07/04
Page 66
Figure 27. 计数器单元方框图
DATA BUS
TCNTn Control Logic
count
TOVn
(Int. Req.)
clk
Tn
Clock Select
Edge
Detector
Tn
max
( From Prescaler )
信号说明 ( 内部信号 ):
count 使 TCNT0 加 1 。
clk
Tn
T/C 的时钟, clk T0 。
max 表示 TCNT0 已经达到了最大值。
计数器针对每一个 clk
实现加一操作。clk T0 可以由内部或外部时钟源产生,具体由时钟
T0
选择位 CS02:0 确定。没有选择时钟源时 (CS02:0 = 0) 定时器即停止。但是不管有没有
clk
, CPU 都可以访问 TCNT0 。CPU 写操作比计数器其他操作 ( 如清零、加减操作 ) 的优
T0
先级高。
操作 计数方向始终向上 ( 增加 ), 且没有计数器清除操作。当计数器值超过最大 8 位值 (MAX
= 0xFF) 时,重新由 0x00 开始计数。在正常工作时,当 TCNT0 变为 "0” 时, T/C 溢出标志
(TOV0) 置位。此时 TOV0 象第九位,只会置位,不会清零。TOV0 标志可用定时器溢出中
断清零,同时定时器的分辨率可通过软件提高。可随时写入新的计数器值。
66
ATmega8(L)
2486N–AVR–07/04
Page 67
ATmega8(L)
T/C 时序图 T/C 是同步电路,因此其时钟 clk
中断标志设置的时间。 Figure 28 给出了基本的 T/C 工作时序,以及接近 MAX 时的记数
序列。
Figure 28. T/C 时序图,无预分频器
clk
I/O
clk
Tn
(clk
/1)
I/O
CNTn
TOVn
Figure 29 所示为相同的计时数据,但有预分频。
Figure 29. T/C 时序图,预分频器为 f
MAX - 1 MAX BOTTOM BOTTOM + 1
可以表示为时钟使能信号,如下图所示。图中还说明了
T0
/8
clk_I/O
clk
I/O
clk
Tn
(clk
/8)
I/O
CNTn MAX - 1 MAX BOTTOM BOTTOM +
TOVn
67
2486N–AVR–07/04
Page 68
8 位定时器 / 计数器寄存器
的说明
T/C 控制寄存器- TCCR0
B i t 76543210
– – – – – CS02 CS01 CS00 TCCR0
读/写 RRRRRR / WR / WR / W
初始值 00000000
• Bit 2:0 – CS02:0: 时钟选择
用于选择 T/C 的时钟源。
Table 34. 时钟选择位说明
CS02 CS01 CS00 说明
000 无时钟, T/C 不工作
T/C 寄存器- TCNT0
T/C 中断屏蔽寄存器- TIMSK
001 c l k
010 c l k
011 c l k
100 c l k
101 c l k
/1 ( 没有预分频 )
I/O
/8 ( 来自预分频器 )
I/O
/64 ( 来自预分频器 )
I/O
/256 ( 来自预分频器 )
I/O
/1024 ( 来自预分频器 )
I/O
110时钟由 T0 引脚输入,下降沿触发
111时钟由 T0 引脚输入,上升沿触发
如果 T/C0 使用外部时钟,即使 T0 被配置为输出,其上的电平变化仍然会驱动记数器。
利用这一特性可通过软件控制记数。
B i t 76543210
TCNT0[7:0] TCNT0
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
通过 T/C 寄存器可以直接对计数器的 8 位数据进行读写访问。
B i t 76543210
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 – TOIE0 TIMSK
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
68
• Bit 0 – TOIE0: T/C0 溢出中断使能
当 TOIE0 和状态寄存器的全局中断使能位 I 都为 ”1” 时,T/C0 的溢出中断使能。当 T/C0
发生溢出,即 TIFR 中的 TOV0 位置位时,中断服务程序得以执行。
ATmega8(L)
2486N–AVR–07/04
Page 69
ATmega8(L)
T/C 中断标志寄存器- TIFR
B i t 76543210
OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 – TOV0 TIFR
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bit 0 – TOV0:T/C0 溢出标志
当 T/C0 溢出时, TOV0 置位。执行相应的中断服务程序时此位硬件清零。此外, TOV0
也可以通过写 1 来清零。当 SREG 中的位 I、 TOIE0(T/C0 溢出中断使能 ) 和 TOV0 都置
位时,执行中断服务程序。
2486N–AVR–07/04
69
Page 70
T/C0 与 T/C1 的预分频
器
T/C1 与 T/C0 共用一个预分频模块,但它们可以有不同的分频设置。下述内容适用于 T/C1
与 T/C0 。
内部时钟源 当 CSn2:0 = 1 时,系统内部时钟直接作为 T/C 的时钟源,这也是 T/C 最高频率的时钟源
f
,与系统时钟频率相同。预分频器可以输出 4 个不同的时钟信号 f
CLK_I/O
f
CLK_I/O
/64、 f
CLK_I/O
/256 或 f
CLK_I/O
/1024。
CLK_I/O
/8、
分频器复位 预分频器是独立运行的。也就是说,其操作独立于 T/C 的时钟选择逻辑,且它由 T/C1 与
T/C0 共享。由于预分频器不受 T/C 时钟选择的影响,预分频器的状态需要包含预分频时钟
被用到何处这样的信息。一个典型的例子发生在定时器使能并由预分频器驱动 (6 >
CSn2:0 > 1)的时候:从计时器使能到第一次开始计数可能花费 1 到N+1 个系统时钟周期,
其中 N 等于预分频因子 (8 、 64 、 256 或 1024) 。
通过复位预分频器来同步 T/C 与程序运行是可能的。但是必须注意另一个 T/C 是否也在
使用这一预分频器,因为预分频器复位将会影响所有与其连接的 T/C 。
外部时钟源 由 T1/T0 引脚提供的外部时钟源可以用作 T/C 时钟 clk
时钟周期对引脚 T1/T0 进行采样。然后将同步 ( 采样 ) 信号送到边沿检测器。 Figure 30 给
出了 T1/T0 同步采样与边沿检测逻辑的功能等效方框图。寄存器由内部系统时钟
上跳沿驱动。当内部时钟为高时,锁存器可以看作时透明的。
CSn2:0 = 7 时边沿检测器检测到一个正跳变产生一个clk
变就产生一个 clk
脉冲。
0
T
Figure 30. T1/T0 引脚采样
Tn
clk
LE
I/O
DQ DQ
由于引脚上同步与边沿监测电路的存在,引脚 T1/T0 上的电平变化需要延时 2.5 到 3.5 个
系统时钟周期才能使计数器进行更新。
禁止或使能时钟输入必须在 T1/T0 保持稳定至少一个系统时钟周期后才能进行,否则有产
生错误 T/C 时钟脉冲的危险。
为保证正确的采样,外部时钟脉冲宽度必须大于一个系统时钟周期。在占空比为 50% 时
外部时钟频率必须小于系统时钟频率的一半 (f
ExtClk
< f
采样这一方法,它能检测到的外部时钟最多是其采样频率的一半 (Nyquist 采样定理 )。然
而,由于振荡器 ( 晶体、谐振器与电容 ) 本身误差带来的系统时钟频率及占空比的差异,
建议外部时钟的最高频率不要大于 f
clk_I/O
/2.5。
外部时钟源不送入预分频器。
/clkT0。引脚同步逻辑在每个系统
T1
脉冲; CSn2:0 = 6 时一个负跳
T1
DQ
Edge Detector Synchronization
/2)。由于边沿检测器使用的是
clk_I/O
Tn_sync
(To Clock
Select Logic)
clk
I/O
的
70
ATmega8(L)
2486N–AVR–07/04
Page 71
ATmega8(L)
特殊功能 IO 寄存器- SFIOR
Figure 31. T/C0 与 T/C1 预分频器
clk
I/O
SR10
T0
Synchronization
T1
Synchronization
(1)
clk
Clear
T1
clk
T0
Note: 1. 输入引脚 (T1/T0) 的同步逻辑见 Figure 30。
Bit 7 6 5 4 3 2 1 0
– – – – ACME PUD PSR2 PSR10 SFIOR
读/写 R R R R R/W R/W R/W R/W
初始值 000 00000
• Bit 0 – PSR10:T/C1 与 T/C0 预分频器复位
置位时 T/C1 与 T/C0 的预分频器复位。操作完成后这一位由硬件自动清零。写入零时无
效。 T/C1 与 T/C0 共用同一预分频器,且预分频器复位对两个定时器均有影响。该位总
是读为 0。
2486N–AVR–07/04
71
Page 72
16 位定时器 / 计数器 1 16位的 T/C 可以实现精确的程序定时 ( 事件管理)、波形产生和信号测量。其主要特点如下
真正的 16 位设计 ( 即允许 16 位的 PWM)
•
• 2 个独立的输出比较单元
• 双缓冲的输出比较寄存器
• 一个输入捕捉单元
• 输入捕捉噪声抑制器
• 比较匹配发生时清除寄存器 ( 自动重载 )
• 无干扰脉冲,相位正确的 PWM
• 可变的 PWM 周期
• 频率发生器
• 外部事件计数器
• 4 个独立的中断源 (TOV1、 OCF1A、 OCF1B 与 ICF1)
综述 本节大多数的寄存器和位定义以通用的方式表示。小写 “n” 表示 T/C 序号,小写 “x” 表示
输出比较通道号。但是在写程序时要用完整的、精确的名称。如用 TCNT1 表示访问 T/C1
计数器值等。
16 位T/C 的简化框图示于 Figure 32 。I/O 引脚的实际位置请参见 P 2“ 引脚配置 ” 。 CPU 可
访问的 I/O 寄存器,包括 I/O 位和 I/O 引脚以粗体表示。器件具体 I/O 寄存器与位定位见
P 89“ 16 位定时器 / 计数器寄存器的说明 ” 。
Figure 32. 16 位 T/C 框图
Timer/Counter
TCNTn
=
OCRnA
=
DATA BUS
OCRnB
ICRn
(1)
Count
Clear
Direction
Control Logic
TOP BOTTOM
=
clk
Fixed
TOP
Values
ICFn (Int.Req.)
Detector
Tn
=
Edge
TOVn
(Int. Req.)
Clock Select
Edge
Detector
( From Prescaler )
Tn
0
OCFnA
(Int. Req.)
Waveform
Generation
OCFnB
(Int.Req.)
Waveform
Generation
Noise
Canceler
( From Analog
Comparator Ouput )
OCnA
OCnB
ICPn
72
TCCRnA TCCRnB
Note: 1. 请参考 P 2“ 引脚配置 ” , P 55Table 22 及 P 59Table 28 T/C1 中的引脚定义。
ATmega8(L)
2486N–AVR–07/04
Page 73
ATmega8(L)
寄存器 定时器 / 计数器 TCNT1 、输出比较寄存器 OCR1A/B 与输入捕捉寄存器 ICR1 均为 16 位
寄存器。访问 16 位寄存器必须通过特殊的步骤,详见 P 74“ 访问 16 位寄存器 ” 。T/C 控
制寄存器 TCCR1A/B 为 8 位寄存器,没有 CPU 访问的限制。中断请求 ( 图中简写为
Int.Req.) 信号在中断标志寄存器 TIFR 都有反映。所有中断都可以由中断屏蔽寄存器
TIMSK 单独控制。图中未给出 TIFR 与 TIMSK。
T/C可由内部时钟通过预分频器或通过由 T1引脚输入的外部时钟驱动。引发T/C数值增加(
或减少 ) 的时钟源及其有效沿由时钟选择逻辑模块控制。没有选择时钟源时 T/C 处于停止
状态。时钟选择逻辑模块的输出称为 clk
双缓冲输出比较寄存器 OCR1A/B 一直与 T/C 的值做比较。波形发生器用比较结果产生
PWM 或在输出比较引脚OC1A/B 输出可变频率的信号。参见 P 79 “ 输出比较单元 ” 。比 较
匹配结果还可置位比较匹配标志 OCF1A/B,用来产生输出比较中断请求。
当输入捕捉引脚 ICP1 或模拟比较器输入引脚 ( 见 P 180 “ 模拟比较器 ” ) 有输入捕捉事件
产生 ( 边沿触发 ) 时,当时的 T/C 值被传输到输入捕捉寄存器保存起来。输入捕捉单元包
括一个数字滤波单元 ( 噪声消除器 ) 以降低噪声干扰。
在某些操作模式下, TOP 值或 T/C 的最大值可由 OCR1A 寄存器、 ICR1 寄存器,或一
些固定数据来定义。在 PWM 模式下用 OCR1A 作为 TOP 值时, OCR1A 寄存器不能用
作 PWM 输出。但此时 OCR1A 是双向缓冲的, TOP 值可在运行过程中得到改变。当需
要一个固定的 TOP 值时可以使用 ICR1 寄存器,从而释放 OCR1A 来用作 PWM 的输出。
。
1
T
定义 以下定义适用于本节:
Table 35. 定义
BOTTOM
MAX
TOP
计数器计到 0x0000 时即达到 BOTTOM
计数器计到 0xFFFF ( 十进制的 65535) 时即达到 MAX
计数器计到计数序列的最大值时即达到 TOP 。 TOP 值可以为固定值 0x00FF 、
0x01FF 或 0x03FF ,或是存储于寄存器 OCR1A 或 ICR1 里的数值,具体有赖于工作
模式
兼容性 16位T/C 是从以前版本的16 位AVRT/C 改进和升级得来的。它在如下方面与以前的版本完
全兼容:
• 包括定时器中断寄存器在内的所有 16 位 T/C 相关的 I/O 寄存器的地址。
• 包括定时器中断寄存器在内的所有 16 位 T/C 相关的寄存器位定位。
• 中断向量。
下列控制位名称已改,但具有相同的功能与寄存器单元:
•P W M 1 0改为 WGM10。
• PWM11 改为 WGM11。
•C T C 1改为 WGM12。
16 位 T/C 控制寄存器中添加了下列位:
• TCCR1A 中加入 FOC1A 与 FOC1B。
• TCCR1B 中加入 WGM13。
2486N–AVR–07/04
16 位 T/C 的一些改进在某些特殊情况下将影响兼容性。
73
Page 74
访问 16 位寄存器 TCNT1、OCR1A/B 与ICR1 是 AVR CPU 通过 8 位数据总线可以访问的 16 位寄存器。读写
16位寄存器需要两次操作。每个 16位计时器都有一个8位临时寄存器用来存放其高8位数
据。每个 16 位定时器所属的 16 位寄存器共用相同的临时寄存器。访问低字节会触发 16
位读或写操作。当 CPU 写入数据到 16 位寄存器的低字节时,写入的 8 位数据与存放在
临时寄存器中的高 8 位数据组成一个 16 位数据,同步写入到 16 位寄存器中。当 CPU 读
取 16 位寄存器的低字节时,高字节内容在读低字节操作的同时被放置于临时辅助寄存器
中。
并非所有的 16 位访问都涉及临时寄存器。对 OCR1A/B 寄存器的读操作就不涉及临时寄
存器。
写 16 位寄存器时,应先写入该寄存器的高位字节。而读 16 位寄存器时应先读取该寄存
器的低位字节。
下面的例程说明了如何访问 16 位定时器寄存器。前提是假设不会发生更新临时寄存器内
容的中断。同样的原则也适用于对 OCR1A/B 与 ICR1 寄存器的访问。使用 “C” 语言时,
编译器会自动处理 16 位操作。
汇编代码例程
...
;
ldi r17,0x01
ldi r16,0xFF
out TCNT1H,r17
out TCNT1L,r16
; 将 TCNT1 读入 r17:r16
in r16,TCNT1L
in r17,TCNT1H
...
C 代码例程
unsigned int i;
...
/*
TCNT1 = 0x1FF;
/* 将 TCNT1
i = TCNT1;
...
(1)
设置
TCNT1 为0x01FF
(1)
设置
TCNT1 为0x01FF */
读入
i */
74
Note: 1. 本代码假定已经包含了合适的头文件。
汇编代码例程中 TCNT1 的返回值在 r17:r16 寄存器对中。
注意到 16 位寄存器的访问是一个基本操作是非常重要的。在对 16 位寄存器操作时,最
好首先屏蔽中断响应,防止在主程序读写 16 位寄存器的两条指令之间发生这样的中断:
它也访问同样的寄存器或其他的 16 位寄存器,从而更改了临时寄存器。如果这种情况发
生,那么中断返回后临时寄存器中的内容已经改变,造成主程序对 16 位寄存器的读写错
误。
ATmega8(L)
2486N–AVR–07/04
Page 75
ATmega8(L)
下面的例程给出了读取 TCNT1 寄存器内容的基本操作。对 OCR1A/B 或 ICR1 的读操作
可以使用相同的方法。
汇编代码例程
TIM16_ReadTCNT1:
;
in r18,SREG
;
cli
;
in r16,TCNT1L
in r17,TCNT1H
;
out SREG,r18
ret
C 代码例程
unsigned int TIM16_ReadTCNT1( void )
{
unsigned char sreg;
unsigned int i;
/*
sreg = SREG;
/*
_CLI();
/*
i = TCNT1;
/*
SREG = sreg;
return i;
}
(1)
保存全局中断标志
禁用中断
将
TCNT1 读入r17:r16
恢复全局中断标志
(1)
保存全局中断标志
禁用中断
将
恢复全局中断标志
TCNT1
*/
读入
i */
*/
*/
2486N–AVR–07/04
Note: 1. 本代码假定已经包含了合适的头文件。
汇编代码例程中 TCNT1 的返回值在 r17:r16 寄存器对中。
75
Page 76
下面的例程给出了写 TCNT1 寄存器的基本操作。对 OCR1A/B 或 ICR1 的写操作可以使
用相同的方法。
汇编代码例程
TIM16_WriteTCNT1:
; 保存全局中断标志
in r18,SREG
;
cli
;
out TCNT1H,r17
out TCNT1L,r16
;
out SREG,r18
ret
C 代码例程
void TIM16_WriteTCNT1 ( unsigned int i )
{
unsigned char sreg;
unsigned int i;
/*
sreg = SREG;
/*
_CLI();
/*
TCNT1 = i;
/*
SREG = sreg;
}
(1)
禁用中断
设置
TCNT1 到r17:r16
恢复全局中断标志
(1)
保存全局中断标志
禁用中断
设置
恢复全局中断标志
*/
TCNT1 到i */
*/
*/
Note: 1. 本代码假定已经包含了合适的头文件。
汇编代码例程中 r17:r16 寄存器对保存的是 TCNT1 的写入数据。
临时高字节寄存器的重用 如果对不只一个 16 位寄存器写入数据而且所有的寄存器高字节相同,则只需写一次高字
节。前面讲到的基本操作在这种情况下同样适用。
76
ATmega8(L)
2486N–AVR–07/04
Page 77
ATmega8(L)
T/C 时钟源 T/C 时钟源可以来自内部,也可来自外部,由位于 T/C 控制寄存器B(TCCR1B ) 的时钟选择
位 (CS12:0) 决定。时钟源与预分频器的描述见 P 70“ T/C0 与 T/C1 的预分频器 ” 。
计数器单元 16 位 T/C 的主要部分是可编程的 16 位双向计数器单元。Figure 33 给出了计数器与其外围
电路方框图。
Figure 33. 计数器单元方框图
DATA BUS
TEMP (8-bit)
TCNTnH (8-bit) TCNTnL (8-bit)
TCNTn (16-bit Counter)
(8-bit)
count
clear
direction
Control Logic
TOP BOTTOM
TOVn
(Int. Req.)
clk
Tn
Clock Select
Edge
Detector
( From Prescaler )
Tn
信号描述 ( 内部信号 ):
Count TCNT1 加 1 或减 1 。
Direction 确定是加操作还是减操作。
Clear TCNT1 清零。
clk
1
T
定时器 / 计数器时钟信号。
TOP 表示 TCNT1 计数器到达最大值。
BOTTOM 表示 TCNT1 计数器到达最小值 (0 )。
16 位计数器映射到两个8 位I/O 存储器位置:TCNT1H 为高 8 位, TCNT1L 为低 8 位。 CPU
只能间接访问 TCNT1H 寄存器。 CPU 访问 TCNT1H 时,实际访问的是临时寄存器
(TEMP) 。读 取 TCNT1L 时,临时寄存器的内容更新为TCNT1H 的数值;而对 TCNT1L 执行
写操作时,TCNT1H 被临时寄存器的内容所更新。这就使 CPU 可以在一个时钟周期里通
过 8 位数据总线完成对 16 位计数器的读、写操作。此外还需要注意计数器在运行时的一
些特殊情况。在这些特殊情况下对 TCNT1 写入数据会带来未知的结果。在合适的章节会
对这些特殊情况进行具体描述。
根据工作模式的不同,在每一个 clk
clk
由时钟选择位 CS12:0 设定。当 CS12:0= 0 时,计数器停止计数。不过 CPU 对 TCNT1
1
T
的读取与 clk
是否存在无关。 CPU 写操作比计数器清零和其他操作的优先级都高。
1
T
时钟到来时,计数器进行清零、加 1 或减 1 操作。
1
T
计数器的计数序列取决于寄存器 TCCR1A 和 TCCR1B 中标志位 WGM13:0 的设置。计数
器的运行 ( 计数 ) 方式与通过 OC1x 输出的波形发生方式有很紧密的关系。计数序列与波
形产生的详细描述请参见 P 82“ 工作模式 ” 。
通过 WGM13:0 确定了计数器的工作模式之后,TOV1 的置位方式也就确定了。TOV1 可
以用来产生 CPU 中断。
输入捕捉单元 T/C 的输入捕捉单元可用来捕获外部事件,并为其赋予时间标记以说明此时间的发生时
刻。外部事件发生的触发信号由引脚 ICP1 输入,也可通过模拟比较器单元来实现。时间
标记可用来计算频率、占空比及信号的其它特征,以及为事件创建日志。
77
2486N–AVR–07/04
Page 78
输入捕捉单元方框图见 Figure 34 。图中不直接属于输入捕捉单元的部分用阴影表示。寄
存器与位中的小写 “n” 表示定时器 / 计数器编号。
Figure 34. 输入捕捉单元方框图
ICPn
WRITE
TEMP (8-bit)
ICRnH (8-bit)
ICRn (16-bit Register)
ACO*
Analog
Comparator
DATA BUS
ICRnL (8-bit)
ACIC* ICNC ICES
Canceler
Noise
(8-bit)
TCNTnH (8-bit) TCNTnL (8-bit)
TCNTn (16-bit Counter)
Edge
Detector
ICFn (Int. Req.)
当引脚 ICP1 上的逻辑电平 ( 事件 ) 发生了变化,或模拟比较器输出 ACO 电平发生了变
化,并且这个电平变化为边沿检测器所证实,输入捕捉即被激发:16 位的 TCNT1 数据被
拷贝到输入捕捉寄存器 ICR1 ,同时输入捕捉标志位 ICF1 置位。如果此时 ICIE1 = 1 ,输
入捕捉标志将产生输入捕捉中断。中断执行时 ICF1 自动清零,或者也可通过软件在其对
应的 I/O 位置写入逻辑 "1” 清零。
读取 ICR1 时要先读低字节 ICR1L ,然后再读高字节 ICR1H 。读低字节时,高字节被复制
到高字节临时寄存器 TEMP 。 CPU 读取 ICR1H 时将访问 TEMP 寄存器。
对 ICR1 寄存器的写访问只存在于波形产生模式。此时 ICR1 被用作计数器的 TOP 值。写
ICR1 之前首先要设置 WGM13:0 以允许这个操作。对 ICR1 寄存器进行写操作时必须先将
高字节写入 ICR1H I/O 位置,然后再将低字节写入 ICR1L。
请参见 P 74“ 访问 16 位寄存器 ” 以了解更多的关于如何访问 16 位寄存器的信息。
输入捕捉触发源 输入捕捉单元的主要触发源是 ICP1 。T/C1 还可用模拟比较输出作为输入捕捉单元的触发
源。用户必须通过设置模拟比较控制与状态寄存器 ACSR 的模拟比较输入捕捉位 ACIC 来
做到这一点。要注意的是,改变触发源有可能造成一次输入捕捉。因此在改变触发源后必
须对输入捕捉标志执行一次清零操作以避免出现错误的结果。
ICP1 与ACO 的采样方式与 T1 引脚是相同的 (P 70Figure 30 ) , 使用的边沿检测器也一样。
但是使能噪声抑制器后,在边沿检测器前会加入额外的逻辑电路并引入 4 个系统时钟周期
的延迟。要注意的是,除去使用 ICR1 定义 TOP 的波形产生模式外, T/C 中的噪声抑制
器与边沿检测器总是使能的。
输入捕捉也可以通过软件控制引脚 ICP1 的方式来触发。
噪声抑制器 噪声抑制器通过一个简单的数字滤波方案提高系统抗噪性。它对输入触发信号进行 4 次采
样。只有当 4 次采样值相等时其输出才会送入边沿检测器。
78
ATmega8(L)
2486N–AVR–07/04
Page 79
ATmega8(L)
置位 TCCR1B 的 ICNC1 将使能噪声抑制器。使能噪声抑制器后,在输入发生变化到 ICR1
得到更新之间将会有额外的 4 个系统时钟周期的延时。噪声抑制器使用的是系统时钟,因
而不受预分频器的影响。
输入捕捉单元的使用 使用输入捕捉单元的最大问题就是分配足够的处理器资源来处理输入事件。事件的时间
间隔是关键。如果处理器在下一次事件出现之前没有读取 ICR1 的数据, ICR1 就会被新
值覆盖,从而无法得到正确的捕捉结果。
使用输入捕捉中断时,中断程序应尽可能早的读取 ICR1 寄存器。尽管输入捕捉中断优先
级相对较高,但最大中断响应时间与其它正在运行的中断程序所需的时间相关。
在任何输入捕捉工作模式下都不推荐在操作过程中改变 TOP 值。
测量外部信号的占空比时要求每次捕捉后都要改变触发沿。因此读取 ICR1 后必须尽快改
变敏感的信号边沿。改变边沿后,ICF1 必须由软件清零 ( 在对应的 I/O 位置写 "1” )。若仅
需测量频率,且使用了中断发生,则不需对 ICF1 进行软件清零。
输出比较单元 16 位比较器持续比较TCNT1 与 OCR1x 的内容,一旦发现它们相等,比较器立即产生一个
匹配信号。然后 OCF1x 在下一个定时器时钟置位。如果此时 OCIE1x = 1 , OCF1x 置位
将引发输出比较中断。中断执行时 OCF1x 标志自动清零,或者通过软件在其相应的 I/O
位置写入逻辑 "1” 也可以清零。根据 WGM13:0 与 COM1x1:0 的不同设置,波形发生器用
匹配信号生成不同的波形。波形发生器利用 TOP 和 BOTTOM 信号处理在某些模式下对
极值的操作 (P 82 “ 工作模式 ” ) 。
输出比较单元 A 的一个特质是定义 T/C 的 TOP 值 ( 即计数器的分辨率 )。此外, TOP 值
还用来定义通过波形发生器产生的波形的周期。
Figure 35 给出输出比较单元的方框图。寄存器与位上的小写 “n” 表示器件编号 (n = 1
表示
T/C1), “x” 表示输出比较单元 (A/B)。框图中非输出比较单元部分用阴影表示。
Figure 35. 输出比较单元方框图
DATA BUS
TEMP (8-bit)
OCRnxH Buf. (8-bit)
OCRnx Buffer (16-bit Register)
OCRnxH (8-bit) OCRnxL (8-bit)
OCRnx (16-bit Register)
OCRnxL Buf. (8-bit)
=
(8-bit)
TCNTnH (8-bit) TCNTnL (8-bit)
TCNTn (16-bit Counter)
(16-bit Comparator )
OCFnx (Int.Req.)
2486N–AVR–07/04
TOP
BOTTOM
Waveform Generator
COMnx1:0 WGMn3:0
OCnx
79
Page 80
当 T/C 工作在 12 种 PWM 模式种的任意一种时, OCR1x 寄存器为双缓冲寄存器;而在
正常工作模式和匹配时清零模式 (CTC ) 双缓冲功能是禁止的。双缓冲可以实现 OCR1x 寄
存器对 TOP 或 BOTTOM 的同步更新,防止产生不对称的 PWM 波形,消除毛刺。
访问 OCR1x 寄存器看起来很复杂,其实不然。使能双缓冲功能时,CPU 访问的是 OCR1x
缓冲寄存器;禁止双缓冲功能时 CPU 访问的则是 OCR1x 本身。 OCR1x ( 缓冲或比较 )
寄存器的内容只有写操作才能将其改变 (T/C 不会自动将此寄存器更新为 TCNT1 或 ICR1
的内容 ),所以 OCR1x 不用通过 TEMP 读取。但是象其他 16 位寄存器一样首先读取低
字节是一个好习惯。由于比较是连续进行的,因此在写 OCR1x 时必须通过 TEMP 寄存器
来实现。首先需要写入的是高字节 OCR1xH 。当 CPU 将数据写入高字节的 I/O 地址时,
TEMP 寄存器的内容即得到更新。接下来写低字节 OCR1xL 。在此同时,位于 TEMP 寄存
器的高字节数据被拷贝到 OCR1x 缓冲器,或是 OCR1x 比较寄存器。
请参见 P 74“ 访问 16 位寄存器 ” 以了解更多的关于如何访问 16 位寄存器的信息。
强制输出比较 工作于非 PWM 模式时,可以通过对强制输出比较位 FOC1x 写 ”1” 的方式来产生比较匹
配。强制比较匹配不会置位 OCF1x 标志,也不会重载 / 清零定时器,但是 OC1x 引脚将
被更新,好象真的发生了比较匹配一样 (COMx1:0 决定 OC1x 是置位、清零,还是交替变
化 )。
写 TCNT1 操作阻止比较匹配 CPU对 TCNT1 寄存器的写操作会阻止比较匹配的发生。这个特性可以用来将OCR1x 初始
化为与 TCNT1 相同的数值而不触发中断。
使用输出比较单元 由于在任意模式下写 TCNT1 都将在下一个定时器时钟周期里阻止比较匹配,在使用输出
比较时改变TCNT1 就会有风险,不管T/C 是否在运行。若写入TCNT1 的数值等于OCR1x ,
比较匹配就被忽略了,造成不正确的波形发生结果。在 PWM 模式下,当 TOP 为可变数
值时,不要赋予 TCNT1 和 TOP 相等的数值。否则会丢失一次比较匹配,计数器也将计
到0xFFFF 。类似地,在计数器进行降序计数时不要对TCNT1 写入等于BOTTOM 的数据。
OC1x 的设置应该在设置数据方向寄存器之前完成。最简单的设置 OC1x 的方法是在普通
模式下利用强制输出比较 FOC1x 。即使在改变波形发生模式时 OC1x 寄存器也会一直保
持它的数值。
COM1x1:0 和比较数据都不是双缓冲的。 COM1x1:0 的改变将立即生效。
80
ATmega8(L)
2486N–AVR–07/04
Page 81
ATmega8(L)
比较匹配输出单元 比较匹配模式控制位 COM1x1:0 具有双重功能。波形发生器利用 COM1x1:0 来确定下一
次比较匹配发生时的输出比较 OC1x 状态; COM1x1:0 还控制 OC1x 引脚输出的来源。
Figure 36 为受COM1x1:0 设置影响的逻辑的简化原理图。 I/O 寄存器、I/O 位和 I/O 引脚以
粗体表示。图中只给出了受 COM1x1:0 影响的通用 I/O 端口控制寄存器 (DDR 和 PORT) 。
谈及 OC1x 状态时指的是内部OC1x 寄存器,而不是 OC1x 引脚的状态。系统复位时 OC1x
寄存器复位为 "0” 。
Figure 36. 比较匹配输出单元原理图
COMnx1
COMnx0
FOCnx
Waveform
Generator
DQ
OCnx
DQ
1
0
OCnx
Pin
PORT
DATABUS
DQ
DDR
clk
I/O
只要 COM1x1:0 不全为零,波形发生器的输出比较功能就会重载 OC1x 的通用 I/O 口功
能。但是 OC1x 引脚的方向仍旧受控于数据方向寄存器 (DDR) 。从 OC1x 引脚输出有效
信号之前必须通过数据方向寄存器的 DDR_OC1x 将此引脚设置为输出。一般情况下功能
重载与波形发生器的工作模式无关,但也由一些例外,详见 Table 36 、Table 37 与 Table
38 。
输出比较逻辑的设计允许 OC1x 在输出之前首先进行初始化。要注意某些 COM1x1:0 设
置在某些特定的工作模式下是保留的,如 P 89 “ 16 位定时器 / 计数器寄存器的说明 ” 。
COM1x1:0 不影响输入捕捉单元。
2486N–AVR–07/04
81
Page 82
比较输出模式和波形产生 波形发生器利用 COM1x1:0 的方法在普通模式、 CTC 模式和 PWM 模式下有所区别。对
于所有的模式,设置 COM1x1:0 = 0 表明比较匹配发生时波形发生器不会操作 OC1x 寄存
器。非 PWM 模式的比较输出请参见 P 89Table 36 ;快速 PWM 的比较输出于 P 90Table
37 ;相位修正 PWM 的比较输出于 to P 90Table 38 。
改变 COM1x1:0 将影响写入数据后的第一次比较匹配。对于非 PWM 模式,可以通过使
用 FOC1x 来立即产生效果。
工作模式 工作模式 - T/C 和输出比较引脚的行为 - 由波形发生模式 (WGM13:0) 及比较输出模式
(COM1x1:0) 的控制位决定。比较输出模式对计数序列没有影响,而波形产生模式对计数
序列则有影响。 COM1x1:0 控制 PWM 输出是否为反极性。非 PWM 模式时 COM1x1:0
控制输出是否应该在比较匹配发生时置位、清零,或是电平取反 P 81 “ 比较匹配输出单元
” 。
具体的时序信息请参考 P 87“ 定时器 / 计数器时序图 ” 。
普通模式 普通模式 (WGM13:0 = 0) 为最简单的工作模式。在此模式下计数器不停地累加。计到最
大值后 (TOP = 0xFFFF) 由于数值溢出计数器简单地返回到最小值 0x0000 重新开始。在
TCNT1 为零的同一个定时器时钟里T/C 溢出标志TOV1 置位。此时TOV1 有点象第 17 位,只
是只能置位,不会清零。但由于定时器中断服务程序能够自动清零 TOV1 ,因此可以通过
软件提高定时器的分辨率。在普通模式下没有什么需要特殊考虑的,用户可以随时写入新
的计数器数值。
在普通模式下输入捕捉单元很容易使用。要注意的是外部事件的最大时间间隔不能超过
计数器的分辨率。如果事件间隔太长,必须使用定时器溢出中断或预分频器来扩展输入捕
捉单元的分辨率。
CTC( 比较匹配时清零定时器 )
模式
输出比较单元可以用来产生中断。但是不推荐在普通模式下利用输出比较来产生波形,因
为会占用太多的 CPU 时间。
在 CTC 模式 (WGM13:0 = 4 或 12) 里 OCR1A 或 ICR1 寄存器用于调节计数器的分辨率。
当计数器的数值 TCNT1 等于 OCR1A(WGM13:0 = 4) 或等于 ICR1 (WGM13:0 = 12) 时计
数器清零。 OCR1A 或 ICR1 定义了计数器的 TOP 值,亦即计数器的分辨率。这个模式
使得用户可以很容易地控制比较匹配输出的频率,也简化了外部事件计数的操作。
CTC 模式的时序图为Figure 37 。计数器数值TCNT1 一直累加到 TCNT1 与 OCR1A 或 ICR1
匹配,然后 TCNT1 清零。
Figure 37. CTC 模式的时序图
OCnA Interrupt Flag Set
or ICFn Interrupt Flag Set
(Interrupt on TOP)
TCNTn
OCnA
(Toggle)
(COMnA1:0 = 1)
82
ATmega8(L)
Period
1 4
2 3
2486N–AVR–07/04
Page 83
ATmega8(L)
利用 OCF1A 或 ICF1 标志可以在计数器数值达到 TOP 时产生中断。 在中断服务程序里可
以更新 TOP 的数值。由于 CTC 模式没有双缓冲功能,在计数器以无预分频器或很低的预
分频器工作的时候将 TOP 更改为接近 BOTTOM 的数值时要小心。如果写入的 OCR1A 或
ICR1 的数值小于当前 TCNT1 的数值,计数器将丢失一次比较匹配。在下一次比较匹配发
生之前,计数器不得不先计数到最大值 0xFFFF ,然后再从 0x0000 开始计数到 OCR1A
或 ICR1 。在许多情况下,这一特性并非我们所希望的。替代的方法是使用快速 PWM 模
式,该模式使用 OCR1A 定义 TOP 值 (WGM13:0 = 15) ,因为此时 OCR1A 为双缓冲。
为了在CTC 模式下得到波形输出,可以设置 OC1A 在每次比较匹配发生时改变逻辑电平。
这可以通过设置 COM1A1:0 = 1 来完成。在期望获得 OC1A 输出之前,首先要将其端口
设置为输出 (DDR_OC1A = 1)。波形发生器能够产生的最大频率为 f
(OCR1A = 0x0000) 。频率由如下公式确定:
f
OCnA
---------------------------------------------------
=
2 N 1 OCRnA + (
clk_I/O
⋅⋅
变量 N 代表预分频因子 (1 、 8 、 64 、 256 或 1024) 。
在普通模式下,TOV1 标志的置位发生在计数器从 MAX 变为 0x0000 的定时器时钟周期。
快速 PWM 模式 快速 PWM 模式 (WGM13:0 = 5 、 6 、 7、 14 或 15) 可用来产生高频的 PWM 波形。快速
PWM 模式与其他 PWM 模式的不同之处是其单边斜坡工作方式。计数器从 BOTTOM 计到
TOP,然后立即回到 BOTTOM 重新开始。对于普通的比较输出模式,输出比较引脚 OC1x
在 TCNT1 与 OCR1x 匹配时置位,在 TOP 时清零;对于反向比较输出模式,OCR1x 的
动作正好相反。由于使用了单边斜坡模式,快速 PWM 模式的工作频率比使用双斜坡的相
位修正 PWM 模式高一倍。此高频操作特性使得快速 PWM 模式十分适合于功率调节,整
流和 DAC 应用。高频可以减小外部元器件( 电感,电容 ) 的物理尺寸,从而降低系统成本。
OC1A
= f
clk_I/O
/2
工作于快速 PWM 模式时,PWM 分辨率可固定为 8、9 或 10 位,也可由 ICR1 或 OCR1A
定义。最小分辨率为 2 比特 (ICR1 或 OCR1A 设为 0x0003) ,最大分辨率为 16 位 (ICR1
或 OCR1A 设为 MAX) 。 PWM 分辨率位数可用下式计算:
TOP 1 + ()log
FPWM
------------------------------------ =
2() log
工作于快速 PWM 模式时,计数器的数值一直累加到固定数值 0x00FF、 0x01FF、0x03FF
(WGM13:0 = 5、 6 或 7)、ICR1 (WGM13:0 = 14) 或 OCR1A (WGM13:0 = 15),然后在后
面的一个时钟周期清零。具体的时序图为 Figure 38 。图中给出了当使用 OCR1A 或 ICR1
来定义 TOP 值时的快速 PWM 模式。图中柱状的 TCNT1 表示这是单边斜坡操作。方框
图同时包含了普通的 PWM 输出以及反向 PWM 输出。 TCNT1 斜坡上的短水平线表示
OCR1x 和 TCNT1 的匹配比较。比较匹配后 OC1x 中断标志置位。
Figure 38. 快速 PWM 模式时序图
OCRnx / TOP Update
and TOVn Interrupt Flag
Set and OCnA Interrupt
Flag Set or ICFn
Interrupt Flag Set
(Interrupt on TOP)
TCNTn
OCnx
(COMnx1:0 = 2)
2486N–AVR–07/04
OCnx
Period
1 7
2 3 4 5 6 8
(COMnx1:0 = 3)
83
Page 84
计时器数值达到 TOP 时 T/C 溢出标志 TOV1 置位。另外若 TOP 值是由 OCR1A 或 ICR1
定义的,则 OC1A 或 ICF1 标志将与 TOV1 在同一个时钟周期置位。如果中断使能,可以
在中断服务程序里来更新 TOP 以及比较数据。
改变TOP 值时必须保证新的TOP 值不小于所有比较寄存器的数值。否则TCNT1 与OCR1x
不会出现比较匹配。使用固定的 TOP 值时,向任意 OCR1x 寄存器写入数据时未使用的
位将屏蔽为 "0” 。
定义 TOP 值时更新 ICR1 与 OCR1A 的步骤时不同的。 ICR1 寄存器不是双缓冲寄存器。
这意味着当计数器以无预分频器或很低的预分频工作的时候,给 ICR1 赋予一个小的数值
时存在着新写入的 ICR1 数值比 TCNT1 当前值小的危险。结果是计数器将丢失一次比较
匹配。在下一次比较匹配发生之前,计数器不得不先计数到最大值 0xFFFF ,然后再从
0x0000 开始计数,直到比较匹配出现。而 OCR1A 寄存器则是双缓冲寄存器。这一特性决
定 OCR1A 可以随时写入。写入的数据被放入 OCR1A 缓冲寄存器。在 TCNT1 与 TOP 匹
配后的下一个时钟周期,OCR1A 比较寄存器的内容被缓冲寄存器的数据所更新。在同一
个时钟周期 TCNT1 被清零,而 TOV1 标志被设置。
使用固定 TOP 值时最好使用 ICR1 寄存器定义 TOP 。这样 OCR1A 就可以用于在 OC1A
输出 PWM 波。但是,如果 PWM 基频不断变化 ( 通过改变 TOP 值),OCR1A 的双缓冲
特性使其更适合于这个应用。
工作于快速PWM 模式时,比较单元可以在 OC1x 引脚上输出 PWM 波形。设置 COM1x1:0
为 2 可以产生普通的 PWM 信号;为 3 则可以产生反向 PWM 波形 ( 参见 P 90Table 37
)。此外,要真正从物理引脚上输出信号还必须将 OC1x 的数据方向 DDR_OC1x 设置为输
出。产生 PWM 波形的机理是 OC1x 寄存器在 OCR1x 与 TCNT1 匹配时置位 ( 或清零 ),
以及在计数器清零 ( 从 TOP 变为 BOTTOM) 的那一个定时器时钟周期清零 ( 或置位 )。
输出的 PWM 频率可以通过如下公式计算得到:
f
OCnxPWM
=
clk_I/O
----------------------------------N 1 TOP + ()⋅
变量 N 代表分频因子 (1、 8、 64、 256 或 1024)。
OCR1x 寄存器为极限值时说明了快速 PWM 模式的一些特殊情况。若 OCR1x 等于
BOTTOM(0x0000),输出为出现在第TOP+1个定时器时钟周期的窄脉冲;OCR1x为TOP
时,根据 COM1x1:0 的设定,输出恒为高电平或低电平。
通过设定 OC1A 在比较匹配时进行逻辑电平取反 (COM1A1:0 = 1) ,可以得到占空比为
50% 的周期信号。这只适用于 OCR1A 用来定义 TOP 值的情况 (WGM13:0 = 15) 。 OCR1A
为 0(0x0000) 时信号有最高频率 f
OC1A
= f
/2。这个特性类似于 CTC 模式下的 OC1A
clk_I/O
取反操作,不同之处在于快速 PWM 模式具有双缓冲。
相位修正 PWM 模式 相位修正 PWM 模式 (WGM13:0 = 1、 2、 3、10 或 11) 为用户提供了一个获得高精度的、
相位准确的 PWM 波形的方法。与相位和频率修正模式类似,此模式基于双斜坡操作。计
时器重复地从 BOTTOM 计到 TOP ,然后又从 TOP 倒退回到 BOTTOM 。在一般的比较输
出模式下,当计时器往 TOP 计数时若 TCNT1 与 OCR1x 匹配,OC1x 将清零为低电平;
而在计时器往 BOTTOM 计数时若 TCNT1 与 OCR1x 匹配, OC1x 将置位为高电平。工
作于反向比较输出时则正好相反。与单斜坡操作相比,双斜坡操作可获得的最大频率要
小。但其对称特性十分适合于电机控制。
相位修正 PWM 模式的 PWM 分辨率固定为 8、9 或 10 位,或由 ICR1 或 OCR1A 定义。
最小分辨率为2 比特(ICR1 或OCR1A 设为 0x0003) ,最大分辨率为 16 位 (ICR1 或 OCR1A
设为 MAX) 。 PWM 分辨率位数可用下式计算:
TOP 1+ ()log
-----------------------------------
PCPWM
=
2() log
84
ATmega8(L)
工作于相位修正 PWM 模式时,计数器的数值一直累加到固定值 0x00FF、 0x01FF、
0x03FF (WGM13:0 = 1、 2 或 3)、ICR1 (WGM13:0 = 10) 或 OCR1A (WGM13:0 = 11),然
2486N–AVR–07/04
Page 85
ATmega8(L)
后改变计数方向。在一个定时器时钟里 TCNT1 值等于 TOP 值。具体的时序图为 Figure
39。图中给出了当使用OCR1A 或ICR1 来定义 TOP值时的相位修正PWM 模式。图中柱状
的 TCNT1 表示这是双边斜坡操作。方框图同时包含了普通的 PWM 输出以及反向 PWM
输出。TCNT1 斜坡上的短水平线表示 OCR1x 和 TCNT1 的匹配比较。比较匹配后 OC1x
中断标志置位。
Figure 39. 相位修正 PWM 模式的时序图
OCRnx / TOP Update and
OCnA Interrupt Flag Set
or ICFn Interrupt Flag Set
(Interrupt on TOP)
TOVn Interrupt Flag Set
(Interrupt on Bottom)
TCNTn
OCnx
OCnx
Period
1 2 3 4
(COMnx1:0 = 2)
(COMnx1:0 = 3)
计时器数值达到 BOTTOM 时 T/C 溢出标志 TOV1 置位。若 TOP 由 OCR1A 或 ICR1 定
义,在 OCR1x 寄存器通过双缓冲方式得到更新的同一个时钟周期里 OC1A 或 ICF1 标志
置位。标志置位后即可产生中断。
改变TOP 值时必须保证新的TOP 值不小于所有比较寄存器的数值。否则TCNT1 与OCR1x
不会出现比较匹配。使用固定的 TOP 值时,向任意 OCR1x 寄存器写入数据时未使用的
位将屏蔽为 "0” 。在 Figure 39 给出的第三个周期中,在 T/C 运行于相位修正模式时改变
TOP 值导致了不对称输出。其原因在于 OCR1x 寄存器的更新时间。由于 OCR1x 的更新时
刻为定时器 / 计数器达到 TOP 之时,因此 PWM 的循环周期起始于此,也终止于此。就
是说,下降斜坡的长度取决于上一个 TOP 值,而上升斜坡的长度取决于新的 TOP 值。若
这两个值不同,一个周期内两个斜坡长度不同,输出也就不对称了。
若要在 T/C 运行时改变 TOP 值,最好用相位与频率修正模式代替相位修正模式。若 TOP
保持不变,那么这两种工作模式实际没有区别。
工作于相位修正 PWM 模式时,比较单元可以在 OC1x 引脚输出 PWM 波形。设置
COM1x1:0 为 2 可以产生普通的 PWM,设 置 COM1x1:0 为 3 可以产生反向 PWM ( 参见 P
90Table 38 )。要真正从物理引脚上输出信号还必须将 OC1x 的数据方向 DDR_OC1x 设置
为输出。OCR1x 和 TCNT1 比较匹配发生时 OC1x 寄存器将产生相应的清零或置位操作,
从而产生 PWM 波形。工作于相位修正模式时 PWM 频率可由如下公式获得:
f
clk_I/O
f
OCnxPCPWM
----------------------------- =
2 NTOP⋅⋅
2486N–AVR–07/04
变量 N 表示预分频因子 (1、 8、 64、 256 或 1024)。
OCR1x 寄存器处于极值时表明了相位修正 PWM 模式的一些特殊情况。在普通 PWM 模式
下,若 OCR1x 等于 BOTTOM ,输出一直保持为低电平;若 OCR1x 等于 TOP ,输出则
保持为高电平。反向 PWM 模式正好相反。
85
Page 86
如果 OCR1A 用来定义 TOP 值 (WGM13:0 = 11) 且 COM1A1:0 = 1 , OC1A 输出占空比
为 50% 的周期信号。
相位与频率修正 PWM 模式 相位与频率修正 PWM 模式 (WGM13:0 = 8 或 9) - 以下简称相频修正 PWM 模式 - 可以产
生高精度的、相位与频率都准确的 PWM 波形。与相位修正模式类似,相频修正 PWM 模
式基于双斜坡操作。计时器重复地从 BOTTOM 计到 TOP ,然后又从 TOP 倒退回到
BOTTOM。在一般的比较输出模式下,当计时器往 TOP 计数时若 TCNT1 与 OCR1x 匹配
OC1x将清零为低电平;而在计时器往 BOTTOM计数时 TCNT1与 OCR1x匹配,OC1x将置
位为高电平。工作于反向输出比较时则正好相反。与单斜坡操作相比,双斜坡操作可获得
的最大频率要小。但其对称特性十分适合于电机控制。
相频修正修正 PWM 模式与相位修正 PWM 模式的主要区别在于 OCR1x 寄存器的更新时
间,详见 Figure 39 与 Figure 40 。
相频修正修正 PWM 模式的 PWM 分辨率可由 ICR1 或 OCR1A 定义。最小分辨率为 2 比
特 (ICR1 或 OCR1A 设为 0x0003) ,最大分辨率为 16 位 (ICR1 或 OCR1A 设为 MAX) 。
PWM 分辨率位数可用下式计算:
TOP 1+ ()log
-----------------------------------
PFCPWM
=
2() log
工作于相频修正 PWM 模式时,计数器的数值一直累加到 ICR1 (WGM13:0 = 8) 或 OCR1A
(WGM13:0 = 9),然后改变计数方向。在一个定时器时钟里TCNT1 值等于TOP值。具体的
时序图为 Figure 40。图中给出了当使用 OCR1A 或 ICR1 来定义 TOP 值时的相频修正
PWM模式。图中柱状的TCNT1表示这是双边斜坡操作。方框图同时包含了普通的PWM输
出以及反向 PWM 输出。TCNT1 斜坡上的短水平线表示 OCR1x 和 TCNT1 的匹配比较。
比较匹配发生时, OC1x 中断标志将被置位。
Figure 40. 相位与频率修正 PWM 模式的时序图
OCnA Interrupt Flag Set or
ICFn Interrupt Flag Set
(Interrupt on TOP)
OCRnx / TOP Update and
TOVn Interrupt Flag Set
(Interrupt on Bottom)
TCNTn
OCnx
OCnx
Period
1 2 3 4
(COMnx1:0 = 2)
(COMnx1:0 = 3)
在 OCR1x 寄存器通过双缓冲方式得到更新的同一个时钟周期里 T/C 溢出标志 TOV1 置
位。若 TOP 由 OCR1A 或 ICR1 定义,则当 TCNT1 达到 TOP 值时 OC1A 或 CF1 置位。
这些中断标志位可用来在每次计数器达到 TOP 或 BOTTOM 时产生中断。
86
改变TOP 值时必须保证新的TOP 值不小于所有比较寄存器的数值。否则TCNT1 与OCR1x
不会产生比较匹配。
ATmega8(L)
2486N–AVR–07/04
Page 87
ATmega8(L)
如 Figure 40 所示,与相位修正模式形成对照的是,相频修正 PWM 模式生成的输出在所
有的周期中均为对称信号。这是由于 OCR1x 在 BOTTOM 得到更新,上升与下降斜坡长
度始终相等。因此输出脉冲为对称的,确保了频率是正确的。
使用固定 TOP 值时最好使用 ICR1 寄存器定义 TOP 。这样 OCR1A 就可以用于在 OC1A
输出 PWM 波。但是,如果 PWM 基频不断变化 ( 通过改变 TOP 值),OCR1A 的双缓冲
特性使其更适合于这个应用。
工作于相频修正 PWM 模式时,比较单元可以在 OC1x 引脚上输出 PWM 波形。设置
COM1x1:0 为 2 可以产生普通的 PWM 信号;为 3 则可以产生反向 PWM 波形。 ( 参见 P
90Table 38 )。要想真正输出信号还必须将 OC1x 的数据方向设置为输出。产生 PWM波形
的机理是 OC1x 寄存器在 OCR1x 与升序记数的 TCNT1 匹配时置位 ( 或清零 ) ,与降序记
数的 TCNT1 匹配时清零 ( 或置位 ) 。输出的 PWM 频率可以通过如下公式计算得到:
f
f
OCnxPFCPWM
变量 N 代表分频因子 (1、 8、 64、 256 或 1024)。
OCR1x 寄存器处于极值时说明了相频修正 PWM 模式的一些特殊情况。在普通 PWM 模式
下,若 OCR1x 等于 BOTTOM ,输出一直保持为低电平;若 OCR1x 等于 TOP ,则输出
保持为高电平。反向 PWM 模式则正好相反。
如果 OCR1A 用来定义 TOP 值 (WGM13:0 = 9) 且 COM1A1:0 = 1 ,OC1A 输出占空比为
50% 的周期信号。
clk_I/O
----------------------------- =
2 NTOP⋅⋅
定时器 / 计数器时序图 定时器 / 计数器为同步电路,因而时钟 clk
中断标志及何时使用 OCR1x 缓冲器中的数据更新 OCR1x 寄存器 ( 工作于双缓冲器模式
时)。 Figure 41 给出了置位 OCF1x 的时序图。
Figure 41. T/C 时序图 , OCF1x 置位,无预分频器
clk
I/O
clk
Tn
(clk
/1)
I/O
TCNTn
OCRnx
OCFnx
Figure 42 给出相同的计时数据,但预分频使能。
OCRnx - 1
OCRnx
表示为时钟使能信号。图中说明了何时设置
T1
OCRnx + 1 OCRnx + 2
OCRnx Value
2486N–AVR–07/04
87
Page 88
Figure 42. T/C 时序图,置位 OCF1x,预分频器为 f
clk
I/O
clk
Tn
(clk
/8)
I/O
clk_I/O
/8
TCNTn
OCRnx
OCRnx - 1 OCRnx OCRnx + 1 OCRnx + 2
OCRnx Value
OCFnx
Figure 43 给出工作在不同模式下接近 TOP 值时的计数序列。工作于相频修正 PWM 模式
时, OCR1x 寄存器在 BOTTOM 被更新。时序图相同,但 TOP 需要用 BOTTOM 代替,
BOTTOM+1 代替 TOP-1 ,等等。同样的命名规则也适用于那些在 BOTTOM 置位 TOV1 标
志的工作模式。
Figure 43. T/C 时序图,无预分频器
clk
I/O
clk
Tn
(clk
/1)
I/O
TCNTn
(CTC and FPWM)
TOP - 1 TOP BOTTOM BOTTOM + 1
88
ATmega8(L)
TCNTn
(PC and PFC PWM)
TOVn
(FPWM)
and ICFn
(if used
as TOP)
OCRnx
(Update at TOP)
TOP - 1 TOP TOP - 1 TOP - 2
Old OCRnx Value New OCRnx Value
Figure 44 给出相同的计时数据,但预分频使能。
2486N–AVR–07/04
Page 89
ATmega8(L)
16 位定时器 / 计数器寄存
器的说明
T/C1 控制寄存器 A - TCCR1A
Figure 44. T/C 时序图,预分频器为 f
clk
I/O
clk
Tn
(clk
/8)
I/O
TCNTn
(CTC and FPWM)
TCNTn
(PC and PFC PWM)
TOP - 1 TOP BOTTOM BOTTOM + 1
TOP - 1 TOP TOP - 1 TOP - 2
clk_I/O
/8
TOVn (FPWM)
and ICFn (if used
as TOP)
OCRnx
(Update at TOP)
B i t 76543210
COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10 TCCR1A
读/写 R/W R/W R/W R/W W W R/W R/W
初始值 00000000
Old OCRnx Value New OCRnx Value
• Bit 7:6 – COM1A1:0: 通道 A 的比较输出模式
• Bit 5:4 – COM1B1:0: 通道 B 的比较输出模式
COM1A1:0 与 COM1B1:0 分别控制OC1A 与OC1B 状态。如果 COM1A1:0 (COM1B1:0 )的
一位或两位被写入 "1” ,OC1A(OC1B) 输出功能将取代 I/O 端口功能。此时 OC1A (OC1B )
相应的输出引脚数据方向控制必须置位以使能输出驱动器。
OC1A (OC1B ) 与物理引脚相连时,COM1x1:0 的功能由 WGM13:0 的设置决定。Table 36
给出当 WGM13:0 设置为普通模式与 CTC 模式 ( 非 PWM) 时 COM1x1:0 的功能定义。
Table 36. 比较输出模式,非 PWM
COM1A1/
COM1B1
00普通端口操作, OC1A/OC1B 未连接
01比较匹配时 OC1A/OC1B 电平取反
10比较匹配时清零 OC1A/OC1B( 输出低电平 )
11比较匹配时置位 OC1A/OC1B ( 输出高电平 )
COM1A0/
COM1B0 说明
2486N–AVR–07/04
89
Page 90
Table 37 给出 WGM13:0 设置为快速 PWM 模式时 COM1x1:0 的功能定义。
Table 37. 比较输出模式,快速 PWM
COM1A1/
COM1B1
00普通端口操作, OC1A/OC1B 未连接
0 1 WGM13:0 = 15: 比较匹配时 OC1A 取反 ,
10比较匹配时清零 OC1A/OC1B, OC1A/OC1B
11比较匹配时置位 OC1A/OC1B, OC1A/OC1B
Note: 1. 当 OCR1A/OCR1B 等于 TOP 且 COM1A1/COM1B1 置位时,比较匹配被忽略,但
COM1A0/
COM1B0 说明
OC1B 未连接。 WGM13:0 为其它值时为普通
端口操作, OC1A/OC1B 未连接
在 TOP 时置位
在 TOP 时清零
OC1A/OC1B 的置位 / 清零操作有效。详见 P 83 “ 快速 PWM 模式 ” 。
(1)
Table 38给出当WGM13:0设置为相位修正PWM 模式或相频修正PWM 模式时 COM1x1:0
的功能定义。
Table 38. 比较输出模式,相位修正及相频修正 PWM 模式
COM1A1/
COM1B1
00普通端口操作, OC1A/OC1B 未连接
0 1 WGM13:0 = 9 或 14: 比较匹配时 OC1A 取反,
10升序记数时比较匹配将清零 OC1A/OC1B,降
11升序记数时比较匹配将置位 OC1A/OC1B,降
COM1A0/
COM1B0 说明
OC1B 未连接。 WGM13:0为其它值时为普通端
口操作, OC1A/OC1B 未连接
序记数时比较匹配将置位 OC1A/OC1B
序记数时比较匹配将清零 OC1A/OC1B
(1)
90
Note: 1. OCR1A/OCR1B 等于 TOP 且 COM1A1/COM1B1 置位是一个特殊情况。详细信息请参
见 P 84 “ 相位修正 PWM 模式 ” 。
• Bit 3 – FOC1A: 通道 A 强制输出比较
• Bit 2 – FOC1B: 通道 B 强制输出比较
FOC1A/FOC1B 只有当WGM13:0 指定为非PWM 模式时被激活。为与未来器件兼容,工作
在 PWM 模式下对 TCCR1A 写入时,这两位必须清零。当 FOC1A/FOC1B 位置 1 ,立即
强制波形产生单元进行比较匹配。 COM1x1:0 的设置改变 OC1A/OC1B 的输出。注意
FOC1A/FOC1B 位作为选通信号。 COM1x1:0 位的值决定强制比较的效果。
在 CTC 模式下使用 OCR1A 作为 TOP 值, FOC1A/FOC1B 选通即不会产生中断也不会
清除定时器。
FOC1A/FOC1B 位总是读为 0 。
• Bit 1:0 – WGM11:0: 波形发生模式
这两位与位于 TCCR1B 寄存器的 WGM13:2 相结合,用于控制计数器的计数序列——计
数器计数的上限值和确定波形发生器的工作模式见 Table 39 。 T/C 支持的工作模式有:普
通模式 ( 计数器 ),比较匹配时清零定时器 (CTC) 模式,及三种脉宽调制 (PWM) 模式,见
P 82 “ 工作模式 ” 。
ATmega8(L)
2486N–AVR–07/04
Page 91
Table 39. 波形产生模式的位描述
ATmega8(L)
WGM12
模式 WGM13
00 0 0 0普通模式 0xFFFF 立即更新 MAX
10 0 0 18位相位修正 PWM 0x00FF TOP BOTTOM
20 0 1 09位相位修正 PWM 0x01FF TOP BOTTOM
30 0 1 11 0位相位修正 PWM 0x03FF TOP BOTTOM
40 1 0 0C T C O C R 1 A立即更新 MAX
50 1 0 18位快速 PWM 0x00FF TOP TOP
60 1 1 09位快速 PWM 0x01FF TOP TOP
70 1 1 11 0位快速 PWM 0x03FF TOP TOP
81 0 0 0相位与频率修正 PWM ICR1 BOTTOM BOTTOM
91 0 0 1相位与频率修正 PWM OCR1A BOTTOM BOTTOM
10 1 0 1 0 相位修正 PWM ICR1 TOP BOTTOM
11 1 0 1 1 相位修正 PWM OCR1A TOP BOTTOM
12 1 1 0 0 CTC ICR1 立即更新 MAX
13 1 1 0 1 保留 –– –
14 1 1 1 0 快速 PWM ICR1 TOP TOP
15 1 1 1 1 快速 PWM OCR1A TOP TOP
Note: 1. CTC1 和 PWM11:0 的定义已经不再使用了,要使用 WGM 12:0。但是两个版本的功能和位置是兼容的。
(CTC1)
WGM11
(PWM11)
WGM10
(PWM10) 定时器 / 计数器工作模式
(1)
TOP
OCR1x 更
新时刻
TOV1 置位
时刻
2486N–AVR–07/04
91
Page 92
T/C1 控制寄存器 B - TCCR1B
B i t 76543210
ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10 TCCR1B
读 / 写 R/W R/W R R/W R/W R/W R/W R/W
初始值 00000000
• Bit 7 – ICNC1: 输入捕捉噪声抑制器
置位 ICNC1 将使能输入捕捉噪声抑制功能。此时外部引脚 ICP1 的输入被滤波。其作用
是从 ICP1 引脚连续进行 4 次采样。如果 4 个采样值都相等,那么信号送入边沿检测器。
因此使能该功能使得输入捕捉被延迟了 4 个时钟周期。
• Bit 6 – ICES1: 输入捕捉触发沿选择
该位选择使用 ICP1 上的哪个边沿触发捕获事件。 ICES 为 "0” 选择的是下降沿触发输入
捕捉; ICES1 为 "1” 选择的是逻辑电平的上升沿触发输入捕捉。
按照 ICES1 的设置捕获到一个事件后,计数器的数值被复制到 ICR1 寄存器。捕获事件还
会置为 ICF1 。如果此时中断使能,输入捕捉事件即被触发。
当 ICR1 用作 TOP 值(见TCCR1A 与 TCCR1B 寄存器中 WGM13:0 位的描述 ) 时,ICP1
与输入捕捉功能脱开,从而输入捕捉功能被禁用。
•Bit 5 – 保留位
该位保留。为保证与将来器件的兼容性,写 TCCR1B 时,该位必须写入 "0” 。
• Bit 4:3 – WGM13:2: 波形发生模式
见 TCCR1A 寄存器中的描述。
• Bit 2:0 – CS12:0: 时钟选择
T/C1 - TCNT1H 与 TCNT1L
这 3 位用于选择 T/C 的时钟源,见 Figure 41 与 Figure 42。
Table 40. 时钟选择位描述
CS12 CS11 CS10 说明
000无时钟源 (T/C 停止 )
001 c l k
010 c l k
011 c l k
100 c l k
101 c l k
/1 ( 无预分频 )
I/O
/8 ( 来自预分频器 )
I/O
/64 ( 来自预分频器 )
I/O
/256 ( 来自预分频器 )
I/O
/1024 ( 来自预分频器 )
I/O
110外部 T1 引脚,下降沿驱动
111外部 T1 引脚,上升沿驱动
选择使用外部时钟源后,即使 T1 引脚被定义为输出,引脚上的逻辑信号电平变化仍然会
驱动 T/C1 计数,这个特性允许用户通过软件来控制计数。
B i t 76543210
TCNT1[15:8] TCNT1H
TCNT1[7:0] TCNT1L
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
92
TCNT1H 与TCNT1L 组成了 T/C1 的数据寄存器TCNT1 。通过它们可以直接对定时器/计数
器单元的 16 位计数器进行读写访问。为保证 CPU 对高字节与低字节的同时读写,必须
ATmega8(L)
2486N–AVR–07/04
Page 93
ATmega8(L)
使用一个 8 位临时高字节寄存器 TEMP。 TEMP 是所有的 16 位寄存器共用的,详见 P 74
“ 访问 16 位寄存器 ” 。
在计数器运行期间修改TCNT1 的内容有可能丢失一次TCNT1 与OCR1x 的比较匹配操作。
写 TCNT1 寄存器将在下一个定时器周期阻塞比较匹配。
输出比较寄存器 1A - OCR1AH
与OCR1AL
输出比较寄存器 1B - OCR1BH
与OCR1BL
B i t 76543210
OCR1A[15:8] OCR1AH
OCR1A[7:0] OCR1AL
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
OCR1B[15:8] OCR1BH
OCR1B[7:0] OCR1BL
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
该寄存器中的 16 位数据与 TCNT1 寄存器中的计数值进行连续的比较,一旦数据匹配,
将产生一个输出比较中断,或改变 OC1x 的输出逻辑电平。
输出比较寄存器长度为 16 位。为保证 CPU 对高字节与低字节的同时读写,必须使用一
个 8 位临时高字节寄存器 TEMP 。TEMP 是所有的 16 位寄存器共用的,详见 P 74 “ 访问
16 位寄存器 ” 。
2486N–AVR–07/04
93
Page 94
输入捕捉寄存器 1 - ICR1H 与
ICR1L
B i t 76543210
ICR1[15:8] ICR1H
ICR1[7:0] ICR1L
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
当外部引脚ICP1 (或T/C1 的模拟比较器)有输入捕捉触发信号产生时,计数器TCNT1 中的
值写入 ICR1 中。 ICR1 的设定值可作为计数器的 TOP 值。
输入捕捉寄存器长度为 16 位。为保证 CPU 对高字节与低字节的同时读,必须使用一个 8
位临时高字节寄存器 TEMP 。 TEMP 是所有的 16 位寄存器共用的,详见 P 74 “ 访问 16
位寄存器 ” 。
T/C1 中断屏蔽寄存器-
TIMSK
(1)
B i t 76543210
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1
读/写 R/W R/W R/W R/W R/W R/W R R/W
初始值 00000000
Note: 1. 该寄存器包含几个T/C 的中断控制位,但本节中只对T1 位进行说明,其余位将在各自的
小节中加以说明。
–
TOIE0 TIMSK
• Bit 5 – TICIE1: T/C1 输入捕捉中断使能
当该位被设为 "1” ,且状态寄存器中的 I 位被设为 "1” 时, T/C1 的输入捕捉中断使能。一
旦 TIFR 的 ICF1 置位,CPU 即开始执行 T/C1 输入捕捉中断服务程序 ( 见 P 43 “ 中断 ” )。
• Bit 4 – OCIE1A:T/C1 输出比较 A 匹配中断使能
当该位被设为 "1” ,且状态寄存器中的 I 位被设为 "1” 时,T/C1 的输出比较 A 匹配中断使
能。一旦 TIFR 上的 OCF1A 置位,CPU 即开始执行 T/C1 输出比较 A 匹配中断服务程序
( 见 P 43 “ 中断 ” ) 。
• Bit 3 – OCIE1B:T/C1 输出比较 B 匹配中断使能
当该位被设为 "1” ,且状态寄存器中的 I 位被设为 "1” 时,使能 T/C1 的输出比较 B 匹配中
断使能。一旦 TIFR 上的 OCF1B 置位,CPU 即开始执行 T/C1 输出比较 B 匹配中断服务
程序 ( 见 P 43 “ 中断 ” )。
• Bit 2 – TOIE1:T/C1 溢出中断使能
当该位被设为 "1” ,且状态寄存器中的 I 位被设为 ”1” 时, T/C1 的溢出中断使能。一旦
TIFR 上的 TOV1 置位, CPU 即开始执行 T/C1 溢出中断服务程序 ( 见 P 43 “ 中断 ” ) 。
T/C 中断标志寄存器- TIFR
94
ATmega8(L)
(1)
B i t 76543210
OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 – TOV0 TIFR
读/写 R/W R/W R/W R/W R/W R/W R R/W
初始值 00000000
Note: 1. 该寄存器包含几个T/C 的标志位,但本节中只对T1 位进行说明,其余位将在各自的小节
中加以说明。
• Bit 5 – ICF1: T/C1 输入捕捉标志
外部引脚 ICP1 出现捕捉事件时 ICF1 置位。此外,当 ICR1 作为计数器的 TOP 值时,一
旦计数器值达到 TOP , ICF1 也置位。
执行输入捕捉中断服务程序时 ICF1 自动清零。也可以对其写入逻辑 "1” 来清除该标志位。
• Bit 4 – OCF1A: T/C1 输出比较 A 匹配标志
当 TCNT1 与 OCR1A 匹配成功时,该位被设为 "1” 。
2486N–AVR–07/04
Page 95
ATmega8(L)
强制输出比较 (FOC1A) 不会置位 OCF1A 。
执行强制输出比较匹配 A 中断服务程序时 OCF1A 自动清零。也可以对其写入逻辑 "1” 来
清除该标志位。
• Bit 3 – OCF1B: T/C1 输出比较 B 匹配标志
当 TCNT1 与 OCR1B 匹配成功时,该位被设为 "1” 。
强制输出比较 (FOC1B) 不会置位 OCF1B 。
执行强制输出比较匹配 B 中断服务程序时 OCF1B 自动清零。也可以对其写入逻辑 "1” 来
清除该标志位。
• Bit 2 – TOV1: T/C1 溢出标志
该位的设置与 T/C1 的工作方式有关。工作于普通模式和 CTC 模式时,T/C1 溢出时 TOV1
置位。对工作在其它模式下的 TOV1 标志位置位,见 P 91Table 39 。
执行溢出中断服务程序时 TOV1 自动清零。也可以对其写入逻辑 "1” 来清除该标志位。
2486N–AVR–07/04
95
Page 96
8 位有 PWM 与异步操
作的定时器 / 计数器 2
T/C2 是一个通用单通道 8 位定时 / 计数器,其主要特点如下:
单通道计数器
•
• 比较匹配时清零定时器 ( 自动重载 )
• 无干扰脉冲 , 相位正确的脉宽调制器 (PWM)
• 频率发生器
• 10 位时钟预分频器
• 溢出与比较匹配中断源 (TOV2 与 OCF2)
• 允许使用外部的 32 kHz 手表晶振作为独立的 I/O 时钟源
综述 Figure 45 为8 位T/C 的方框图。实际的引脚图请参见 P 2“ 引脚配置” 。CPU可访问的I/O 寄
存器,包括 I/O 位和 I/O 引脚以粗体表示。器件具体 I/O 寄存器与位定义见 P 108“ 8位T/C
寄存器说明 ” 。
Figure 45. 8 位 T/C 方框图
TCCRn
DATA BUS
Timer/Counter
Status Flags
TCNTn
=
OCRn
count
clear
direction
Synchronized Status Flags
ASSRn
= 0
Control Logic
TOP BOTTOM
=
0xFF
asynchronous Mode
Select (ASn)
clk
Tn
Prescaler
OCn
(Int. Req.)
Waveform
Generation
Synchronization Unit
T/C
Oscillator
TOVn
(Int. Req.)
clk
OCn
clk
I/O
clk
ASY
TOSC1
TOSC2
I/O
寄存器 定时器 / 计数器 TCNT2、输出比较寄存器 OCR2 为 8 位寄存器。中断请求 ( 图中简写为
Int.Req.)。信号在定时器中断标志寄存器 TIFR 都有反映。 所有中断都可以通过定时器中
断屏蔽寄存器 TIMSK 单独进行屏蔽。图中未给出 TIFR 与 TIMSK。
96
ATmega8(L)
2486N–AVR–07/04
Page 97
ATmega8(L)
T/C 的时钟可以为通过预分频器的内部时钟或通过由TOSC1/2 引脚接入的异步时钟,详见
本节后续部分。异步操作由异步状态寄存器 ASSR 控制。时钟选择逻辑模块控制引起 T/C
计数值增加 ( 或减少 ) 的时钟源。没有选择时钟源时 T/C 处于停止状态。时钟选择逻辑模
块的输出称为 clk
双缓冲的输出比较寄存器 OCR2 一直与 TCNT2 的数值进行比较。波形发生器利用比较结
果产生 PWM 波形或在比较输出引脚 OC2 输出可变频率的信号。参见 P 99 “ 输出比较单
元 ” 。比较匹配结果还会置位比较匹配标志 OCF2 ,用来产生输出比较中断请求。
定义 本文的许多寄存器及其各个位以通用的格式表示。小写的 “n” 表示定时器 / 计数器的序号,
在此即为2 。但是在写程序时要使用精确的格式( 例如使用TCNT2 来访问T/C2 计数器值)。
Table 41 中定义适用于本节。
Table 41. 说明
BOTTOM 计数器计到 0x00 时即达到 BOTTOM
MAX 计数器计到 0xFF ( 十进制的 255) 时即达到 MAX
TOP 计数器计到计数序列的最大值时即达到 TOP。TOP 值可以为固定值 0xFF
。
T2
(MAX),或是存储于寄存器 OCR2 里的数值,具体由工作模式确定
T/C 的时钟源 T/C 可以由内部同步时钟或外部异步时钟驱动。 clk
ASSR 寄存器的 AS2 置位时,时钟源来自于 TOSC1 和 TOSC2 连接的振荡器。详细的异步
操作可以参考 P 110“ 异步状态寄存器- ASSR” ;详细的时钟源与预分频器的内容请参考
P 113“ 定时器 / 计数器预分频器 ” 。
的缺省设置为 MCU 时钟 clk
T2
I/O
。当
2486N–AVR–07/04
97
Page 98
计数器单元 8位T/C 的主要部分为可编程的双向计数单元。 Figure 46即为计数器和它周边电路的方框
图。
Figure 46. 计数器单元方框图
TOVn
DATA BUS
(Int. Req.)
clk
TOSC1
TOSC2
I/O
count
TCNTn Control Logic
clear
direction
clk
Tn
Prescaler
TOP BOTTOM
T/C
Oscillator
信号说明 ( 内部信号 ):
count 使 TCNT2 加 1 或减 1 。
direction 选择加操作或减操作。
clear 清零 TCNT2 ( 将所有的位清零 )。
clk
T2
T/C 的时钟。
top 表示 TCNT2 已经达到了最大值。
bottom 表示 TCNT2 已经达到了最小值 (0) 。
根据不同的工作模式,计数器针对每一个 clk
实现清零、加一或减一操作。clk T2 可以由
T2
内部时钟源或外部时钟源产生,具体由时钟选择位 CS22:0 确定。没有选择时钟源时
(CS22:0 = 0) 定时器停止。但是不管有没有 clk
, CPU 都可以访问 TCNT2 。CPU 写操作
T2
比计数器其他操作 ( 清零、加减操作 ) 的优先级高。
计数序列由 T/C 控制寄存器 (TCCR2) 的 WGM21 和 WGM20 决定。计数器计数行为与输
出比较 OC2 的波形有紧密的关系。有关计数序列和波形产生的详细信息请参考 P 102“ 工
作模式 ” 。
98
T/C 溢出中断标志TOV2 根据WGM21:0 设定的工作模式来设置。TOV2可以用于产生CPU
中断。
ATmega8(L)
2486N–AVR–07/04
Page 99
ATmega8(L)
输出比较单元 8 位比较器持续对 TCNT2 和输出比较匹配寄存器 OCR2 进行比较。一旦 TCNT2 等于
OCR2,比较器就给出匹配信号。在匹配发生的下一个定时器时钟周期里输出比较标志
OCF2 置位。若 OCIE2 = 1 还将引发输出比较中断。执行中断服务程序时 OCF2 将自动清
零,也可以通过软件写 ”1” 的方式进行清零。根据 WGM21:0 和 COM21:0 设定的不同工
作模式,波形发生器可以利用匹配信号产生不同的波形。同时,波形发生器还利用 max
和 bottom 信号来处理极值条件下的特殊情况 ( 见 P 102 “ 工作模式 ” ) 。
Figure 47 为输出比较单元的方框图。
Figure 47. 输出比较单元方框图
DATA BUS
OCRn
TCNTn
= (8-bit Comparator )
OCFn (Int. Req.)
TOP
BOTTOM
FOCn
使用 PWM 模式时 OCR2 寄存器为双缓冲寄存器;而在正常工作模式和匹配时清零模式
双缓冲功能是禁止的。双缓冲可以将更新 OCR2 寄存器与 top 或 bottom 时刻同步起来,
从而防止产生不对称的 PWM 脉冲,消除毛刺。
Waveform Generator
WGMn1:0
COMn1:0
OCxy
2486N–AVR–07/04
访问 OCR2 寄存器看起来很复杂,其实不然。使能双缓冲功能时, CPU 访问的是 OCR2
缓冲寄存器;禁止双缓冲功能时 CPU 访问的则是 OCR2 本身。
99
Page 100
强制输出比较 工作于非 PWM 模式时,可以对强制输出比较位 FOC2 写 ”1” 来产生比较匹配。强制比较
匹配不会置位 OCF2 标志,也不会重载 / 清零定时器,但是 OC2 引脚将被更新,好象真
的发生了比较匹配一样 (COM21:0 决定 OC2 是置位、清零,还是交替变化 )。
写 TCNT2 操作阻止比较匹配 CPU 对 TCNT2 寄存器的写操作会在下一个定时器时钟周期阻止比较匹配的发生,即使此
时定时器已经停止了。这个特性可以用来将 OCR2 初始化为与 TCNT2 相同的数值而不触
发中断。
使用输出比较单元 由于在任意模式下写 TCNT2 都将在下一个定时器时钟周期里阻止比较匹配,在使用输出
比较时改变 TCNT2 就会有风险,不管 T/C 是否在运行。如果写入的 TCNT2 的数值等于
OCR2 ,比较匹配就被忽略了,造成不正确的波形发生结果。类似地,在计数器进行降序
计数时不要对 TCNT2 写入 BOTTOM 。
OC2 的设置应该在设置数据方向寄存器之前完成。最简单的设置 OC2 的方法是在普通模
式下利用强制输出比较 FOC2 。即使在改变波形发生模式时 OC2 寄存器也会一直保持它
的数值。
注意 COM21:0 和比较数据都不是双缓冲的。 COM21:0 的改变将立即生效。
100
ATmega8(L)
2486N–AVR–07/04