同时定时器A还有3个捕获/比较寄存器CCRx,3个捕获/比较控制寄存器CCTLx。
在捕获比较模块中,可读可写。其中CCR0经常用作周期寄存器,其他CCRx相同。
CCTLx捕获/比较寄存器
CMx:选择捕获模式
CCISx:捕获/比较的输入选择
SCS:1,捕获输入信号与定时器时钟信号同步;0,异步捕获
SCCI:被所存的CCI输入信号和EQUx锁存,通过SCCI读出来。
CAP:0,比较模式;1,捕获模式
OUTMODx:选择输出模式
CCI:捕获/比较的输入信号。选择的输入信号通过该位来读出
CCIFGx :捕获比较中断标志。
捕获模式:寄存器CCRx捕获了定时器TAR值时置位
比较模式:定时器TAR值等于寄存器CCRx值时置位
比较模式:这是该定时器的默认模式,在此所有的捕获硬件停止工作。如果此时相应定时器中断允许打开的话,同时开始启动定时器,定时计数器TAR中的数值等于比较寄存器的值时,则产生中断请求。如果没有中断允许,只是响应的中断标志CCIFGx置位。
捕获模式: 主要用于利用信号的上升沿,下降沿或组合,测量外部或内部事件,也可以由软件停止。捕获完成后CCIFGx置位。
Timer_A有两个中断向量,一个单独分配给捕获/比较寄存器CCR0,另一个作为共用的中断向量用于定时器和其他的捕获/比较寄存器。
CCR0中断向量具有最高的优先级,CCIFG0在被中断服务时能自动复位。
CCR1-CCRx和定时器共用另一个中断向量,属于多源中断,对应的中断标志CCIFG1-CCIFGx和TAIFG在读中断向量字TAIV后,自动复位。如果不访问TAIV寄存器,则不能自动复位,需用软件清除。
TAIV中断向量值
还有一点要注意的是:定时器A连续技术模式下,CCR0作为一般的捕获/比较寄存器使用。连续模式可以用来产生独立的时间间隔并输出频率。每个时间间隔完成后就会产生一个中断。在中断到来时,必须在当前中断服务程序下将下一个时间间隔加到CCRx寄存器里,这样按顺序执行,就可以产生周期性的中断,从而向外输出频率,Timer_A最多可以使用3个捕获/比较寄存器输出3个不同的频率。
例程:CCR0捕获/比较寄存器——比较功能中断应用
利用了定时器A模块中的CCR0捕获/比较寄存器的值与定时器A的值进行比较。如果相等就产生CCR0中断,进入Timer_A0中断服务程序进行中断处理,以P1.0作为指示,反转速度=32768/(2*1000)=16.384
ACLK=TACLK=32768hz,MCLK=SMCLK=deflaut DCO~800khz
#include
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P1DIR|=BIT0; //设p1.0为输出
CCTL0 = CCIE; //CCR0开中断运允许
CCR0 =1000-1;
TACTL = TASSEL_1 + MC_1; //ACLK为定时器A的时钟源,增计数模式
_BIS_SR(LPM3_bits+GIE); //进入LPM3,打开全局中断
}
//Timer A0中断服务
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
P1OUT ^=BIT0; //反转P1.0
}
例程 CCR0捕获/比较寄存器-比较功能中断应用
要求:ACLK=TACLK=32khz,MCLK=SMCLK=deflaut DCO~800khz
实现输出:P1.1=CCR0=32768/(2*4)=4096HZ
P1.2=CCR1=32768/(2*16)=1024hz
P1.3=CCR2=32768/(2*100)=163.84hz
P1.0=overflow(溢出)=32768/(2*65536)=0.25HZ
程序我就直接贴图吧,省的贴过来格式又乱了。
例程 CCR1,CCR2捕获/比较寄存器——产生PWM(脉冲宽度调制)波形
程序简述:利用定时器A的自动产生PWM波形输出,从而无需服务程序来产生。本程序CCR0的值作为PWM的周期宽度,CCR1,CCR2的值作为PWM的占空宽。
ACLK=TACLK=LFXT1=32768HZ