/***************************(定时器A)频率捕获************************/
void TA_Capture(void)
{
TACTL=TACLR+TASSEL_2+ID_3; //TAR清除,捕获时钟选择SMCLK,8分频(选择8Mhz/8=1Mhz)
TACTL|=TAIE; //此处打开定时器溢出中断
TACCTL1=CM_1+CAP+SCS+CCIS_1; //CCTL1,上升沿捕获,捕获模式,同步捕获,捕获端口选取CCI1B
TACCTL1|=CCIE; //使能捕获中断
TACCR0=10000-1; //定时器溢出值
P2DIR&=~BIT3; //将P2.3设定为输入
P2SEL|=BIT3; //将P2.3设定为频率捕获端口
TACTL|=MC_1; //增计数模式
}
/*************************定时器A中断函数*************************/
#pragma vector = TIMERA1_VECTOR //捕获中断
__interrupt void TIMERA1(void)
{
switch(TAIV) //读中断向量寄存器
{
case 2: switch(cap_count) //捕获瞬间,读取TAR的值
{
case 0: T_cap1=TACCR1;
cap_count=1;
overflow_count=0;
break; //记录捕获值
case 1: T_cap2=TACCR1;
cap_count=0;
intermediate_overflow_count=overflow_count;
break;
}
break;
case 4: break;
case 10: overflow_count+=1; //用于计算捕获时候的溢出脉冲
spacing_count+=1; //用于检测MODBUS协议中任意两帧数据的间隔
if(spacing_count>2)
{
spacing_count=2;
rec_ok=flag_2; //flag_2用来确定,没收到一帧数据仅回答一次
}
break;
default: break;
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>