P1SEL
|=
BIT2
//设置P1.2端口为功能模块使用
TACTL
|=TACLR
TACTL
=
TASSEL_2+TAIE+MC1
//定时器A时钟信号选择SMCLK
8M,清计数寄存器,使能中断,同时设置定时器A计数模式为连续增计模式
CCTL1
=CM0+SCS+CAP+CCIE
//输入上升沿捕获,同步,capture模式
CCI0A为捕获信号源,中断使能
//TACCTL1
&=~CCIFG
//清CCR2
的标志位
//中断允许
_EINT()
LPM0
}
#pragma
vector=TIMERA1_VECTOR
//定时器A中断处理
__interrupt
void
timer_a(void)
{
switch(TAIV)
//向量查询
{
case
2:
//捕获中断
if(CCTL1&CM0)
//上升沿
{
CCTL1=(CCTL1&(~CM0))|CM1
//更变设置为下降沿触发
start=TACCR1
//记录初始时间
overflow=0
//溢出计数变量复位
}
else
if(CCTL1&CM1)
//下降沿
{
CCTL1=(CCTL1&(~CM1))|CM0
//更变设置为上升沿触发
end=TACCR1
//用start,end,overflow计算脉冲宽度
TACTL
&=~TAIE
//不使能中断
CCTL1
&=~CCIE
P1SEL
&=~BIT2
_DINT()
LPM0_EXIT
}
break
case
10:
//定时器溢出中断
overflow++
break
//溢出计数加1
default:break
}
}
然后再对得到的start,end,overflow处理计算即可。。。
这个简单,把两个方波进行异或,用430单片机的定时器A测量异或后的方波的脉冲宽度,在对测量数据进行简单的计算就可得到相位差。。。具体程序如下:P1SEL |= BIT2//设置P1.2端口为功能模块使用
TACTL |=TACLR
TACTL = TASSEL_2+TAIE+MC1 //定时器A时钟信号选择SMCLK 8M,清计数寄存器,使能中断,同时设置定时器A计数模式为连续增计模式
CCTL1 =CM0+SCS+CAP+CCIE //输入上升沿捕获,同步,capture模式 CCI0A为捕获信号源,中断使能
//TACCTL1 &=~CCIFG//清CCR2 的标志位
//中断允许
_EINT()
LPM0
}
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV) //向量查询
{ case 2://捕获中断
if(CCTL1&CM0) //上升沿
{
CCTL1=(CCTL1&(~CM0))|CM1 //更变设置为下降沿触发
start=TACCR1 //记录初始时间
overflow=0//溢出计数变量复位
}
else if(CCTL1&CM1) //下降沿
{
CCTL1=(CCTL1&(~CM1))|CM0 //更变设置为上升沿触发
end=TACCR1 //用start,end,overflow计算脉冲宽度
TACTL &=~TAIE //不使能中断
CCTL1 &=~CCIE
P1SEL &=~BIT2
_DINT()
LPM0_EXIT
}
break
case 10: //定时器溢出中断
overflow++
break //溢出计数加1
default:break
}
}
然后再对得到的start,end,overflow处理计算即可。。。
单片机MSP430入门理论⑨--定时器模块-定时器A④
上期大概给大家汇总介绍了,定时器模块中定时器A的CCTLx捕获/比较控制寄存器,CCTLx是用来设置捕获模式,捕获的输入端,捕获模式,OUT输出,捕获标志等
本期将继续介绍定时器A最后一个中断向量寄存器,然后实践一下程序该怎么写
1.0 TAIV 中断向量寄存器
上图先简单说明下,TATV中断向量寄存器,看上图,TATV的值为0A(十进制的10)时,就表明目前触发的是溢出定时器中断标志TAIFG,属于优先级最低的中断,当TATV的值为02时,就说明目前触发的是最高等级的中断,比较捕获寄存器1
TAIVx bit 3-1
Timer_A 有两个中断向量,一个单独分配给捕获比较寄存器CCR0,另一个作为共用的中断向量,用于定时器和其他捕获比较寄存器
CCR0中断向量具有最高的优先级,因为CCR0能用于定义是增计数和增减计数模式的周期。因此他需要最快速度的服务,CCIFG0在被中断服务时能自动复位
CCR1-CCRx和定时器共用另一个中断向量,属于多源中断,对应的中断标志CCIFG1-CCIFGx和TAIFG1在读中断向量字TAIV后,自动复位。如果不妨问TAIV寄存器,则不能自动复位,须用软件清除。如果相应的中断允许位复位(不允许中断),则将不会产生中断请求,但中断标志扔存在,这时须用软件清除。
关于中断挂起和返回不包括处理约需要11-16个时钟周期
实例1:定时器A自动溢出
利用TemerA直接计数产生溢出,然后中断处理。
ACLK=TACLK=32768HZ,MCLK=SMCLK=default DCO~800kHZ
时间关系没来的及验证,大家可以按照上面的试一下
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)