如题,在Init_cap函数过后会直接进入中断且TBIV的值一直是12
测距模块输入是P3.5+P3.6
#include <msp430f5529.h>
#include "cap.h"
#include "delay.h"
#define FILTER_NUM 2
unsigned char choice=0;
//char table[30];
unsigned long channel[2];//存放时间
unsigned long channel_count[4]={0};//存放计数值
unsigned char channel_flag[2]={0};
unsigned char yichu_flag=0;//溢出标志
float distance[3];
float distance_temp1;
float distance_temp2;
float ArrDataBuffer[2][FILTER_NUM];//行表示3个通道,列表示需要滤波的次数
/************************************/
#define Trig_H_1 P3OUT|=BIT7 //端口P3.7输出高电平
#define Trig_L_1 P3OUT&=~BIT7 //端口P3.7输出低电平
#define Trig_H_2 P8OUT|=BIT2 //端口P8.2输出高电平
#define Trig_L_2 P8OUT&=~BIT2 //端口P8.2输出低电平
/**************变量定义****************/
unsigned char flag=1;
long time;
/****************************************/
void XT1_init(void)
{
P5SEL |= BIT4+BIT5; //配置为XT1功能,电路板上晶振接于这两脚
UCSCTL6 |= XCAP_3; //配置电容为12pF
UCSCTL6 &= ~XT1OFF; //使能XT1
while(SFRIFG1&OFIFG)//如果有时钟错误
{
UCSCTL7&=~(XT2OFFG+DCOFFG+XT1LFOFFG);//清除3种时钟错误标志
SFRIFG1&=~OFIFG;//清除时钟错误标志位
}
UCSCTL4&=UCSCTL4&~(SELS_7+SELM_7) + SELS_0 + SELM_0;//将SMCLK和MCLK时钟源配置为XT1
}
/*******************************************
函数名称:void init_dvice(void)
函数功能:超声波模块初始化
入口参数:无
返回值:无
*******************************************/
void Init_cap(void)
{
P3DIR|=BIT7; //输出方向(用来产生大于10us的脉冲)
P8DIR|=BIT2;
Trig_L_1;
Trig_L_2;
P3DIR&=~(BIT5+BIT6); //P3.5-3.6的管脚为输入
P3SEL|=(BIT5+BIT6); //CCI0B输入
TB0CTL=TBSSEL_2+TBCLR+ID_3+MC_2; //MCLK,清除TAR,八分频,连续计数模式
//工作在捕捉模式,捕获/比较中断使能
TB0CCTL5 |= CM_1 + SCS + CAP + CCIE + CCIS_1;//捕获模式,同步捕获,中断打开,上降沿捕获
TB0CCTL6 |= CM_1 + SCS + CAP + CCIE + CCIS_1;//捕获模式,同步捕获,中断打开,上降沿捕获
_EINT(); //使能GIE(总中断)
}
/*******************************************
函数名称:void start(void)
函数功能:超声波开始信号,产生10us的脉冲
入口参数:无
返回值:无
*******************************************/
void start_1(void)
{
Trig_L_1;
delay_us(20);
Trig_H_1;
delay_us(20);
Trig_L_1;
}
void start_2(void)
{
Trig_L_2;
delay_us(20);
Trig_H_2;
delay_us(20);
Trig_L_2;
}
/*******************************************
函数名称:void count_distance(void)
函数功能:计算距离
入口参数:无
返回值:无
*******************************************/
float count_distance( unsigned long ti1)
{
float dista;
dista = ti1*0.000173;
return dista;
}
void ULTRASONIC(void)
{
if(choice==0)
start_1(); //
if(channel_flag[0]==1)//通道1捕获完成
{
channel_flag[0]=0;
if(channel_count[1]>channel_count[0])
channel[0]=channel_count[1]-channel_count[0];
else
{
channel[0]=65535-channel_count[0]+channel_count[1];
yichu_flag=0;
}
distance_temp1=count_distance(channel[0]);
}
if(choice==1)
start_2();
if(channel_flag[1]==1)//通道2捕获完成
{
channel_flag[1]=0;
if(channel_count[3]>channel_count[2])
channel[1]=channel_count[3]-channel_count[2];
else
{
channel[1]=65535-channel_count[2]+channel_count[3];
yichu_flag=0;
}
distance_temp2=count_distance(channel[1]);
}
delay_ms(1);
choice++;
if(choice>=2)choice=0;
}
void MiddleValueFilter(void)
{
unsigned char i,j,k;
float temp;
unsigned char channel_num;
for(i=0;i<FILTER_NUM;i++) //一次采集N个数据放入数组中
{
ULTRASONIC();
ArrDataBuffer[0][i] = distance_temp1;
ArrDataBuffer[1][i] = distance_temp2;
}
for(channel_num=0;channel_num<2;channel_num++)
{
for(j=0;j<FILTER_NUM-1;j++)//采样值由小到大排列
{
for(k=0;k<FILTER_NUM-j-1;k++)
{
if(ArrDataBuffer[channel_num][k]>ArrDataBuffer[channel_num][k+1])
{
temp=ArrDataBuffer[channel_num][k];
ArrDataBuffer[channel_num][k]=ArrDataBuffer[channel_num][k+1];
ArrDataBuffer[channel_num][k+1]=temp;
}
}
}
distance[channel_num] = ArrDataBuffer[channel_num][(FILTER_NUM-1)/2];//取中间值
}
}
#pragma vector = TIMERB1_VECTOR
__interrupt void timera1_vec()
{
switch(TBIV)
{
case 10:
if(TBCCTL5 & CM_1)//上升沿
{
TBCCTL5 = (TBCCTL5 & (~CM_1) | CM_2);//改成下降沿
channel_count[0]=TBCCR5;
TBCCTL5 &= ~CCIFG;//清除中断标志
}
else //下降沿
{
TBCCTL5 = (TBCCTL5 &(~CM_2) | CM_1);//改成上升沿
channel_count[1]=TBCCR5;
channel_flag[0]=1;
TBCCTL5 &= ~CCIFG;//清除中断标志
}
break;
case 12:
if(TBCCTL6 & CM_1)//上升沿
{
TBCCTL6 = (TBCCTL6 & (~CM_1) | CM_2);//改成下降沿
channel_count[2]=TBCCR6;
TBCCTL6 &= ~CCIFG;//清除中断标志
}
else //下降沿
{
TBCCTL6 = (TBCCTL6 &(~CM_2) | CM_1);//改成下降沿
channel_count[3]=TBCCR6;
channel_flag[1]=1;
TBCCTL6 &= ~CCIFG;//清除中断标志
}
break;
case 14:
yichu_flag++;break;
default:
break;
}
}