用f149单片机Timer_A捕获模块测量某脉冲信号高电平时间。不知哪里出错了?
[复制链接]
#include "msp430x14x.h"
#include"Cry12864.h"
#include"BoardConfig.h"//开发板系统配置函数
#define RISE 0
#define FALL 1
uchar Edage=0; //当前触发沿
uint TA_OverflowCnt;
unsigned long int RiseCapVal;
unsigned long int Period;
unsigned long int Freq;
uchar hang1[]={"周期:"};
uchar hang2[]={"频率:"};
uchar *A="us";
uchar *B="Hz";
/*初始化时钟*/
void int_clk()
{
uchar i;
BCSCTL1&=~XT2OFF; /*打开XT振荡器*/
BCSCTL2|=SELM1+SELS; /*MCLK 8M and SMCLK 1M */
do
{
IFG1 &= ~OFIFG; /*清除振荡错误标志*/
for(i = 0; i < 100; i++)
_NOP(); /*延时等待*/
}
while ((IFG1 & OFIFG) != 0); /*如果标志为1继续循环等待*/
IFG1&=~OFIFG;
}
/***************捕获初始化******************************/
void init_cap()
{
P1DIR&=~BIT2; //p1.2定义为输入状态
P1SEL |= BIT2; //p1.2设为第二功能,捕获输入端口
TACTL |= TASSEL_2+TACLR+MC_2+ID_0; //定时器时钟源选择SMCLK,不分频,连续计数模式
TACTL |=TAIE;
TACCTL1 |= CAP+CM_1+SCS+CCIS_1+CCIE; //上升JH沿捕获,CCI1A为捕获信号源,同步捕获,使能中断
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
BoardConfig(0xbe); //开发版配置:关闭数码管、流水灯
int_clk();//初始化时钟
Ini_Lcd();//初始化12864
Disp_HZ(1,1,hang1,3);
Disp_String(1,8,A);
Disp_HZ(2,1,hang2,3);
Disp_String(2,8,B);
init_cap();//初始化捕获模式
_EINT();
LPM0;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void TA_ISR(void)
{
switch(TAIV)
{
case 2: if(Edage==RISE)
{
RiseCapVal=TACCR1;//保存上升沿时刻捕获值
TACCTL1 |=CAP+CM_2+CCIS_1+SCS+CCIE;//改为下降沿捕获
Edage=FALL;
}
if(Edage==FALL)
{
Period=TA_OverflowCnt*65535+TACCR1-RiseCapVal;//计算周期
TA_OverflowCnt=0;//计数清零
TACCTL1 |=CAP+CM_1+CCIS_1+CCIE+SCS;//改为上升沿沿捕获
Edage=RISE;
DsplayLongNumber(1,4,Period);
Freq=(1000000/(Period));
DsplayLongNumber(2,4,Freq);
}
break;
case 4: break;
case 10: TA_OverflowCnt++;
break;
}
}