MSP430F169 Timer_A原理(二)------Timer_A捕获模式
2022-10-08 来源:csdn
**
捕获模式
**
CAP = 1 时选择捕获模式。捕获模式用于记录时间事件。它可用于速度计算或时间测量。捕获输入 CCIxA 和 CCIxB 连接到外部引脚或内部信号,并通过 CCISx 位进行选择。 CMx 位选择输入信号的捕捉沿为上升沿、下降沿或两者兼有。捕获发生在输入信号的选定边沿。如果发生捕捉:
定时器值被复制到 TACCRx 寄存器中
中断标志 CCIFG 置位
输入信号电平可以随时通过 CCI 位读取。 MSP430x1xx 系列器件可能有不同的信号连接到 CCIxA 和 CCIxB。有关这些信号的连接,请参阅特定于器件的数据表。
捕获信号可能与定时器时钟异步并导致竞争条件。设置 SCS 位将使捕获与下一个定时器时钟同步。建议设置 SCS 位以将捕获信号与定时器时钟同步。这在图 11-10 中进行了说明。
每个捕获/比较寄存器中都提供了溢出逻辑,以指示在读取第一次捕获的值之前是否执行了第二次捕获。发生这种情况时,COV 位被设置,如图 11-11 所示。 COV 必须用软件重置。
(捕获可以由软件启动。 CMx 位可以设置为在两个边沿进行捕获。然后软件设置 CCIS1 = 1 并切换位 CCIS0 以在 VCC 和 GND 之间切换捕获信号,每次 CCIS0 更改状态时启动捕获)
一、捕获模式的介绍
1、捕获模式是在应用中很常用的一种模式,可以进行脉冲计数,侧量脉宽,可以用作小球计数、频率计、超声波测距等应用中。
2、捕获模式可以捕捉上升沿,也可以捕捉下降沿。需要对寄存器进行具体设置。
3、捕获模式的实质就是在捕获上升沿或者下降沿的同时进入捕获中断,执行中断服务函数,同时把TAR计数的值赋给 TACCR0或TACCR1、TACCR2(要看具体用的是哪个引脚的捕获),从而捕获到当前TAR(计数器)的值。
4、捕获模式类似于51单片机的计数器,但是又与计数器工作原理有很大差别,功能也比计数器强大。它既可以脉冲计数也可以计算一个脉冲宽度(也就是高电平的时间或者低电平的时间),也可以计算脉冲周期(一个脉冲整个周期的时间)。
二、捕获模式的使用
(一)、要设置的相关寄存器(每个寄存器有16位)
TimerA 控制寄存器 TACTL
捕获/比较寄存器 0 TACCR0 (TA0对应P11 P15 P22)
捕获/比较寄存器 1 TACCR1 (TA1对应P12 P16 P23)
捕获/比较寄存器 2 TACCR2 (TA0对应P13 P17 P23)
捕获/比较控制寄存器 0 TACCTL0 (控制TA0口相关功能)
捕获/比较控制寄存器 1 TACCTL1 (控制TA1口相关功能)
捕获/比较控制寄存器 2 TACCTL2 (控制TA2口相关功能)
(二)、看图,TA0 TA1 TA2 图上IO口都有标注,捕获就是从这几个引脚输入的
只要捕获到上升沿或者下降沿,就会进入Timer_A中断。
(三)、把P12做捕获输入相关寄存器的设置方法
例子:P12做捕获输入(TA1)
TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//开捕获模式,上升沿捕获,CCI1A输入,同步捕//获,中断允许
P1DIR &=~ BIT2; //P1.2输入
P1SEL |=BIT2; //P1.2第二功能,捕获输入
例子:P23做捕获输入(TA1)
TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//开捕获模式,上升沿捕获,CCI1A输入,同步捕//获,中断允许
P2DIR &=~ BIT3; //P2.3输入
P2SEL |=BIT3; //P2.3第二功能,捕获输入
总结的方法:1、先对Timer_A的工作方式进行设置TACTL,TACTL一定要设置其中一种计数模式,其他寄存器按应用功能而定
2、对相关捕获/比较控制寄存器进行设置:TACCTL1(设置工作模式)
3、打开总中断
4、初始化IO口
5、写中断服务函数
#pragma vector=TIMERA1_VECTOR //捕获中断向量
__interrupt void Timer_A(void)
{
switch(TAIV) //2为TA1捕获向量地址4为TA2捕获向量地址
{
case 2 : break;
case 4 : break;
}
}
这里的中断向量依然是TIMERA1_VECTOR,要注意的是TAIV中断向量地址,如果TAIV被读的话就不用清除中断标志位,否者就要手动清除 ,写法:TACCTLx &=~CCIFG;
代码实例1:
/*超声波测距*/
#include 'msp430F169.h'
#define uint unsigned int
#define uchar unsigned char
#define RISE 1
#define FALL 0
uint num,temp;
uchar Edge=1;//当前触发沿
uint RiseCapVal;//上升沿时刻捕获值存放变量
uint TA_Overflow_Cnt; //TA溢出次数存放变量,可能距离远超过65535 TA_Overflow_Cnt
unsigned long int Period;//脉宽存放结果变量,高电平时间
unsigned long int S; // 定义距离长度,单位厘米
void init_timerA(void)
{
TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕获,中断允许
}
void init_IO(void)//SRF05_IOinit()
{
P1DIR |= BIT4; //P1.4输出,普通I/O
P1DIR &=~ BIT2;//P1.2输入
P1SEL |=BIT2; //P1.2第二功能,捕获输入
P1OUT &=~BIT4;// 开始低电平,控制驱动波形发生
delay_ms(1000);
}
void Clock_Init()
{
uchar i;
BCSCTL1&=~XT2OFF; //打开XT2振荡器
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
do{
IFG1&=~OFIFG; //清楚振荡器错误标志
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待
IFG1&=~OFIFG;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
Clock_Init();
init_timerA();
TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE; //改为上升沿捕获
_EINT();//开全局中断
while(1)
{
P1OUT |= BIT4; // P1.1 高电平,超过10us
delay_ms(10);
P1OUT &=~BIT4;
delay_ms(200);
}
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 2 :if(Edge==RISE)
{
RiseCapVal = TACCR1;
TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
Edge = FALL;//下降沿捕获标志
}
else
{
_DINT();
Period = TACCR1-RiseCapVal;//这里要注意是否考虑溢出,跟测试距离有关,希望大家拓展
S=(Period*17)/100;// 距离计算 s=340m/s*Period/2*10^(-6)*1000(mm)
TACCR1 = 0;
TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
Edge = RISE;//上升沿捕获标志
_EINT();
}
break;
case 4 : break;
case 10: TA_Overflow_Cnt++;//溢出标志
break;
}
}
代码实例2:
/*小球脉冲计数*/
#include 'msp430x14x.h'
unsigned int n;//计录次数
void main(void)
{
WDT_Init(); //看门狗设置
TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕
//获,中断允许
_EINT(); //开全局中断
P1DIR &=~ BIT2;//P1.2输入
P1SEL |=BIT2; //P1.2第二功能,捕获输入
while(1)
{
}
}
#pragma vector=TIMERA1_VECTOR //捕获中断向量
__interrupt void Timer_A(void)
{
switch(TAIV) //2为捕获向量地址
{
case 2: n++;break;
}
}
16 位定时器 A 模块寄存器
TACTL, Timer_A 控制寄存器
TAR, Timer_A 寄存器
TARx Bits15-0Timer_A 寄存器。 TAR 寄存器是 Timer_A 的计数。
TACCTLx,捕捉/比较控制寄存器
- MSP430F169 Timer_A原理(一)----定时器的四个模式
- MSP430F169 FLASH 操作
- MSP430F169——CLOCK
- MSP430F169(二)——UART波特率(论上)
- MSP430F169(二)——UART中断(论下)
- MSP430F169(三) ---- 使用UART实现PC与单片机的数据收发并在1602 液晶显示
- 基于MSP430F169的水声遥控发射系统设计
- 基于MSP430F169的环境光自适应LED显示屏设计
- MSP430F169(五)——时钟
- MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验(含Timer_A分析)