AVR单片机C语言程序设计实例精粹(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-22 19:58:33

点击下载

作者:张军,宋涛

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

AVR单片机C语言程序设计实例精粹

AVR单片机C语言程序设计实例精粹试读:

内容简介

全书从实用的角度出发,通过大量工程实例,详细介绍了AVR单片机程序设计的方法与技巧。全书共分5篇,第1篇为AVR单片机基础知识篇,简要介绍了AVR单片机的引脚配置、硬件结构、内部资源与集成开发环境;第2篇至第5篇为AVR单片机设计实例篇,通过13个设计实例,详细介绍了AVR单片机在人机接口、接口扩展及网络通信、数据采集与测量系统,以及综合系统开发方面的技术和技巧。书中实例全部来自于实践,代表性和指导性强,利于读者举一反三,是作者多年开发经验的推广与总结。

本书结构清晰、内容合理,13个AVR单片机设计实例,典型实用、易学易懂,全部调试通过,涵盖了AVR单片机的大量开发技术与应用。同时全书对AVR单片机项目开发的步骤和设计思路进行详细讲解,穿插介绍开发经验、技巧与注意事项,对程序代码进行详细注释,利于读者理解和巩固知识点。

本书适合计算机、自动化、电子等相关专业的大学生,以及从事AVR单片机开发的科研人员使用。

第1篇 AVR单片机基础知识

第1章 AVR单片机的硬件结构

AVR单片机是Atmel公司于1997年推出的一款基于RISC指令构架的高性能、低功耗的单片机。Atmel公司的AVR单片机分为低、中、高3档,分别为ATtiny系列、AT90系列和ATmega系列,它们的基本结构都比较相近。本章以ATmega 16单片机为例介绍AVR单片机的硬件结构。

1.1 AVR单片机简介

AVR单片机是Atmel公司推出的一款基于RISC指令架构的高性能、低功耗的8位单片机。所谓精简指令集RISC(Reduced Instruction Set Computer)是20世纪90年代开发出来的,它是综合了半导体集成技术和软件技术性能的新型微处理器架构,是相对于复杂指令集CISC(Complex Instruction Set Computer)而言的。RISC先使用频率通过最高的简单指令、避免复杂指令、采用固定指令长度、减少指令格式和寻址方式等方法来缩短指令周期,提高处理器的运算速度。采用这种RISC结构,使得AVR系列的单片机具备1MIPS/MHz的高速处理能力。

AVR单片机的快速存取寄存器文件由32个通用寄存器组成。32个寄存器全部直接与运算逻辑单元(ALU)相连,每一个寄存器都可以代替累加器工作。这使得微处理器可以在执行当前指令时取出要执行的下一条指令,从而避免了传统的累加器结构造成累加器和存储器之间的数据传输瓶颈效应,提高了系统性能。

在传统的CISC结构中,单片机外部振荡器的时钟被分频降低到内部执行周期。AVR单片机没有对外部时钟分频,它用一个时钟周期来执行一条指令。

AVR单片机采用哈佛(Harvard)总线结构,程序存储器和数据存储器是分开的。微处理器直接访问全部程序存储器和数据存储器。

Atmel公司将高密度、非易失性存储器技术运用在了AVR单片机上面,使得AVR单片机都具有ISP(In System Programming)的功能。即使在程序运行时,也可以对系统进行重新编程。

Atmel公司在AVR高端产品ATmega系列部分单片机中还集成了在线调试单元,通过JTAG即可实现在线调试和程序下载功能。这使得AVR单片机成为一种能满足多种需求的高灵活性和低成本的高速微处理器。

AVR单片机除了支持汇编语言编程外还支持C和Basic等高级语言编程。采用高级语言对系统开发是单片机应用发展的一个趋势。采用高级语言编程能有效地进行系统的开发和程序的移植。

1.2 ATmega 16单片机的特点

ATmega 16单片机是ATmega系列AVR单片机中内部接口丰富、功能齐全、性能价格比较高的产品,它具有如下特点。

高性能、低功耗的8位AVR微处理器。

先进的RISC结构。

由118条指令构成的精简指令集,大多数为单指令周期。

32个8位通用寄存器。

工作在16MHz时具有16MIPS的性能。

只需两个时钟周期的硬件乘法器。

非易失性程序和数据存储器。

16KB的在线可编程Flash存储器,擦写10 000次以上。

具有独立锁定位的可选Boot代码区实现系统内编程,真正地同时进行读写操作。

512B在线可编程EEPROM,寿命为100 000次。

1KB的片内SRAM。

外围器件特点。

两个具有比较模式的可预分频8位定时器/计数器。

1个具有预分频功能、比较功能、捕捉功能的16位定时器/计数器。

具有独立振荡器的实时计数器RTC。

8路10位ADC。

面向字节的两线串行接口。

两个可编程的串行USART。

可工作于主机/从机的SPI串行接口。

具有独立片内振荡器的可编程看门狗定时器。

片内模拟比较器。

处理器特点。

上电复位电路及可编程掉电检测。

片内经过校准的RC振荡器。

片内/片外中断源。

6种睡眠模式。

I/O接口和封装。

32个可编程I/O接口。

40引脚DIP封装,44引脚TQFP封装及MLF封装。

工作电压。

ATmega 16L:2.7~5.5V。

ATmega 16:4.5~5.5V。

速度等级。

ATmega 16L:0~8MHz。

ATmega 16:0~16MHz。

ATmega 16L在1MHz、3V、25℃条件下的功耗。

正常模式:1.1mA。

空闲模式:0.35mA。

掉电模式:<1μA。

1.3 ATmega 16单片机的引脚配置

ATmega 16单片机有PDIP、TQFP和MLF 3种封装形式,如图1-1所示。图1-1 ATmega 16单片机的芯片封装

表1-1是PDIP-40封装的ATmega 16单片机的引脚功能配置。

1.4 ATmega 16单片机的中央处理器

ATmega 16单片机的中央处理器由32个8位通用寄存器、1个算术逻辑运算单元及状态和控制逻辑单元组成,如图1-2所示。图1-2 ATmega 16单片机的中央处理器结构

为了获得最高的性能及并行性,AVR采用了哈佛结构,具有独立的程序总线和数据总线,程序存储器里的指令通过一级流水线运行。CPU在执行一条指令的同时读取下一条指令,即指令预取,这样保证了指令的单周期运行。

快速访问寄存器文件包括32个8位通用寄存器,访问时间为一个时钟周期,从而获得单周期的ALU操作。在典型的ALU操作中,两个位于寄存器文件中的操作数同时被访问,然后执行运算,结果再被送回寄存器文件中。整个过程只需要一个时钟周期的时间。

寄存器文件里面有6个寄存器可以用做3个16位的间接寄存器寻址指针以寻址数据空间,实现高效的地址运算。其中一个指针还可以作为程序存储器查询表的地址指针。这里的附加功能寄存器即为16位的X、Y、Z寄存器。

ALU支持寄存器之间及存储器和常数之间的算术和逻辑运算,也可以执行单周期寄存器操作,运算完成之后状态寄存器的内容得到更新以反映操作结果。

程序流程通过有条件和无条件的跳转指令和调用指令来控制,从而直接寻址整个地址空间,大多数指令长度为16位。

当执行中断和子程序调用时,返回地址存储于堆栈中。堆栈分布于通用数据SRAM中,堆栈大小只受SRAM数量的限制。堆栈放在SRAM最高地址处,进栈减1。在AVR单片机上电时,堆栈指针初始化为0x00,故用户应该注意在程序开始时就初始化16位堆栈指针寄存器SP指向SRAM的高位地址。

1.状态寄存器SREG

状态寄存器包含了最近执行的算术指令的结果信息。在进入中断服务程序时,CPU不会自动保存状态寄存器,在中断返回时也不会自动恢复,这些工作需要软件来完成。

SREG寄存器的定义如下:

位7-I:全局中断使能位。置位时使能全局中断,单独的中断使能由其他独立的寄存器控制。如果I被清零,则不论单独中断标识位置位与否,都不会产生中断。任意一个中断发生之后,I都将被清零,而执行RETI指令后I被置位以重新使能中断。I也可以通过SEI指令和CLI指令来置位和清零。

位6-T:位复制存储位。位复制指令BLD和BST利用T来作为目的或者源地址。BST把寄存器的某一位复制到T,而BLD把T复制到寄存器的某一位。

位5-H:半进位标识位。半进位标志H表示算术操作发生了半进位,此标志对于BCD运算非常有用。

位4-S:符号位。S为负数标识位N与2的补码溢出标识位V的异或。

位3-V:2的补码溢出标识位。

位2-N:负数标识位。表明算术或者逻辑运算的结果为负数。

位1-Z:零标识位。表明算术或者逻辑运算的结果为零。

位0-C:进位标识位。表明算术或者逻辑运算发生了进位。

2.堆栈指针SP

堆栈指针主要用来保存临时数据、局部变量和中断及子程序的返回地址。堆栈指针总是指向堆栈的顶部。AVR的堆栈是向下生长的,即数据被推入堆栈时,堆栈指针值变小。堆栈指针指向数据SRAM堆栈区,在此聚集了子程序堆栈和中断堆栈。调用子程序和使能中断之前必须定义堆栈空间,且堆栈指针必须指向高于0x60的地址空间。使用PUSH指令将数据推入堆栈时SP减1,而子程序或者中断返回地址推入堆栈时SP减2;使用POP指令将数据弹出堆栈时,SP加1,而使用RET或者RETI指令弹出子程序或者中断返回地址时SP加2。

AVR的堆栈指针由I/O空间的两个8位寄存器实现。实际使用的位数与具体器件的SRAM大小有关。

1.5 ATmega 16单片机的存储器组织

ATmega 16单片机的存储器分为独立寻址的Flash程序存储器、片内SRAM数据存储器和EEPROM 3部分,均采用线性编址,其结构如图1-3所示。图1-3 ATmega 16单片机的存储器组织

1.程序存储器Flash

ATmega 16单片机具有16KB(8KB)的在线可编程Flash用以存放指令代码。因为所有的AVR指令都是16位或者32位的,故Flash组成8KB×16位的形式。Flash存储器被分为两个区:引导(Boot)程序区和应用程序区。

ATmega 16的程序计数器PC为13位,因此可以寻址整个8KB的Flash空间。因为ATmega 16单片机的程序计数器PC是13位宽,故可寻址8KB的Flash空间。Flash存储器至少可以擦写10 000次。

2.数据存储器SRAM

ATmega 16具有1120B的片内SRAM,由通用寄存器组(R0~R31)、I/O寄存器和数据存储器SRAM组成。

ATmega 16单片机的SRAM采用线性编制。最低地址段0x0000~0x0001F是寄存器组,依次设置为R0~R31共32个8位通用寄存器。其中最后6个寄存器R26~R31组成X、Y、Z 3个16位的寄存器,用于存放间接寻址的地址指针,如图1-4所示。图1-4 ATmega 16单片机的X、Y、Z寄存器结构

从0x0020~0x005F设置为I/O寄存器,I/O寄存器支持专用的I/O指令访问和SRAM地址访问。当用IN和OUT指令访问I/O寄存器时,地址单元为0x00~0x3F;而把I/O寄存器视做普通SRAM访问时,地址单元则为0x0020~0x005F。

I/O空间中保留的位应改写为“1”,而保留的地址单元一般不应该对其进行操作,否则会对程序的执行产生难以预测的影响。表1-2是ATmega 16单片机的寄存器映射表。

直接给用户使用的SRAM单元为0x006F~0x045F共1024字节,这部分SRAM单元用于存放在程序执行过程中定义的各种变量。

3.数据存储器EEPROM

ATmega 16单片机具有512字节的EEPROM,可以通过对相关的寄存器进行操作来实现对EEPROM按字节进行读写。EEPROM的擦写次数在100 000次以上。

1.6 ATmega 16单片机的系统控制

本节将介绍ATmega 16单片机的系统控制。

1.时钟系统

ATmega 16单片机通过Flash熔丝位来选择系统时钟,如表1-3所示。时钟输入到AVR时钟发生器,再分频到相关的模块。器件出厂时默认设置为CKSEL=“0010”,SUT=“10”。这种默认设置的时钟源为1MHz的内部RC振荡器,启动时间最长,保证用户可以通过ISP或者并行编程器得到所需的时钟源。

说明:对于所有熔丝位,1表示未编程,0表示已编程。

1)晶体振荡器

XTAL1和XTAL2分别是晶体振荡器的反向放大器的输入端和输出端,如图1-5所示。图1-5晶体振荡器

这个振荡器可以使用石英晶体或者陶瓷谐振器,熔丝位CKOPT用来选择这两种放大器模式之一。当CKOPT被编程时振荡器在输出引脚产生满幅度的振荡,这种模式适合于噪声环境及需要通过XTAL2驱动第2个时钟缓冲器的情况,而且这种模式的频率范围比较大。当保持CKOPT未编程状态时,振荡器输出信号幅度比较小,其优点是功耗大大降低,但频率范围较小且不能驱动其他时钟缓冲器。

对于谐振器,CKOPT未编程时最大频率为8MHz;CKOPT编程时最大频率为16MHz。C1和C2的数值要相同,振荡器可以在3种模式下工作,每一种模式都有一个优化的频率范围,如表1-4所示。表1-5给出了熔丝位CKSEL[0]及SUT[1:0]用于选择的启动时间。

2)低频晶体振荡器

为了使用32.768kHz钟表晶体作为器件的时钟源,必须将熔丝位CKSEL[3:0]设置为“1001”已选择低频晶体振荡器。用户可以通过对CKOPT的编程选择使能XTAL1和XTAL2的内部电容(标定值为36pF),从而去掉外部电容。此时启动时间由熔丝位SUT确定,如表1-6所示。图1-6外部RC振荡器

3)外部RC振荡器

对时间不敏感的应用可以使用外部RC振荡器,如图1-6所示。振荡器频率可以通过公式1/3 f RC()来计算,图中电容至少需要22pF。用户可以通过编程熔丝位CKOPT来使能XTAL1和GND之间的片内36pF电容,从而省去外部电容。

振荡器具有4种工作模式,每种模式都有优化的频率范围,通过熔丝位CKSEL[3:0]设定,如表1-7所示。表1-8给出了外部RC振荡器的启动时间。

4)标定的片内RC振荡器

标定的片内RC振荡器提供了固定的1.0MHz、2.0MHz、4.0MHz和8.0MHz的时钟,这些频率都是在5V、25℃的条件下的标定值。表1-9给出了其熔丝位编程值,选择这个时钟(此时不能对CKOPT进行编程)之后无须外部器件。复位时硬件将标定的字节加载到OSCCAL寄存器,自动完成对RC振荡器的标定。表1-10给出了内部RC振荡器启动时间。

振荡器标定寄存器OSCCAL定义如下:

位[7:0]-CAL[7:0]:振荡器标定数据。

将标定数据写入这个地址可以对内部振荡器进行调节以消除生产工艺所带来的振荡器频率偏差。复位时1MHz的标定数据(标识数据的高字节,地址为0x00)自动加载到OSCCAL寄存器。如果需要内部RC振荡器以其他频率工作,则标定数据必须人工加载:首先通过编程器读取标识数据,然后将标定数据保存到Flash或EEPROM中。这些数据可以通过软件读取,然后加载到OSCCAL寄存器。当OSCCAL为零时振荡器以最低频率工作;当对其写入不为零的数据时内部振荡器的频率将增大。写入0xFF即得到最高频率,标定的振荡器用来为访问EEPROM和Flash定时。在写EEPROM和Flash的操作时不要将频率标定到超过标准频率的10%,否则写操作有可能失败。要注意振荡器只对1.0MHz、2.0MHz、4.0MHz和8.0MHz这4种频率进行了标定,其他频率则无法保证。

5)外部时钟

为了从外部时钟源驱动芯片,XTAL1必须如图1-7所示进行连接,同时熔丝位CKSEL必须编程为“0000”。若熔丝位CKOPT也被编程,则用户可以使用内部的XTAL1和GND之间的36pF电容。图1-7外部时钟

在选择外部时钟时,启动时间由熔丝位SUT确定,如表1-11所示。

6)T/C振荡器

对于拥有T/C振荡器引脚(TOSC1和TSOC20)的AVR单片机来说,晶体可以直接连接这两个引脚,而无须外部电容。此振荡器对32.768kHz的钟表晶体做了优化,不建议在TOSC1引脚直接输入振荡信号。

2.电源管理及睡眠模式

睡眠模式可以使AVR单片机关掉没有使用到的模块从而降低功耗,AVR单片机具有不同的睡眠模式允许用户根据实际应用来实施剪裁。进入睡眠模式的条件是执行寄存器MCUCR的SE,然后执行SLEEP指令。具体进入哪一种睡眠模式(空闲模式、ADC噪声抑制模式、掉电模式、省电模式、Standby模式或扩展的Standby模式)由MCUCR寄存器的SM[2:0]决定。进入睡眠模式之后,使能的中断可以将AVR唤醒。经过启动时间,外加4个时钟周期AVR就可以运行中断服务程序了,然后回到SLEEP之后的下一条指令。唤醒时不会改变寄存器文件和SRAM的内容,如果在睡眠过程中发生了复位,则AVR唤醒后从中断向量开始运行。

AVR控制寄存器包含了电源管理的控制位。

位7、5、4-SM[2:0]为休眠模式选择位,如表1-12所示。

注意:仅在使用外部晶体或谐振器时Standby模式和扩展的Standby模式才可用。

位6-SE为休眠模式使能位。

为了使AVR在执行SLEEP指令之后进入休眠模式,SE必须置位,建议在SLEEP指令的前一条指令置位SE, AVR在唤醒之后立即清除SE位。

ATmega 16单片机的各种唤醒模式下的时钟和唤醒源请参考数据表。

3.复位系统

ATmega 16有5个复位源:上电复位、外部复位、看门狗复位、掉电检测复位及JTAG复位。复位时所有的I/O寄存器都被设置为初始值,程序从复位向量开始执行。复位向量处的指令必须是绝对跳转指令JMP,以使程序跳转到复位处理例程。请参考数据表查看各种复位模式的时序。

MCU控制和状态寄存器提供了AVR复位源的信息。

位4-JTRF:JTAG复位标志。通过JTAG指令AVR_RESET可以使JTAG复位寄存器置位,并引发AVR复位及JTRF置位。上电复位将使其清零,也可以通过写0来清除。

位3-WDRF:看门狗复位标志。看门狗复位发生时置位,上电复位将使其清零,也可以通过写0来清除。

位2-BORF:掉电检测复位标志。掉电检测复位发生时置位,上电复位将使其清零,也可以通过写0来清除。

位1-EXTRF:外部复位标志。外部复位发生时置位,上电复位将使其清零,也可以通过写0来清除。

位0-PORF:上电复位标志。上电复位发生时置位,只能通过写0来清除。

为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复位。如果在其他复位发生之前将此寄存器复位,则后续复位源可以通过检查复位标志来了解。

1.7 实例小结

AVR单片机分为ATtiny、AT90和ATmega 3个系列,其内部结构和指令基本相同。本章以ATmega 16单片机为蓝本,介绍了AVR单片机的性能特点、引脚配置、内部结构、中央处理器、存储器组织和系统控制方式,读者通过对本章的学习,将对AVR单片机硬件结构有一定的了解。

第2章 ATmega 16单片机的工作原理

ATmega 16单片机拥有许多外设接口,读者在学习AVR单片机应用开发之前非常有必要熟悉AVR单片机外设接口的工作原理。本章将对I/O端口、定时器、EEPROM、A/D转换器、模拟比较器、看门狗定时器、中断系统等进行系统的介绍。

2.1 ATmega 16单片机的I/O端口

本节将介绍ATmega l6单片机的I/O端口。

2.1.1 I/O端口的工作原理

ATmega 16单片机具有32个通用I/O口,分为PA、PB、PC和PD 4组,每组都是8位。这些I/O口都可以通过各自的端口寄存器设置成输入或者输出,有些I/O口还具有第二功能。

在设置为通用I/O口时,ATmega 16的所有端口的功能都是相同的,并且具有真正的读—修改—写的功能。ATmega 16的内部独特的结构使得输出缓冲器具有对称的驱动能力,可以输出或者吸收大电流,能够直接驱动LED。

所有的端口引脚都具有内部上拉电阻,可以通过寄存器配置独立选择是否连接,复位时所有的引脚都为高阻态。ATmega 16单片机的每个端口都有3个I/O寄存器地址:数据寄存器PORTx(x=A、B、C、D,下同)、方向寄存器PORTx和输入引脚PINx。需要注意的是,端口输入引脚PINx是只读寄存器。对PINx寄存器的某一位写逻辑“1”将造成数据寄存器的相应位发生“0”与“1”的翻转。当寄存器MCUCR的上拉禁止位PUD被置位时,所有端口的引脚上拉电阻都被禁止。不论如何配置DDRxn,都可以通过读引脚PINxn来获得该引脚上的逻辑电平。

表2-1列出了ATmega 16单片机的I/O端口的组合控制设置。

2.1.2 I/O端口相关的寄存器

1.特殊功能寄存器SFIOR

位2-PUD为上拉电阻禁止位。

置位时即使DDRxn和PORTxn配置为使能上拉电阻,I/O端口的上拉电阻也会被禁止。

2.端口A数据寄存器PORTA

PORTA是PA口的数据寄存器,可读可写。在进行写操作时,从PORTA写入的数据将存入内部锁存器以确定PA口的工作状态(端口设定)或者将写入的数据送到外部数据总线(数据传输)。PORTA寄存器的初始值为0x00。

3.端口A方向寄存器DDRA

DDRA是PA口的方向寄存器,可读可写。在进行写操作时,DDRA用于指定PA口是作为输入口还是输出口用;在进行读操作时,从DDRA寄存器读出来的是端口的方向设定值。DDRA寄存器的初始值为0x00。

4.端口A输入引脚PINA

PINA不是端口A的寄存器,这个地址用来访问端口A的逻辑值且只允许进行读操作,从PINA读入的数据反映的是PA口引脚的逻辑状态。单片机初始化时PINA为高阻态。

5.端口B数据寄存器PORTB

PORTB是PB口的数据寄存器,可读可写。在进行写操作时,从PORTB写入的数据将存入内部锁存器以确定PB口的工作状态(端口设定)或者将写入的数据送到外部数据总线(数据传输)。

6.端口B方向寄存器DDRB

DDRB是PB口的方向寄存器,可读可写。在进行写操作时,DDRB用于指定PB口是作为输入口还是输出口用;在进行读操作时,从DDRB寄存器读出来的是端口的方向设定值。DDRB寄存器的初始值为0x00。

7.端口B输入引脚PINB

PINB不是PB口的寄存器,这个地址用来访问端口B的逻辑值且只允许进行读操作,从PINB读入的数据反映的是PB口引脚的逻辑状态。单片机初始化时PINB为高阻态。

8.端口C数据寄存器PORTC

PORTC是PC口的数据寄存器,可读可写。在进行写操作时,从PORTC写入的数据将存入内部锁存器以确定PC口的工作状态(端口设定)或者将写入的数据送到外部数据总线(数据传输)。PORTC寄存器的初始值为0x00。

9.端口C方向寄存器DDRC

DDRC是PC口的方向寄存器,可读可写。在进行写操作时,DDRC用于指定PC口是作为输入口还是输出口用;在进行读操作时,从DDRC寄存器读出来的是端口的方向设定值。DDRC寄存器的初始值为0x00。

10.端口C输入引脚PINC

PINC不是PC口的寄存器,这个地址用来访问端口C的逻辑值且只允许进行读操作,从PINC读入的数据反映的是PC口引脚的逻辑状态。单片机初始化时PINC为高阻态。

11.端口D数据寄存器PORTD

PORTD是PD口的数据寄存器,可读可写。在进行写操作时,从PORTD写入的数据将存入内部锁存器以确定PD口的工作状态(端口设定)或者将写入的数据送到外部数据总线(数据传输)。

12.端口D方向寄存器DDRD

DDRD是PD口的方向寄存器,可读可写。在进行写操作时,DDRD用于指定PD口是作为输入口还是输出口用;在进行读操作时,从DDRD寄存器读出来的是端口的方向设定值。DDRD寄存器的初始值为0x00。

13.端口D输入引脚PIND

PIND不是PD口的寄存器,这个地址用来访问端口D的逻辑值且只允许进行读操作,从PIND读入的数据反映的是PD口引脚的逻辑状态。单片机初始化时PIND为高阻态。

2.2 ATmega 16单片机的定时/计数器0

ATmega 16单片机有3个定时/计数器:T/C0、T/C1和T/C2。其中T/C0和T/C2是两个8位的定时/计数器,而T/C1是16位的定时/计数器。

2.2.1 T/C0的工作原理

T/C0是一个通用的带有输出比较匹配和PWM波形发生器的单通道8位定时/计数器模块。T/C0可以选择通过预分频器由系统时钟驱动,或者通过T0引脚的外部时钟驱动,时钟逻辑模块控制使用哪一个时钟源及哪一个边沿来进行加或者减计数。

T/C0的时钟分频器逻辑如图2-1所示,分频器对系统时钟分频后作为T/C0的驱动时钟。T/C0的时钟可以是系统时钟或者系统时钟的8分频、64分频、256分频及1024分频,通过控制寄存器TCCR0设置。图2-1 T/C0和T/C1的分频逻辑

双缓冲结构的8位输出比较寄存器OCR0一直与T/C0的计数值TCNT0进行比较。一旦TCNT0等于OCR0,比较器就给出匹配信号。在匹配发生的下一个定时器时钟周期输出比较匹配标志OCF0置位,如果输出比较匹配中断使能位OCIE0置位且全局中断使能位I被置位,则CPU将产生输出比较匹配中断。执行中断服务程序时OCF0自动清零,也可以通过软件写“1”来清除OCF0。

T/C0和输出比较引脚行为可以设置4种工作模式:普通模式、CTC(比较匹配清除计数器)模式、快速PWM模式及相位修正的PWM模式。工作模式由TCCR0寄存器的波形发生模式WGM[1:0]及比较输出模式COM[1:0]共同决定。

1.普通模式

普通模式(WGM[1:0]=0)是最简单的工作模式。在此模式下8位计数器TCNT0一直累加,当计数到0xFF之后,由于计数值溢出,TCNT0简单地返回到最小值0x00重新开始计数。在TCNT0为0的同一个时钟周期里,T/C0的溢出标志位TOV0置位。如果T/C0的溢出中断使能位TOIE0被置位且全局中断使能位I被置位,则CPU将产生T/C0溢出中断。执行中断服务程序时TOV0被自动清零。

2.CTC模式

在CTC模式(WGM[1:0]=2)下,OCR0用于调节计数器的分辨率。当计数值TCNT0达到预先设定的OCR0时,TCNT0被自动清零。OCR0定义了计数器的最大计数值。这个模式使得用户可以很容易地控制输出比较匹配的频率。利用OCR0标志可以在计数器数值达到OCR0时产生中断,在中断服务程序里更新OCR0。为了在CTC模式下得到输出波形,可以设置OC0引脚在每次比较匹配发生时改变逻辑电平,这可以通过设置COM[1:0]=1来完成。

3.快速PWM模式

快速PWM模式(WGM[1:0]=3)用来产生高频PWM波形。快速PWM模式与其他PWM模式的不同之处在于其单斜坡的工作方式。计数器从0x00计数到0xFF,然后立即返回到0x00重新开始。对于普通的比较输出模式,输出比较引脚OC0在TCNT0与OCR0匹配时清零,在0x00时置位;对于反向比较输出模式,OC0的动作正好相反。由于使用了单斜坡模式,快速PWM模式的工作频率比使用双斜坡的相位修正PWM模式高一倍。此高频操作特性使得快速PWM模式十分适合于功率调节、整流和DAC应用,高频可以减小外部元件如电感和电容的物理尺寸从而降低系统成本。

4.相位修正PWM模式

相位修正PWM模式(WGM[1:0]=1)为用户提供了一个获得高精度相位修正PWM波形的方法。此模式基于双斜坡操作。计数器重复地从0x00计数到0xFF,然后又从0xFF反向计数到0x00。与单斜坡方式相比,双斜坡操作可获得的最大频率更低,但由于其波形的对称性,十分适合于电机控制应用。

工作于非PWM模式下,可以通过对强制输出比较位FOC0写“1”的方式来产生比较匹配。强制比较匹配不会置位OCF0标志位,也不会重载/清零定时器,但OC0引脚将被更新,好像真的发生了比较匹配一样。但需注意的是,CPU在任意模式下写TCNT0都将在下一个定时器时钟周期里阻止比较匹配。

2.2.2 T/C0相关的寄存器

1.T/C0控制寄存器TCCR0

位7-FOC0:强制输出比较位。FOC0仅在WGM[01:00]设置为非PWM模式时才有效,为了保证与未来器件的兼容性,在使用PWM时,写TCCR0时要对其清零。对其写“1”后波形比较器将立即进行比较操作,比较匹配输出引脚OC0将按照COM[01:00]设置输出相应的电平。要注意FOC0类似于一个锁存信号,真正对强制输出比较起作用的是COM[01:00]的设置。FOC0不会引发任何中断,也不会利用OCR0在CTC模式下对定时器进行清零操作。读FOC0返回值总是0。

位6和位3-WGM[01:00]:波形模式产生位。这两位控制计数器的计数序列、计数器的最大值及产生的波形。T/C0支持的模式有普通模式、CTC模式及两种PWM模式,如表2-2所示。

位5和位4-COM[01:00]:比较匹配输出模式。这些位决定了比较匹配发生时输出引脚OC0的电平。如果COM[01:00]不全为0,则OC0以比较匹配输出的方式进行工作,同时其方向控制位需要设置为1以使能I/O的输出驱动器。当OC0连接到物理引脚上的时候,COM[01:00]的功能依赖于WGM[01:00]的设置。

表2-3给出了WGM[01:00]设置为普通模式或CTC模式时的COM[01:00]的功能。

表2-4给出了当WGM[01:00]设置为快速PWM模式时COM[01:00]的功能。

一个特殊的情况是当OCR0等于0xFF时,比较匹配将被忽略,而计数到0xFF时OC0的动作继续有效。

表2-5给出了当WGM[01:00]设置为相位修正的PWM模式时COM[01:00]的功能。

一个特殊的情况是当OCR0等于0xFF时,比较匹配将被忽略,而计数到0xFF时OC0的动作继续有效。

位[2:0]-CS[02:00]:时钟选择位。用于选择T/C0的时钟源,表2-6给出了T/C0的时针选择位定义。

2.T/C0计数寄存器TCNT0

通过T/C0寄存器可以直接对计数器的8位数据进行读写访问。对TCNT0寄存器的访问将在下一个时钟阻止比较匹配。在计数器运行的过程中修改TCNT0的数值可能丢失一次TCNT0和OCR0的比较匹配。

3.输出比较寄存器OCR0

输出比较寄存器包含一个8位的数据,不间断地与计数寄存器TCNT0的计数值进行比较,匹配事件可以用来产生输出比较中断,也可以用来在OC0引脚上产生波形。

4.T/C中断屏蔽寄存器TIMSK

位1-OCIE0:T/C0输出比较匹配中断使能位。当OCIE0和状态寄存器SREG的全局中断使能位I都置位时,T/C0的输出比较匹配中断使能。当T/C0的比较匹配事件发生,即TIFR中的OCF0置位时,产生输出比较匹配中断。

位0-TOIE0:T/C0溢出中断使能位。当TOIE0和状态寄存器SREG的全局中断使能位I都置位时,T/C0的溢出中断使能。当T/C0发生计数溢出,即TIFR中的TOV0置位时,产生溢出中断。

5.T/C中断标志寄存器TIFR

位1-OCF0:T/C0输出比较标志0。当T/C0与OCR0(输出比较寄存器)的值匹配时,OCF0置位(不管中断是否使能)。此位在执行中断服务程序时硬件清零,也可以由软件写“1”清零。当SREG寄存器中的I和TIMSK中的OCIE0及OCF0都置位时,中断服务程序得到执行。

位0-TOF0:T/C0溢出标志。当T/C0计数溢出时,TOV0置位(不管中断是否使能)。此位在执行中断服务程序时硬件清零,也可以由软件写“1”清零。当SREG寄存器中的I和TIMSK中的TOIE0都置位时,中断服务程序得到执行。需要注意的是,在相位修正的PWM模式中,当T/C0在0x00改变计数方向时TOV0置位。

6.特殊功能寄存器SFIOR

位0-PSR10:T/C1与T/C0的预分频器复位。PSR10置位时T/C1与T/C0的预分频器复位,操作完成后这一位由硬件清零。写入0时不会引起任何操作。T/C1与T/C0共用这一预分频器,且预分频复位对两个定时器都有影响。读该位总是返回0。

2.3 ATmega 16单片机的定时/计数器1

本节将介绍ATmega 16单片机的定时/计数器1。

2.3.1 T/C1的工作原理

T/C1是一个通用的带有一路具备噪声抑制输入捕获、两路独立输出比较和PWM波形发生器的16位定时器/计数器模块。T/C1可以选择通过预分频器由系统时钟驱动,或者通过T1引脚的外部时钟驱动。时钟逻辑模块控制使用哪一个时钟源及哪一个边沿来进行加或者减计数。

T/C1与TC0共用一个分频器,如图2-1所示。分频器对系统时钟分频后作为T/C1的驱动时钟。T/C1的时钟可以是系统时钟或者系统时钟的8分频、64分频、256分频及1024分频,通过控制寄存器TCCR1设置。

当输入捕获引脚ICP1或者模拟比较器输入引脚有输入捕获事件产生(边沿触发)时,T/C1计数值自动被传输到输入捕获寄存器保存起来。T/C1的噪声抑制器通过一个简单的数字滤波方案提高系统抗噪性,它对输入信号进行4次采样确认,只有连续4次采样值相同时,输出才会送到边沿检测器。一旦检测到捕获事件,捕获标志位ICF1将置位。如果输入捕获中断使能位TICIE置位且全局中断使能位I被置位,则CPU将产生输入捕获中断。执行中断服务程序时ICF1自动清零,也可以通过软件写“1”来清除ICF1。

双缓冲结构的16位输出比较寄存器OCR1A/OCR1B一直与T/C1的计数值TCNT1进行比较。一旦TCNT1等于OCR1A/OCR1B,比较器就给出匹配信号。在匹配发生的下一个定时器时钟周期输出比较匹配标志OCF1A/OCF1B置位。如果输出比较匹配中断使能位OCIE1A/OCIE1B置位且全局中断使能位I被置位,则CPU将产生输出比较匹配中断。执行中断服务程序时OCF1A/OCF1B自动清零,也可以通过软件写“1”来清除OCF1A/OCF1B。

T/C1和输出比较引脚行为可以设置5种工作模式:普通模式、CTC(比较匹配清除计数器)模式、快速PWM模式、相位修正的PWM模式及相位和频率修正的PWM模式。工作模式由TCCR1A/TCCR1B寄存器的波形发生模式WGM1[3:0]及比较输出模式COM1A[1:0]、COM1B[1:0]共同决定。

1.普通模式

普通模式(WGM1[3:0]=0)是最简单的工作模式。在此模式下16位计数器TCNT1一直累加,当计数到0xFFFF之后,由于计数值溢出,TCNT1简单的返回到最小值0x0000重新开始计数。在TCNT1为0的同一个时钟周期里T/C1的溢出标志位TOV1置位。如果T/C1的溢出中断使能位TOIE1被置位且全局中断使能位I被置位,则CPU将产生T/C1溢出中断。执行中断服务程序时TOV1被自动清零。

2.CTC模式

在CTC模式(WGM1[3:0]=4或者12)下,OCR1A或ICR1寄存器用于调节计数器的分辨率。当计数值TCN1达到预先设定的OCR1A(WGM1[3:0]=4)或者ICR1(WGM1[3:0]=12)时,TCNT1被自动清零。OCR1A或ICR1定义了计数器的最大计数值。这个模式使得用户可以很容易地控制输出比较匹配的频率。利用OCF1A或ICF1标志可以在计数器达到预设值时产生中断,在中断服务程序里更新预设值。为了在CTC模式下得到输出波形,可以设置OC1A引脚在每次比较匹配发生时改变逻辑电平,这可以通过设置COM1A[1:0]=1来完成。

3.快速PWM模式

快速PWM模式(WGM1[3:0]=5、6、7、14或15)用来产生高频PWM波形。快速PWM模式与其他PWM模式的不同之处在于其单斜坡的工作方式。计数器从0x0000计数到设定的最大值,然后立即返回到0x0000重新开始。对于普通的比较输出模式,输出比较引脚OC1A/OC1B在TCNT1与OCR1A/1OCR1B匹配时置位,在最大值时清零;对于反向比较输出模式,OC1A/OC1B的动作正好相反。由于使用了单斜坡模式,快速PWM模式的工作频率比使用双斜坡的相位修正PWM模式高一倍。此高频操作特性使得快速PWM模式十分适合于功率调节、整流和DAC应用,高频可以减小外部元件如电感和电容的物理尺寸从而降低系统成本。

快速PWM模式计数器的最大值可固定为8、9或10位,也可由ICR1或OCR1A定义。计数器的计数值一直累加到固定值0x00FF、0x01FF、0x3FF(WGM1[3:0]=5、6或7)、ICR1(WGM1[3:0]=14)或OCR1A(WGM1[3:0]=15),然后在下一个时钟周期清零。计数器达到最大值时T/C1溢出标志TOV1置位。若最大值是由OCR1A或ICR1定义的,则OC1A或ICF1标志将与TOV1在同一个时钟周期置位。

工作于快速PWM模式时,比较单元可以在OC1A/OC1B引脚上输出PWM波形。设置COM1A[1:0]/COM1B[1:0]为2可以产生普通的PWM波形;设置COM1A[1:0]/COM1B[1:0]为3则可以产生反向PWM波形。

4.相位修正PWM模式

相位修正PWM模式(WGM1[3:0]=1、2、3、10或11)为用户提供了一个获得高精度相位修正PWM波形的方法。此模式基于双斜坡操作。计数器重复地从0x0000计数到最大值,然后又从最大值反向计数到0x0000。在一般的比较输出模式下,当计数器向上计数时若TCNT1与OCR1A/OCR1B匹配,则OC1A/OC1B清零为低电平;而在向下计数时若TCNT1与OCR1A/OCR1B匹配,则OC1A/OC1B置位为高电平。工作于反向输出比较时则正好相反。与单斜坡方式相比,双斜坡操作可获得的最大频率更低,但由于其波形的对称性,十分适合于电机控制应用。

相位修正PWM模式计数器的最大值固定为8、9、10位,或由ICR1或OCR1A定义。

计数器的数值一直累加到固定值0x00FF、0x01FF、0x03FF(WGM1[3:0]=1、2或3)、ICR1(WGM1[3:0]=10)或OCR1A(WGM1[3:0]=11),然后改变计数方向。

工作于相位修正PWM模式时,比较单元可以在OC1A/OC1B引脚输出PWM波形。设置COM1A[1:0]/COM1B[1:0]可以产生普通的PWM波形,设置COM1A[1:0]/COM1B[1:0]为3可以产生反向PWM波形。

5.相位与频率修正PWM模式

相位与频率修正PWM模式(WGM1[3:0]=8或9)简称相频修正模式,可以产生高精度相位与频率都准确的PWM波形。与相位修正模式类似,相频修正PWM模式基于双斜坡操作。计数器重复地从0x0000计数到最大值,然后又从最大值反向计数到0x0000。在一般的比较输出模式下,当计数器向上计数时若TCNT1与OCR1A/OCR1B匹配,则OC1A/OC1B清零为低电平;而在向下计数时若TCNT1与OCR1A/OCR1B匹配,则OC1A/OC1B置位为高电平。工作于反向输出比较时则正好相反。与单斜坡方式相比,双斜坡操作可获得的最大频率更低,但由于其波形的对称性,十分适合于电机控制应用。

相频修正PWM模式与相位修正PWM模式的主要区别在于OCR1A/OCR1B寄存器的更新时间。

相频修正PWM模式计数器的最大值由ICR1或OCR1A定义。计数器的数值一直累加到ICR1(WGM1[3:0]=10)或OCR1A(WGM1[3:0]=11),然后改变计数方向。

工作于相位修正PWM模式时,比较单元可以在OC1A/OC1B引脚输出PWM波形。设置COM1A[1:0]/COM1B[1:0]可以产生普通的PWM波形,设置COM1A[1:0]/COM1B[1:0]为3可以产生反向PWM波形。

工作于非PWM模式下,可以通过对强制输出比较位FOC1A/FOC1B写“1”的方式来产生比较匹配。强制比较匹配不会置位OCF1A/OCF1B标志位,也不会重载/清零定时器,但OC1A/OC1B引脚将被更新,好像真的发生了比较匹配一样。但需要注意的是,CPU在任意模式下写TCNT1都将在下一个定时器时钟周期里阻止比较匹配。

T/C1的TCNT1、OCR1A、OCR1B及ICR1都是16位的寄存器。AVR CPU通过8位数据总线访问这些寄存器,读写寄存器需要2次操作。每个16位寄存器都有一个8位临时寄存器来存放高8位数据。每个定时器所属的16位寄存器共用相同的临时寄存器。访问低字节会触发16位读或写操作。在写16位寄存器时,应该先写入该寄存器的高位数据,而读16位寄存器时应该先读寄存器的低位数据。

2.3.2 T/C1相关的寄存器

1.T/C1控制寄存器TCCR1A

位7:6-COM1A[1:0]:通道A的比较输出模式。

位5:4-COM1B[1:0]:通道B的比较输出模式。

COM1A[1:0]与COM1B[1:0]分别控制OC1A与OC1B的状态,COM1A[1:0]或COM1B[1:0]的1位或2位被写“1”,OC1A或OC1B输出功能将取代I/O端口功能。此时OC1A或OC1B相应的输出引脚数据方向控制必须置位以使能输出驱动器。

OC1A或OC1B与物理引脚连接时,COM1A[1:0]或COM1B[1:0]的功能由WGM1[3:0]的设置决定。

表2-7给出了WGM1[3:0]设置为普通模式与CTC模式(非PWM)时COM1A[1:0]、COM1B[1:0]的功能定义。

表2-8给出了WGM[3:0]设置为快速PWM模式时COM1A[1:0]、COM1B[1:0]的功能定义。

表2-9给出了WGM[3:0]设置为相位修正PWM模式及相频修正PWM模式时COM1A[1:0]、COM1B[1:0]的功能定义。

位3-FOC1A:通道A强制输出比较。

位2-FOC1B:通道B强制输出比较。

FOC1A、FOC1B只有当WGM[3:0]指定为非PWM模式时才被激活。为与未来器件兼容,工作在PWM模式对TCCR1A写入时,这两位必须清零。当FOC1A、FOC2B位置1时,立即强制波形产生单元进行比较匹配。COM1A[1:0]、COM1B[1:0]的设置改变OC1A、OC1B的输出。FOC1A、FOC1B位作为选通信号,COM1A[1:0]、COM1B[1:0]位的值决定强制比较的结果。

在CTC模式下使用OCR1A作为计数最大值,FOC1A、FOC1B选通既不会产生中断也不会清除定时器。FOC1A、FOC1B位读总是0。

位1:0-WGM1[1:0]:波形发生模式。

这两位与位于TCCR1B寄存器的WGM1[3:2]一起用于控制计数器的计数序列,即计数器的上限值和确定波形发生器的工作模式。T/C1支持的工作模式有普通模式、CTC模式及3种PWM模式。波形产生模式如表2-10所示。

2.T/C1控制寄存器TCCR1B

位7-ICNC1:输入捕获噪声抑制使能位。置位ICNC1将使能输入捕获噪声抑制功能,此时外部引脚ICP1的输入被滤波,其作用是从ICP1引脚连续进行4次采样。如果4次采样值都相同,那么信号将送入边沿检测器。因此使能该功能使得输入捕获被延迟4个时钟周期。

位6-ICES1:输入捕获触发边沿选择。置位ICES1选择逻辑电平的上升沿触发输入捕获;清零选择下降沿触发输入捕获。

位5-保留位:为与将来的器件相兼容,写TCCR1B时此位必须写入0。

位4:3-WGM1[3:2]:波形发生模式。

位2:0-CS1[2:0]:T/C1时钟选择。时钟选择位如图2-11所示。

3.T/C1计数寄存器TCNT1

TCNT1由两个8位寄存器TCNT1H和TCNT1L组成,通过它们可以直接对T/C1的计数寄存器进行读写访问。

4.T/C1输出比较寄存器OCR1A、OCR1B

OCR1A(OCR1B)由两个8位寄存器OCR1AH、OCR1AL(OCR1BH、OCR1BL)组成。该寄存器中的16位数据与TCNT1寄存器中的16位计数值进行连续比较,一旦数据匹配,即产生一个输出比较中断或改变OC1A、OC1B输出逻辑电平。

5.T/C1输入捕获寄存器ICR1

ICR1由两个8位寄存器ICR1H、ICR1L组成。当外部引脚ICP1(或T/C1的模拟比较器)有输入捕获信号产生时,计数器TCNT1中的数据将自动写入ICR1中。ICR1的设定值可作为计数器的最大计数值。

6.T/C中断屏蔽寄存器TIMSK

位5-TICIE1:T/C1输入捕获中断使能位。当该位被置1且状态寄存器中的I位被置1时,T/C1的输入捕获中断使能。一旦TIFR的ICF1置位,CPU即开始执行T/C1输入捕获中断服务程序。

位4-OCIE1A:T/C1输出比较匹配A中断使能位。当该位被置1且状态寄存器中的I位被置1时,T/C1的输出比较匹配A中断使能。一旦TIFR的OCF1A置位,CPU即开始执行T/C1输出比较匹配A中断服务程序。

位3-OCIE1B:T/C1输出比较匹配B中断使能位。当该位被置1且状态寄存器中的I位被置1时,T/C1的输出比较匹配B中断使能。一旦TIFR的OCF1B置位,CPU即开始执行T/C1输出比较匹配B中断服务程序。

位2-TOIE1:T/C1溢出中断使能位。当该位被置1且状态寄存器中的I位被置1时,T/C1的溢出中断使能。一旦TIFR的TOV1置位,CPU即开始执行T/C1溢出中断服务程序。

7.T/C中断标志寄存器TIFR

位5-ICF1:T/C1输入捕获中断标志位。外部引脚ICP1出现捕获事件时ICF1置位(不管该中断是否使能)。此外当ICR1作为计数器的最大计数值时,一旦计数器达到此值,ICF1即置位。执行输入捕获中断服务程序时此位自动清零,也可通过对其写“1”清零。

位4-OCIF1A:T/C1输出比较匹配A中断标志位。当TCNT1与OCR1A匹配时,该位被置位(不管该中断是否使能),强制输出比较FOC1A不会置位该位。执行输出比较匹配A中断服务程序时,该位自动清零,也可通过对其写“1”清零。

位3-OCIF1B:T/C1输出比较匹配B中断标志位。当TCNT1与OCR1B匹配时,该位被置位(不管该中断是否使能),强制输出比较FOC1B不会置位该位。执行输出比较匹配B中断服务程序时,该位自动清零,也可通过对其写“1”清零。

位2-TOV1:T/C1溢出中断标志位。该位的设置与T/C1的工作模式相关,工作于普通模式和CTC模式时,T/C1溢出时TOV1置位(不管该中断是否使能);工作在其他模式下的TOV1标志位的置位情况如表2-10所示。

执行溢出中断服务程序时TOV1自动清零,也可通过对其写“1”清零。

2.4 ATmega 16单片机的定时/计数器2

本节将介绍ATmega 16单片机的定时/计数器2。

2.4.1 T/C2的工作原理

T/C2是一个通用的单通道带有输出比较匹配和PWM波形发生器的8位定时/计数器模块。T/C2可以选择通过预分频器由系统时钟驱动,或者通过TOSC1和TOSC2引脚接入的异步时钟驱动。

T/C2的时钟分频器逻辑如图2-2所示,时钟选择逻辑模块的输出称为clkT2S。分频器对clkT2S分频后作为T/C2的驱动时钟。分频器可以对clkT2S进行1分频、8分频、32分频、64分频、128分频、256分频及1024分频,通过控制寄存器TCCR2设置。图2-2 T/C2的分频逻辑

双缓冲结构的8位输出比较寄存器OCR2一直与T/C2的计数值TCNT20进行比较。一旦TCNT2等于OCR2,比较器即给出匹配信号。在匹配发生的下一个定时器时钟周期输出比较匹配标志OCF2置位。如果输出比较匹配中断使能位OCIE2置位且全局中断使能位I被置位,则CPU将产生输出比较匹配中断。执行中断服务程序时OCF2自动清零,也可以通过软件写“1”来清除OCF0。

T/C2和输出比较引脚行为可以设置4种工作模式:普通模式、CTC(比较匹配清除计数器)模式、快速PWM模式及相位修正的PWM模式。工作模式由TCCR2寄存器的波形发生模式WGM2[1:0]及比较输出模式COM2[1:0]共同决定。

1.普通模式

普通模式(WGM2[1:0]=0)是最简单的工作模式。在此模式下8位计数器TCNT2一直累加,当计数到0xFF之后,由于计数值溢出,TCNT2简单地返回到最小值0x00重新开始计数。在TCNT2为0的同一个时钟周期里T/C2的溢出标志位TOV2置位。如果T/C2的溢出中断使能位TOIE2被置位且全局中断使能位I被置位,则CPU将产生T/C2溢出中断。执行中断服务程序时TOV2被自动清零。

2.CTC模式

在CTC模式(WGM2[1:0]=2)下,OCR2用于调节计数器的分辨率。当计数值TCNT2达到预先设定的OCR2时,TCNT2被自动清零。OCR2定义了计数器的最大计数值。这个模式使得用户可以很容易地控制输出比较匹配的频率。利用OCR2标志可以在计数器数值达到OCR2时产生中断,在中断服务程序里更新OCR2。为了在CTC模式下得到输出波形,可以设置OC2引脚在每次比较匹配发生时改变逻辑电平,这可以通过设置COM2[1:0]=1来完成。

3.快速PWM模式

快速PWM模式(WGM2[1:0]=3)用来产生高频PWM波形。快速PWM模式与其他PWM模式的不同之处在于其单斜坡的工作方式。计数器从0x00计数到0xFF,然后立即返回到0x00重新开始。对于普通的比较输出模式,输出比较引脚OC2在TCNT2与OCR2匹配时清零,在0x00时置位;对于反向比较输出模式,OC2的动作正好相反。由于使用了单斜坡模式,快速PWM模式的工作频率比使用双斜坡的相位修正PWM模式高一倍。此高频操作特性使得快速PWM模式十分适合于功率调节、整流和DAC应用,高频可以减小外部元件如电感和电容的物理尺寸从而降低系统成本。

4.相位修正PWM模式

相位修正PWM模式(WGM2[1:0]=1)为用户提供了一个获得高精度相位修正PWM波形的方法。此模式基于双斜坡操作。计数器重复地从0x00计数到0xFF,然后又从0xFF反向计数到0x00。与单斜坡方式相比,双斜坡操作可获得的最大频率更低,但由于其波形的对称性,十分适合于电机控制应用。

工作于非PWM模式下,可以通过对强制输出比较位FOC2写“1”的方式来产生比较匹配。强制比较匹配不会置位OCF2标志位,也不会重载/清零定时器,但OC2引脚将被更新,好像真的发生了比较匹配一样。但需要注意的是,CPU在任意模式下写TCNT2都将在下一个定时器时钟周期里阻止比较匹配。

2.4.2 T/C2相关的寄存器

1.T/C2控制寄存器TCCR2

位7-FOC2:强制输出比较位。FOC2仅在WGM2[1:0]设置为非PWM模式时才有效。为了保证与未来器件的兼容性,在使用PWM时,写TCCR2时要对其清零。对其写“1”后波形比较器将立即进行比较操作,比较匹配输出引脚OC2将按照COM2[1:0]设置输出相应的电平。要注意FOC2类似于一个锁存信号,真正对强制输出比较起作用的是COM2[1:0]的设置。FOC2不会引发任何中断,也不会利用OCR2在CTC模式下对定时器进行清零操作。读FOC2返回值总是0。

位6和位3-WGM2[1:0]:波形模式产生位。这2位控制计数器的计数序列、计数器的最大值及产生的波形。T/C2支持的模式有普通模式、CTC模式及两种PWM模式,如表2-12所示。

位5和位4-COM2[1:0]:比较匹配输出模式。这些位决定了比较匹配发生时输出引脚OC2的电平。如果COM2[1:0]不全为0,则OC2以比较匹配输出的方式进行工作。同时其方向控制位需要设置为1以使能I/O的输出驱动器。当OC2连接到物理引脚上的时候,COM2[1:0]的功能依赖于WGM2[1:0]的设置。

表2-13给出了WGM2[1:0]设置为普通模式或CTC模式时的COM2[1:0]的功能。

表2-14给出了当WGM2[1:0]设置为快速PWM模式时COM2[1:0]的功能。

一个特殊的情况是当OCR2等于0xFF时,比较匹配将被忽略,而计数到0xFF时OC2的动作继续有效。

表2-15给出了当WGM2[1:0]设置为相位修正的PWM模式时COM2[1:0]的功能。

一个特殊的情况是当OCR2等于0xFF时,比较匹配将被忽略,而计数到0xFF时OC2的动作继续有效。

位[2:0]-CS2[2:0]:时钟选择位。用于选择T/C2的分频系数,T/C2的时钟选择位定义如表2-16所示。

2.T/C2计数寄存器TCNT2

通过T/C2寄存器可以直接对计数器的8位数据进行读写访问。对TCNT2寄存器的访问将在下一个时钟阻止比较匹配。在计数器运行的过程中修改TCNT2的数值可能丢失一次TCNT2和OCR2的比较匹配。

3.输出比较寄存器OCR0

输出比较寄存器包含一个8位的数据,不间断地与计数寄存器TCNT2的计数值进行比较,匹配事件可以用来产生输出比较中断,也可以用来在OC2引脚上产生波形。

4.T/C中断屏蔽寄存器TIMSK

位7-OCIE2:T/C2输出比较匹配中断使能位。当OCIE2和状态寄存器SREG的全局中断使能位I都置位时,T/C2的输出比较匹配中断使能。当T/C2的比较匹配事件发生,即TIFR中的OCF2置位时,产生输出比较匹配中断。

位6-TOIE2:T/C2溢出中断使能位。当TOIE2和状态寄存器SREG的全局中断使能位I都置位时,T/C2的溢出中断使能。当T/C2发生计数溢出,即TIFR中的TOV2置位时,产生溢出中断。

5.T/C中断标志寄存器TIFR

位7-OCF2:T/C2输出比较标志。当T/C2与OCR2(输出比较寄存器)的值匹配时,OCF2置位(不管中断是否使能)。此位在执行中断服务程序时硬件清零,也可以由软件写“1”清零。当SREG寄存器中的I和TIMSK中的OCIE2及OCF2都置位时,中断服务程序得到执行。

位6-TOF2:T/C2溢出标志。当T/C2计数溢出时,TOV2置位(不管中断是否使能)。此位在执行中断服务程序时硬件清零,也可以由软件写“1”清零。当SREG寄存器中的I和TIMSK中的TOIE2都置位时,中断服务程序得到执行。需要注意的是,在相位修正的PWM模式中,当T/C2在0x00改变计数方向时TOV2置位。

6.特殊功能寄存器SFIOR

位1-PSR2:T/C2的预分频器复位。PSR2置位时T/C2的预分频器复位,操作完成后这一位由硬件清零,写入0时不会引起任何操作。读该位总是返回0。

7.异步状态寄存器ASSR

位3-AS2:T/C1异步时钟选择位。AS2为0时T/C2由系统时钟clkI/O驱动,AS2为1时T/C2由连接在TOSC1和TOSC2的晶体振荡器驱动。改变AS2有可能破坏TCNT2、OCR2和TCCR2的内容。

位2-TCN2UB:TCNT2更新中。T/C2工作于异步模式时,写TCNT2将引起TCN2UB置位。当TCNT2从暂存器更新完毕之后TCN2UB硬件自动清零。TCN2UB为0表明TCNT2可以写入新的数据。

位1-OCR2UB:OCR2更新中。T/C2工作于异步模式时,写OCR2将引起OCR2UB置位。当OCR2从暂存器更新完毕之后OCR2UB硬件自动清零。OCR2UB为0表明OCR2可以写入新的数据。

位0-TCR2UB:TCCR2更新中。T/C2工作于异步模式时,写TCCR2将引起TCR2UB置位。当TCCR2从暂存器更新完毕之后TCR2UB硬件自动清零。TCR2UB为0表明TCCR2可以写入新的数据。

注意,在更新标志位置位的时候写上述任何一个寄存器都将引起数据的破坏,并引发不必要的中断。

2.5 ATmega 16单片机的EEPROM存储器

本节将介绍ATmega 16单片机的EEPROM存储器。

2.5.1 EEPROM存储器概述

ATmega 16单片机片内有512字节的EEPROM,它是作为一个独立的数据空间而存在的。ATmega 16单片机的EEPROM采用独立线性编址,其地址范围为0x0000~0x1FF。

ATmega 16单片机通过对相关寄存器的操作实现对EEPROM按字节进行读写。EEPROM的写入时间在2.5~4ms之间,取决于VCC的电压。自定时功能可使用用户软件检测何时写入下一个字节。当执行EEPROM的读写操作时,单片机会停止工作两个时钟周期后再执行下一条指令。

2.5.2 EEPROM存储器相关的寄存器

1.EEPROM地址寄存器EEARH、EEARL

EEPROM地址寄存器EEAR用于指定某个EEPROM单元的地址,512字节EEPROM线性编址为0x0000~0x01FF。地址寄存器EEAR可读可写,EEAR寄存器的初始值没有意义,在访问EEPROM之前必须为其指定正确的地址。

2.EEPROM数据寄存器EEDR

EEPROM数据寄存器EEDR存放即将写入EEPROM或者从EEPROM读出的某个单元的数据,写入或者读入的地址由EEPROM的地址寄存器EEAR给出,EEPROM按字节进行读写。EEPROM数据寄存器EEDR可读可写,初始值为0x00。

3.EEPROM控制寄存器EECR

EEPROM控制寄存器EECR用于控制单片机对EEPROM的操作。

位7~4:保留位。读这些位时总为0。

位3-EERIE:EEPROM中断准备好使能位。当EERIE位置1而且全局中断I置位时,如果EEWR为0,则单片机产生一个中断表示写操作完成。

位2-EEMWIE:EEPROM主写使能位。EEMWE决定了EEWE位置位是否可以启动EEPROM写操作。当EEMWE置位时,在4个时钟周期内置位EEWE将把数据写入EEPROM的指定地址。若EEMWE为0,则操作EEWE不起作用。在EEMWE置位后4个周期,硬件对其清零。

位1-EEWE:EEPROM写使能位。EEWE为EEPROM写操作的使能信号。当EEPROM的数据和地址被正确设置后,需置位EEWE以便将数据写入EEPROM。此时EEMWE必须被置位,否则EEPROM写操作不会发生。EEPROM写操作顺序如下。(1)等待EEWE变为0。(2)等待SPMCSR中的SPMEN位清零。(3)在EEAR中写入新地址(可选)。(4)在EEDR中写入新数据(可选)。(5)置位EEMWE。(6)在EEMWE置位后的4个时钟周期内置位EEWE。

在EEWE置位后的2.5~4ms后,EEWE被硬件清零,用户可以通过查询此位判断写操作是否完成。注意如果在第(5)步和第(6)步之间发生了中断,则EEPROM写操作将失败(写超时),因此用户需要考虑在写操作器件执行关中断动作,写操作完成后再开发中断。

位0-EERE:EEPROM读使能位。EERE为EEPROM的读使能位。当EEPROM的数据和地址被正确设置后,置位EERE将执行读操作。当EEPROM中的数据被读取到数据寄存器EEDR中后,EERE被硬件清零。用户可以通过查询此位来判断读操作是否完成。

2.6 ATmega 16单片机的模拟比较器

本节将介绍ATmega 16单片机的模拟比较器。

2.6.1 模拟比较器的结构及工作原理

ATmega 16单片机的模拟比较器对正极AIN0和负极AIN1引脚的模拟信号进行比较。当AIN0上的电压比AIN1上的电压高时,模拟比较器的输出ACO置位。比较器的输出可用来触发T/C1的输入捕获功能。此外,比较器还可以触发自己专有的独立中断。用户可以选择比较器是以上升沿、下降沿还是交替变化的边沿来触发中断。

ATmega 16单片机允许通过ADC复用器在ADC[7:0]中任意选择一个通道来代替比较器的负极输入。为了使用这个功能,ADC必须被禁用。如果模拟比较器复用器使能(SFIOR寄存器中的ACME置位),且ADC也已经被禁用(ADCSRA寄存器中的ADEN清零),则可以通过ADMUX寄存器中的MUX[2:0]位来选择替代模拟比较器负极输入的引脚信号,如表2-17所示。

2.6.2 模拟比较器相关的寄存器

1.模拟比较器控制和状态寄存器ACSR

位7-ACD:模拟比较器禁用。ACD置位时模拟比较器电源被切断。可以在任何时候置位此位来关掉比较器,这可以减少器件的功耗。改变ACD位时,必须清零ACSR寄存器的ACIE位来禁止模拟比较器中断,否则ACD改变时可能产生不必要的中断。

位6-ACBG:选择模拟比较器的能隙基准源。ACBG置位后,模拟比较器的正极输入由能隙基准源取代,否则AIN0连接到比较器的正极输入端。能隙基准电压在1.15~1.35V之间,典型值为1.23V。

位5-ACO:模拟比较器输出。模拟比较器的输出经过同步后直接连接到ACO,同步机制引入了1~2个时钟周期的延时。

位4-ACI:模拟比较器中断标志位。当比较器的输出事件触发了由ACIS1和ACIS0定义的中断模式时,ACI置位。如果ACIE和SREG寄存器的全局中断使能位I也置位,那么模拟比较器中断服务程序将被执行,同时ACI被硬件清零。ACI也可以通过软件写“1”清零。

位3-ACIE:模拟比较器中断使能。当ACIE位被置位且状态寄存器SREG中的全局中断使能位I也被置位时,模拟比较器中断被使能。

位2-ACIC:模拟比较器输入捕获使能。ACIC置位后允许通过模拟比较器来触发T/C1的输入捕获功能,此时模拟比较器的输出直接连接到输入捕获模块的前段逻辑,从而使得比较器可以利用T/C1输入捕获中断逻辑的噪声抑制器及触发边沿选择功能。ACIC为0时模拟比较器与T/C1的输入捕获模块没有任何联系。为了使比较器可以触发T/C1的输入捕获中断,定时器中断屏蔽寄存器TIMSK的TICIE1必须置位。

位1:0-ACIS[1:0]:模拟比较器中断模式选择。这两位确定模拟比较器的中断事件。需要改变设置时,必须清零ACSR寄存器中的中断使能位ACIE以禁止中断,避免修改设置时产生不必要的中断,如表2-18所示为模拟比较器中断模式的选择。

2.7 ATmega 16单片机的A/D转换器

本节将介绍ATmega 16单片机的A/D转换器。

2.7.1 A/D转换器的工作原理

ATmega 16单片机集成了一个10位的逐次逼近型A/D转换器。A/D转换器与一个8通道的模拟多路复用器连接,能对来自端口A的8路单端输入电压进行采样。单端输入电压以0V(GND)为基准。ATmega 16还支持16路差分电压输入。两路差分输入(ADC1、ADC0与ADC3、ADC2)具有可编程增益级,在A/D转换前给差分输入电压提供0db(1x)、20db(10x)和46db(200x)的放大级。7路差分模拟输入通道共享一个通用负端(ADC1),而其他任何ADC输入可做正输入端。如果使用1x或10x增益,可得到8位分辨率。如果使用200x增益,则可得到7位分辨率。

A/D转换器包括一个采样保持电路,以确保在转换过程中输入到ADC的电压保持恒定。ADC由模拟电源AVCC和模拟地AGND供电。模拟地AGND与数字地GND相连。模拟电源AVCC与数字电源VCC的电压差别不能大于0.3V。AREF为外部参考电压输入端,此电压应该在AGND和AVCC之间。ATmega 16片内设置了一个标称值为2.56V的基准电压,可以通过软件设置与AREF相连接使用内部电压基准。为了更好地抑制噪声,可以在AREF引脚上加一电容进行去耦。

ATmega 16单片机的A/D转换器具有±2LSB的精确度和0.5LSB的集成非线性度,转换时间在65~260μs之间。最高分辨率时采样率可达15kSPS。

通过设置ADCSRA寄存器的ADEN位启动ADC。只有当ADEN置位时参考电压和输入通道选择才生效,向ADC启动转换ADSC写“1”可以启动单次转换。在转换过程中此位保持为高,转换结束后被硬件清零。如果在转换过程中选择了另一个通道,那么ADC将在当前转换结束之后再改变通道。ADC转换具有不同的触发源,通过ADCSRA寄存器的ADC自动触发使能位ADATE设置。设置ADCSRB寄存器的ADC触发选择位ADTS可以选择触发源。当所选的触发信号产生上升沿时,ADC预分频器复位并开始转换。这提供了一个以固定的时间间隔启动转换的方法。转换结束后及时触发信号仍存在,也不会启动一次新的转换。即使特定的中断或者全局中断使能位为0,中断标志位仍然会置位。这样可以在不产生中断的情况下触发一次转换。如果需要在下次中断事件产生时触发新的转换,则中断标志位必须被清零。使用ADC中断标志作为触发源,可以在正在进行的转换结束之后即开始下一次ADC转换,之后ADC便工作在连续转换模式下,持续地进行采样并对ADC数据寄存器进行更新。第一次转换通过向ADCSRA寄存器的ADSC写“1”来启动。在此模式下,后续的ADC转换不依赖于ADC中断标志位是否置位。如果使能了自动触发,则置位ADCSR寄存器中的ADSC将启动首次转换。ADSC标志还可以用来检测转换是否在进行中。不论转换是如何启动的,在转换过程中ADSC都一直为1。

在默认条件下逐次逼进电路需要一个从50~200kHz的输入时钟以获得最大精度。如果所需的转换精度低于10比特,那么输入时钟频率可以高于200kHz以获得更高的转换率。正常的AD转换需要13个ADC时钟周期,为了初始化模拟电路,ADC使能后的第一次转换需要25个ADC时钟周期。在普通的ADC转换过程中,采样保持在转换启动之后的1.5个ADC时钟开始;而第一次的ADC转换的采样保持则发生在转换启动之后的13.5个ADC时钟周期。转换结束之后ADC结果被送入ADC数据寄存器且ADIF标志置位。ADSC同时清零(单次转换模式),之后软件可以再次置位ADSC在ADC时钟的第一个上升沿启动新的一次转换。当使用自动触发时,触发事件将复位预分频器。在这种模式下,采样保持发生在触发信号上升沿后的两个ADC时钟周期内,为了实现同步逻辑需要额外的3个CPU时钟周期,如果使用了差分模式,由于不是由ADC转换结束实现的自动触发,所以每次转换都需要25个ADC时钟周期,因为每次转换结束之后都要关闭ADC然后又启动它。在连续转换模式下,当ADSC为1时只要转换一结束下一次转换马上开始。

ADC的参考电源VREF反映了ADC的转换范围。若单端通道电平超过了VREF,则其结果将接近0x3FF。VREF可以是AVCC、内部2.56V基准电压或是外接于AREF引脚的电压。AVCC通过一个无源开关与ADC相连,如果将一个固定电源连接到AREF引脚,那么用户就不能选择其他的基准源了,否则会引起片内基准源和外部参考源的短路。

为了减小ATmega 16的内外部数字电路产生的电磁干扰(EMI)对模拟测量精度的影响,在对A/D转换精度要求很高时可以通过模拟地线与数字地线单点相连、尽量缩短模拟信号通路并远离高速数字通路或模拟电源端AVCC要通过一个RC网络连接到数字电源VCC。如果端口A的一些引脚用做数字输出口则在ADC转换过程中尽量不要改变其状态。这些方式都有助于减小噪声干扰,提高ADC的转换精度。

2.7.2 A/D转换器相关的寄存器

1.ADC多工选择寄存器ADMUX

位7:6-REFS[1:0]:ADC参考电压选择,这两位选择ADC的参考电压。如果在转换过程中改变了设置,则只有等到当前转换结束(ADCSRA寄存器中的ADIF置位)之后新的设置才会起作用。如果在AREF引脚上施加了外部参考电压,则内部参考电压不能被选择。ADC参考电压选择位如表2-19所示。

位5-ADLAR:ADC转换结果对齐位,ADLAR位影响ADC转换结果在ADC数据寄存器中的存放形式。ADLAR置位时转换结果为左对齐,否则为右对齐。

位[4:0]-MUX[4:0]:模拟通道与增益选择位。这几位选择连接到ADC模拟输入通道,也可以对差分通道增益进行设置。如果在转换过程中改变了设置,则只有等到当前转换结束(ADCSRA寄存器中的ADIF置位)之后新的设置才会起作用。模拟通道与增益选择位如表2-20所示。

2.ADC控制和状态寄存器ADCSRA

位7-ADEN:ADC使能位。ADEN置位即启动ADC,否则ADC功能关闭,在转换过程中关闭ADC将立即终止正在进行的转换。

位6-ADSC:ADC开始转换。在单次转换模式下,ADSC置位将启动一次ADC转换。在连续转换模式下ADSC置位将启动首次转换。第一次转换(在ADC启动之后置位ADSC,或者在使能ADC的同时置位ADSC)需要25个ADC时钟周期,而不是正常的13个。第一次转换执行ADC初始化工作。

位5-ADATE:ADC自动触发使能。ADATE置位将启动ADC自动触发功能,触发信号的上升沿启动ADC转换,触发信号源通过SFIOR寄存器的ADC触发信号源选择位ADTS设置。

位4-ADIF:ADC中断标志位。ADC转换结束且数据寄存器被更新后,ADIF置位。如果ADIE及SREG寄存器中的全局中断使能位I被置位,则ADC转换结束中断服务程序将被执行,同时ADIF硬件清零,也可以通过软件写“1”清零。

位3-ADIE:ADC中断使能位。若ADIE及SREG中的I置位,则ADC转换结束中断将被使能。

位[2:0]-ADPS[2:0]:ADC预分频器选择位。这3位决定ADC输入时钟与CPU时钟之间的分频系数,ADC分频系数选择如表2-21所示。

3.ADC数据寄存器ADCL及ADCH

ADC转换结束后,转换结果将存储在这两个寄存器中。如果采用差分通道采样,则数据将以2的补码形式存放。在读取ADCL之后,ADC数据寄存器需要等到ADCH也被读出之后才会更新数据寄存器。因此,如果转换结果为左对齐而且只需要8位精度,那么仅需要读取ADCH就足够了。否则必须先读出ADCL然后再读ADCH。

ADMUX寄存器中的ADLAR及MUXn会影响转换结果在数据寄存器中的存放形式。

当ADLAR=0时:

当ADLAR=1时:

4.特殊功能IO寄存器SFIOR

位[7:]-ADTS[2:0]:ADC自动触发源选择。若ADCSRA寄存器中的ADATE置位,则ADTS的值将确定触发ADC转换的触发源,否则ADTS的设置没有意义。被选中的中断标志位在其上升沿触发ADC转换。从一个中断标志清零的触发源切换到中断标志置位的触发源将产生一个上升沿。如果此时ADCSRA寄存器中的ADEN置位,则ADC将启动转换。切换到连续运行模式时,即使ADC中断标志位已经置位也不会产生触发事件。ADC自动触发源选择如表2-22所示。

2.8 ATmega 16单片机的TWI接口

本节将介绍ATmega 16单片机的TWI接口。

2.8.1 TWI接口的工作原理

ATmega 16单片机的TWI接口是一个简单但强大而灵活的通信接口。TWI协议允许系统设置者只需要两根双向传输线就可以将128个不同的设备互连。这两根线一根是时钟线SCL,另一根是数据线SDA。外部硬件只需要两个上拉电阻,每根线上各一个。TWI协议支持主机和从机操作,可以工作在发送器模式下接收器模式下。TWI协议支持128个设备的互连,所有连接到总线上的设备都有自己的地址。TWI协议支持多主机仲裁和高达400Kbps的数据传输率。所有TWI兼容的器件的总线驱动都是漏极开路或集电极开路的,这样就实现了对接口非常关键的线与功能。当TWI器件输出为0时,TWI总线会产生低电平。当所有的TWI器件输出为三态时,总线就会输出高电平,允许上拉电阻将电压拉高。

TWI协议规定了如下定义。

主机:启动和停止传输的设备,主机产生SCL时钟。

从机:被主机寻址的设备。

发送器:将数据发送到总线的设备。

接收器:从总线读取数据的设备。

1)数据传输

TWI总线上数据位的时钟与时钟脉冲同步。时钟线为高时,数据线电压必须保持稳定,除非是在启动与停止的状态下,如图2-3所示。图2-3 TWI数据传输

2)START和STOP信号

TWI协议规定由主机启动和停止数据传输。主机在总线发出START信号启动数据传输,在总线上发出STOP信号以停止数据传输。在START信号和STOP信号之间,如果总线忙,则不允许其他主机控制总线,将发出一个新的START信号,被称为REPEATEDSTART信号,这适合于主机在不放弃总线控制的情况下启动新的传输。START和STOP信号是在SCL线为高电平时改变SDA电平实现的,如图2-4所示。图2-4 TWI控制状态

3)地址数据包格式

所有在TWI总线上传输的地址包均为9位,包括7位地址位、1位读/写控制位和1位应答位。如果读/写位为1,则执行读操作,否则执行写操作。从机在被寻址后,必须在第9个时钟周期内将SDA线拉低作为应答ACK。若从机忙或者因其他原因无法响应主机,则应该在此时将SDA线保持为高做NACK。然后主机可以发出STOP或者REPEATED START信号重新开始传送。地址字节传送时,首先传送MSB位,最后是LSB位,如图2-5所示。图2-5 TWI地址包格式

4)数据包格式

所有在TWI总线上传输的数据包均为9位,包括8位数据位和1位应答位。在数据传送过程中,主机产生时钟及START和STOP信号而接收器应答。应答是通过在第9个SCL周期拉低SDA线来实现的,如果接收器使SDA为高,则发出的是NACK信号。接收器在完成接收后应该在收到最后字节后发出NACK来告知发送器停止发送。在数据传送时,首先发送MSB位,最后发送LSB位,如图2-6所示。图2-6 TWI数据包格式

5)完整的传输过程

发送主要由START状态、地址+读/写、至少一个数据包及STOP信号组成,如图2-7所示。图2-7 TWI完整的传输过程

2.8.2 TWI接口相关的寄存器

1.TWI比特率寄存器TWBR

位[7:0]-TWBR[7:0]:TWI比特率寄存器,TWBR为比特率发生器分频因子。TWI工作于主机模式时,比特率发生器控制时钟信号SCL的周期,由TWBR和状态寄存器TWSR的预分频系数决定;当TWI工作于从机模式时,不需要设定比特率寄存器或预分频系数,但从机的CPU频率必须大于TWI时钟线SCL频率的16倍。在主机模式下SCL频率通过下面的公式计算:

Note

为了保持传输的稳定,TWI工作在主机模式时TWBR的值不应小于10。

2.TWI控制寄存器TWCR

TWCR:用来控制TWI操作。它用来使能TWI,通过施加START到总线上来启动主机访问,产生接收器应答,产生STOP状态,以及在写入数据到TWDR寄存器时控制总线的暂停等。这个寄存器还可以给出在TWDR无法访问期间,试图将数据写入到TWDR而引起的写入冲突信息。

位7-TWINT:TWI中断标志。当TWI完成当前工作,希望应用程序介入时TWINT置位。若SREG的I标志及TWCR寄存器的TWIE标志也置位,则MCU执行TWI中断例程。当TWINT置位时,SCL信号的低电平被延长。TWINT标志的清零必须通过软件写“1”来完成。执行中断时硬件不会自动将其改写为0。要注意的是,只要这一位被清零,则TWI立即开始工作。因此在清零TWINT之前一定要首先完成对地址寄存器TWAR、状态寄存器TWSR及数据寄存器TWDR的访问。

位6-TWEA:使能TWI应答。TWEA标志控制应答脉冲的产生。若TWEA置位,则出现如下条件时接口发出ACK脉冲。

器件的从机地址与主机发出的地址相符合。

TWAR的TWGCE置位时接收到广播呼叫。

在主机/从机接收模式下接收到一个字节的数据。

将TWEA清零可以使器件暂时脱离总线,置位后器件重新恢复地址识别。

位5-TWSTA:TWI START状态标志。当CPU希望自己成为总线上的主机时需要置位TWSTA。TWI硬件检测总线是否可用。若总线空闲,接口就在总线上产生START状态。若总线忙,接口就一直等待,直到检测到一个STOP状态,然后产生START以声明自己希望成为主机。发送START之后软件必须清零TWSTA。

位4-TWSTO:TWI STOP状态标志。在主机模式下,如果置位TWSTO,则TWI接口将在总线上产生STOP状态,然后TWSTO自动清零。在从机模式下,置位TWSTO可以使接口从错误状态恢复到未被寻址的状态。此时总线上不会有STOP状态产生,但TWI返回一个定义好的未被寻址的从机模式且释放SCL与SDA为高阻态。

位3-TWWC:TWI写碰撞标志。当TWINT为低时,写数据寄存器TWDR将置位TWWC。当TWINT为高时,每一次对TWDR的写访问都将更新此标志。

位2-TWEN:TWI使能。TWEN位用于使能TWI操作与激活TWI接口。当TWEN位被写为“1”时,TWI引脚将I/O引脚切换到SCL与SDA引脚,使能波形斜率限制器与尖峰滤波器。如果该位清零,TWI接口模块将被关闭,所有TWI传输将被终止。

位1-保留位:读返回值为0。

位0-TWIE:使能TWI中断。当SREG的I及TWIE置位时,只要TWINT为1,TWI中断就激活。

3.TWI状态寄存器TWSR

位[7:3]-TWS:TWI状态位。这5位用来反映TWI逻辑和总线的状态,从TWSR读出的值包括5位状态值与2位预分频值。检测状态位时设计者应屏蔽预分频位为0,这使状态检测独立于预分频器设置。

位2-保留位:读返回值为0。

位[1:0]-TWPS[1:0]:TWI预分频位,这两位可读/写,用于控制比特率预分频因子。比特率预分频器设置如表2-23所示。

4.TWI数据寄存器TWDR

在发送模式下,TWDR包含了要发送的字节;在接收模式下,TWDR包含了接收到的数据。当TWI接口没有进行移位工作(TWINT置位)时这个寄存器是可写的。在第一次中断发生之前用户不能够初始化数据寄存器。只要TWINT置位,TWDR的数据就是稳定的。在数据移出时,总线上的数据同时移入寄存器。TWDR总是包含了总线上出现的最后一个字节,除非MCU是在掉电或省电模式下被TWI中断唤醒。此时TWDR的内容没有定义。当总线仲裁失败时,主机将切换为从机,但总线上出现的数据不会丢失。ACK的处理由TWI逻辑自动管理,CPU不能直接访问ACK。

位[7:0]-TWD[7:0]:TWI的数据寄存器。根据状态的不同,其内容为要发送的下一个字节,或是接收到的数据。

5.TWI地址寄存器TWAR

TWAR的高7位为从机地址。工作于从机模式时,TWI将根据这个地址进行响应。主机模式不需要此地址。在多主机系统中,TWAR需要进行设置以便其他主机访问自己。TWAR的LSB用于识别广播地址(0x00)。器件内有一个地址比较器,一旦接收到的地址和本机地址一致,芯片就请求中断。

位[7:1]-TWA[7:0]:TWI从机地址寄存器,其值为从机地址。

位[0]-TWGCE:使能TWI广播识别,置位后MCU可以识别TWI总线广播。

2.9 ATmega 16单片机的看门狗定时器

本节将介绍ATmega 16单片机的看门狗定时器。

2.9.1 看门狗工作原理

ATmega 16单片机的看门狗由片内独立的振荡器驱动,其内部结构如图2-8所示。图2-8看门狗定时器结构

在VCC由5V供电时,看门定时器狗典型的时钟频率为1MHz。通过调整看门狗定时器的预分频因数可以改变看门狗的复位时间。如果看门狗定时时间已到,而且没有复位看门狗定时器的指令,则看门狗定时器溢出将导致单片机复位。

2.9.2 看门狗定时器相关的寄存器

1.看门狗定时器控制器WDTCR

看门狗定时器控制器WDTCR用于控制看门狗的开启和关闭并设置看门狗的定时时间。

位[7:5]:保留位,读操作总是返回0。

位4-WDTOE:看门狗功能修改使能。清零WDE时必须置位WDTOE,否则不能禁止看门狗。一旦置位,硬件将在紧接着的4个时钟周期后将其清零。

位3-WDE:看门狗开启使能。当WDE为1时,看门狗使能;否则看门狗将被禁止。只有在WDTOE为1时WDE才能清零。看门狗的关闭必须按照如下顺序进行。(1)在同一个指令周期内将WDTOE和WDE置位,即使WDE已经置位。(2)在上述操作后的4个时钟周期内清除WDE位。

位[2:0]-WDP[2:0]:看门狗定时器预分频位。这几位决定看门狗定时器的预分频系数,如表2-24所示。

2.10 ATmega 16单片机的中断系统

本节将介绍ATmega 16单片机的中断系统。

2.10.1 ATmega 16单片机的中断系统

ATmega 16单片机具有21个中断源,如表2-25所示。每一个中断源都有一个独立的中断向量作为中断服务程序的入口地址,而且所有的中断源都有自己独立的使能位。如果全局中断I和相应的中断使能位都置位,则在中断标志位置位时将执行中断服务程序。

ATmega 16单片机的程序空间最低位置自动定义为复位及中断向量完整的中断表。在中断向量表中处于低地址的中断具有高的优先级,所以RESET具有最高的优先级。

注意:(1)熔丝位BOOTRST被编程时,ATmega 16复位后程序将跳转到BootLoader。(2)当寄存器GICR的IVSEL置位时,中断向量转移到Boot区的起始地址,此时各个中断向量表的实际地址为表中地址与Boot区起始地址之和,如表2-26所示。

一个中断产生后,全局中断使能位I将被清零,后续中断被屏蔽。用户可以在中断服务程序里面对I置位从而开放中断,在中断返回后全局中断位I将重新置位。当程序计数器指向中断向量开始执行相应的中断服务程序时,对应中断标志位将被硬件清零。这些中断标志位也可以通过软件写“1”来清除。当一个符合条件的中断发生后,如果相应的中断使能位为0,则中断标志位将挂起并一直保持到中断执行或者被软件清除。如果全局中断标志I被清零则所有的中断都不会被执行直到I置位。然后被挂起的各个中断按中断优先级依次被处理。外部电平中断没有中断标志位,因此当电平变为非中断电平后中断条件即终止。

AVR的中断响应时间最少为4个时钟周期。在这4个时钟周期里,程序计数器PC的2字节自动入栈,而堆栈指针SP减2,在通常情况下中断向量为一个相对跳转指令。此跳转要花两个时钟周期。如果中断在一个多周期指令执行期间发生,则在此多周期指令执行完后MCU才会执行中断服务程序。中断返回也需4个时钟周期的时间,在此期间,入栈的程序计数器PC将被弹出栈,SREG的位I被置位。如果在中断期间发生了其他中断,则AVR在退出中断程序后要执行一条主程序指令之后才能再响应被挂起的中断。AVR硬件在中断或其他函数中并不操作状态寄存器SREG, SREG的存储由用户软件完成。对于那些由可以保持为静态的事件,如输出比较寄存器1与T/C1值相匹配而引发中断事件发生后,中断标志将置位。如果中断标志被清除而中断条件仍然存在,则标志只有在新事件发生后才会置位。外部电平中断会一直保持到中断条件结束。

2.10.2 中断相关寄存器

1.MCU控制寄存器MCUCR

位[3:2]-ISC1[1:0]:外部中断1触发方式,如表2-27所示。外部中断1由引脚INT1激发,在检测边沿前MCU首先采样INT1引脚上的电平。如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成。

位[1:0]-ISC0[1:0]:外部中断0触发方式,如表2-28所示。外部中断0由引脚INT0激发,在检测边沿前MCU首先采样INT0引脚上的电平。如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成。

2.MCU控制与状态寄存器MCUCSR

位6-ISC2:外部中断2触发方式,异步外部中断2由外部引脚INT2激发。若ISC2清零,则INT2的下降沿激活中断;若ISC2置1,则INT2的上升沿激活中断。INT2的边沿触发方式是异步的,只要INT2引脚上产生宽度超过50ns就会引发中断。若选择了低电平中断,则低电平必须保持到当前指令完成才会产生中断。而且只要将引脚拉低,就会引发中断请求。改变ISC2时有可能发生中断。因此建议首先在寄存器GICR里清除相应的中断使能位INT2,然后再改变ISC2。最后,不要忘记在重新使能中断之前通过对GIFR寄存器的相应中断标志位INTF2写“1”使其清零。

3.通用中断控制寄存器GICR

位7-INT1:使能外部中断请求1。当INT1为1且状态寄存器SREG的I标志置位时,相应的外部引脚中断使能。MCU通用控制寄存器MCUCR的中断敏感电平控制ISC11与ISC10决定中断是由上升沿、下降沿,还是INT1电平触发的。只要使能,即使INT1引脚被配置为输出,只要引脚电平发生了相应的变化,中断就将产生。

位6-INT0:使能外部中断请求0。当INT0为1且状态寄存器SREG的I标志置位时,相应的外部引脚中断使能。MCU通用控制寄存器MCUCR的中断敏感电平控制ISC01与ISC00决定中断是由上升沿、下降沿,还是INT0电平触发的。只要使能,即使INT0引脚被配置为输出,只要引脚电平发生了相应的变化,中断就将产生。

位5-INT2:使能外部中断请求2。当INT2为1且状态寄存器SREG的I标志置位时,相应的外部引脚中断使能。MCU通用控制寄存器MCUCSR的中断敏感电平控制ISC2决定中断是由上升沿还是下降沿触发的。只要使能,即使INT2引脚被配置为输出,只要引脚电平发生了相应的变化,中断就将产生。

4.通用中断状态寄存器GIFR

位7-INTF1:外部中断标志1。INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。如果SREG的位I及GICR寄存器相应的中断使能位INT1为1,MCU即跳转到相应的中断向量。进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入“1”来清零。

位6-INTF0:外部中断标志0。INT0引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF0。如果SREG的位I及GICR寄存器相应的中断使能位INT0为1,MCU即跳转到相应的中断向量。进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入“1”来清零。

位5-INTF2:外部中断标志2。INT2引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF2。如果SREG的位I及GICR寄存器相应的中断使能位INT2为1,MCU即跳转到相应的中断向量。进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入“1”来清零。注意,当INT2中断禁用进入某些休眠模式时,该引脚的输入缓冲将禁用。这会导致INTF2标志设置信号的逻辑变化。

2.11 实例小结

对单片机的片内资源进行充分的开发利用是设计AVR单片机应用系统的关键。本章详细介绍了AVR单片机外设的编程原理,包括I/O端口、定时器、EEPROM、A/D转换器、模拟比较器、看门狗定时器、中断系统。需要注意的是,由于后面实例中将具体介绍USART、SPI串口通信编程,为了避免重复,本章并没有涉及。

第3章 集成开发环境ICC AVR

AVR系列单片机的集成开发环境有Image Craft公司的ICC A VR和Atmel公司的A VR_Studio等。其中ICC AVR因支持标准C语言对AVR系列单片机的编程而得到了广泛的应用。ICC AVR严格来说只是支持AVR单片机程序设计的一个C编译器,它并不提供对程序的软件仿真功能。然而ICC AVR对源程序编译输出的*cof映像文件可以与AVR_Studio无缝地连接,通过AVR_Studio调试器来对程序进行软件仿真,因此本章将重点对ICC AVR进行介绍。

3.1 集成开发环境ICC AVR简介

Image Craft公司开发的ICC AVR是一种使用符合ANSI标准的C语言来开发AVR系列单片机的开发工具。ICC AVR是一个综合了编辑器、工程管理器和C编译器的集成工作环境IDE,可在Windows 9X/NT/XP下工作。

ICC AVR采用工程项目管理方式,将源文件全部组织到工程之中。文件的编辑Edit和工程的构筑(Build)也在这个环境中完成。编译错误显示在状态窗口中,并且当用鼠标单击编译错误时,光标会自动跳转到编辑窗口中引起错误的那一行。工程管理器还能直接产生可以直接使用的INTEL HEX格式的文件,INTEL HEX格式文件可被大多数的编程器支持用于下载程序到芯片中去。

ICC AVR是一个32位的程序,支持长文件名。本书并不介绍通用的C语言语法知识,仅介绍使用ICC AVR所必须具备的知识,因此假设读者在阅读本书之前已经对C语言有了一定程度的了解。

本章以ICC AVR 6.30版本为例介绍ICC AVR集成开发环境的应用。读者可以从Image Craft公司或者双龙公司(www.sl.com.cn)的官方网站上下载ICC AVR 6.30的试用版,在本书的配套光盘中包含了该软件。

3.2 ICC AVR的安装和注册

本节将介绍ICC AVR的安装和注册。

3.2.1 安装ICC AVR

ICC AVR集成开发环境的安装过程如下。(1)打开安装程序所在的文件夹,双击图标进入安装界面,如图3-1所示。(2)按照屏幕提示,选择程序的安装目录,如图3-2所示。这里默认将软件安装在C盘根目录下的icc文件夹中。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载