登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

译文:mega128(L)AVR单片机16位定时器1

作者:青青子木 栏目:单片机
译文:MEGA128(L)AVR单片机16位定时器1
16位定时计数器
1.    16位定时、计数器(定时计数器1、定时计数器3)
16位定时计数器可以用于精确事件定时,波形发生,信号时序测量的方面。它的主要特性
是:
l    真16位设计(也就是可以16PWM)
l    三个独立的输出比较单元
l    双缓冲的输出比较寄存器
l    一个输入捕捉单元
l    输入捕捉具有噪声滤除功能
l    自动重装入功能
l    PWM功能
l    可变的PWM周期
l    频率发生器
l    外部事件计数器
l    10个独立中断源
(TOV1,OCF1A,OCF1B,OCF1C,ICF1,TOV3,OCF3A,OCF3B,OCF3C,ICF3)
1.    1在ATMEGA103兼容模式中的约束
注意在ATMEGA103兼容模式中只有一个16位定时计数器有效(Timer1/Counter1)。另外还要
注意,在这个模式中Timer1/Counter1只有两个比较寄存器(A、B)
2.    简介
在这章中所提及的寄存器绝大部分拥有相同的结构。通过改变后面的字母n可以选择不同的
定时计数器,通过改变字母x可以改变不同的输出比较单元通道。在程序中必须指明具体的
寄存器或位。例如,TCNT1就是访问定时计数器的内容,依次类推。
图46给出一个16位定时计数器的简单框图,具体IO位置见图2,

2.    1寄存器
   定时计数器(TCNTn),输出比较寄存器(OCRnA/B/C)和输入捕捉寄存器(ICRn)都是
16位寄存器,访问16位寄存器必须采用一些特殊的步骤。这些过程将在“访问16位寄存器”
一节介绍。对于控制寄存器(TCCRnA//B/C)这些8位寄存器,没有CPU访问限制。所有的中
断请求都在定时中断标志寄存器(TIFR)和扩展定时中断标志寄存器(ETIFR)中标出。每个
中断也都可以通过定时中断屏蔽寄存器(TIMSK)和扩展定时中断屏蔽寄存器(ETIMSK)分别予
以屏蔽。由于TIMSK和ETIMSK通其他的定时器单元共享,所有没有列出它的具体性能。
   定时/计数器可以使用经由分频器的内部时钟,也可以使用由Tn引进的外部时钟。时钟选
择逻辑单元决定那一种时钟和那种边沿用于定时/计数器。如果没有时钟源选定,定时/计数
器处于停止状态。时钟选择逻辑的输出指定为定时器时钟(CLKTn)。
   具有双缓冲的输出比较寄存器(OCRnA/B/C/)在所有时间里一直与定时/计数器的内容比
较。比较内容可以用波形发生器在比较输出引脚(OcnA/B/C)上产生PWM或可变频率输出。
具体参见“输出比较单元”一节。输出比较相同事件还可以使比较相同标志(OCFnA/B/C)
置位,它可以生成输出比较中断请求。
   通过外部输入捕捉引脚(ICPn)和模拟比较器所触发(边沿触发)的事件,输入捕捉寄
存器可以捕捉定时/计数器的内容。输入捕捉单元含有数字滤波器可以减小捕捉到噪声尖峰
的机会。
   定时/计数器的最大值可以有许多方法设定,如通过OCRnA寄存器和ICRnA寄存器,也可以
设定成一个固定值。如果在PWM模式中使用OCRnA作为最大值,OCRnA就不能用在生成PWM输出
中。由于这种双缓冲的方式,可让最大值在运行中随时改变。如果只要固定的最大值,可以
使用ICRnA代替。以使OCRnA可以用于PWM输出。
2.    2 常用定义
下面的定义广泛地应用于整个文档中
底    定时/计数器为0000H称之为底
最大    定时/计数器为0xfff(65535)是称之为最大
顶    定时/计数器设定最大值为顶,它可以是固定值如0x00ff,0x001f,0x003f,也可
以由寄存器OCRnA、ICRnA设定。具体以使用模式而定。
2.3 兼容性
此16定时/计数器对于以前的AVR1的16定时/计数器,进行了改进和提高。它完全兼容以前的
特性:
l    所有16定时/计数器包括的寄存器和中断,包括定时中断寄存器
l    所有16定时/计数器中寄存器中的位地址,包括定时中断寄存器
l    中断向量
下面的位发生了名称改变,但功能还是一样的。
PWMn0改为WGMn0
PWMn1改为WGMn1
CTCn  改为WGMn2
下面是增加的寄存器
定时/计数控制寄存器 C(RCCRnC)
输出比较寄存器 C(OCRnCH、OCRnCL合成OCRnC)
下面是增加的位
COM1C1:0  位添加至TCCRnA
FOCnA ,FOCnB和FOCnC添加到新的寄存器C
增加了有关C的输出比较中断标志和屏蔽单元。
16位定时/计数器的性能提高,在一些特别的应用可能影响兼容性。
3.    1  16位寄存器的访问
AVRCPU可以通过8位数据总线访问象TCNTn、OCRnA/B/BC和ICRn这样的16位寄存器。这些寄存
器必须以两次字节访问来读写操作。每个16位寄存器都有一个8位暂寄存器,它用于高位地
址的访问。同样,暂存寄存器由定时单元中的所有16定时器共享。对寄存器低8位访问会触
发整个16位寄存器的读写操作。当CPU写16位寄存器的低位时,暂存寄存器中内容和要写到
低位的数据在同一时钟写如16位寄存器。CPU读16位寄存器的低位时,16位寄存器的高位内
容会与低位数据同一时钟复制到暂存寄存器中。
不是所有的16位寄存器访问都要借助暂存寄存器,16位寄存器OCRnA/B/C。
对于16位写操作,高字节必须在低字节前写入;对于16位读操作,低字节必须在高字节前读
出。
下面的例子说明如何访问16位寄存器,假设期间没有中断修改暂存寄存器,同样的原则也可
用于OCRnA/B/C、ICRn等16位寄存器的访问。注意使用“C”语言时的访问方法。
Assembly Code Examples(1)
...
; Set TCNTn to 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNTnH,r17
out TCNTnL,r16
; Read TCNTn into r17:r16
in r16,TCNTnL
in r17,TCNTnH
...
C Code Examples(1)
unsigned int i;
...
/* Set TCNTn to 0x01FF */
TCNTn = 0x1FF;
/* Read TCNTn into i */
i = TCNTn;


在汇编的例子中TCNTn的返回值在r16:r17中,要特别注意的是,访问16位寄存器是一个自
动连续的操作。在两条指令间有中断发生,并且这个中断也要访问16位寄存器导致暂存寄存
器内容改变的话。那这次访问的结果就可能时错误的。所在进行16位地址访问的时候,要关
闭中断。
下面的例子指出如何自动读取TCNTn,同样的方法也适用于OCRnA//B/C、ICRn。




Assembly Code Example(1)
TIM16_ReadTCNTn:
; Save GLOBAL interrupt flag
in r18,SREG
; Disable interrupts
cli
; Read TCNTn into r17:r16
in r16,TCNTnL
in r17,TCNTnH
; Restore GLOBAL interrupt flag
out SREG,r18
ret
C Code Example(1)
unsigned int TIM16_ReadTCNTn( void )
{
unsigned CHAR sreg;
unsigned int i;
/* Save GLOBAL interrupt flag */
sreg = SREG;
/* Disable interrupts */
_CLI();
/* Read TCNTn into i */
i = TCNTn;
/* Restore GLOBAL interrupt flag */
SREG = sreg;
return i;
}


下面例子说明如何自动写TCNTn寄存器,方法也适用于OCRnA/B/C、ICRn
Assembly Code Example(1)
TIM16_WriteTCNTn:
; Save GLOBAL interrupt flag
in r18,SREG
; Disable interrupts
cli
; Set TCNTn to r17:r16
out TCNTnH,r17
out TCNTnL,r16
; Restore GLOBAL interrupt flag
out SREG,r18
ret
C Code Example(1)
void TIM16_WriteTCNTn( unsigned int i )
{
unsigned CHAR sreg;
unsigned int i;
/* Save GLOBAL interrupt flag */
sreg = SREG;
/* Disable interrupts */
_CLI();
/* Set TCNTn to i */
TCNTn = i;
/* Restore GLOBAL interrupt flag */
SREG = sreg;


3.2 高字节暂存寄存器的重复使用
如果写多于一个的16位寄存器,它们的高位内容相同。那么高位只需要写一次。
4.    定时/计数器的时钟源
定时/计数器可以被内部或外部的时钟源驱动,时钟控制逻辑可以选择时钟源的类型,它由
定时/计数器 控制寄存器B中的时钟选择位(CSn2:0)决定。关于时钟源和分频器可参看
“定时/计数器1,定时/计数器3的时钟源与预分频器”一节。
5.    计数器单元
16位定时/计数器的主要部分是一个可编程16位加/减计数器单元。图47给出此计数器的框图
和周围的控制环境。

                         图   47
『图片请对照ATMEL的datasheet(参见doc2467.pdf)』


2楼: >>参与讨论
dragontao
GOOD
很好的技术资料

3楼: >>参与讨论
双龙老耿
很好,整个ATMEGA128什么时候全译好!
 

http://www.sl.ccom.cn

参与讨论
昵称:
讨论内容:
 
 
相关帖子
请教:关于MEGA8并口下载线
help!!!!!!!!!!!!!!!!!!
哪偉有支持meg8 的code vision (帶解密文件),謝了!
如何从EEPROM中断中跳出来! 谢谢
gcc的程序入口问题。
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号