MSP430F149 关于 脉冲捕捉 一直不进入沿中断 求各位大佬 指教
时间:10-02
整理:3721RD
点击:
/****************主函数****************/
void main(void)
{
uint i;
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P6DIR |= BIT2;P6OUT &= ~BIT2; //打开电平转换
P2DIR |= BIT3;P2OUT &= ~BIT3; //电平转换方向3.3V--->5V
P5DIR = 0xff;
P5OUT = 0xff;
/*------选择系统主时钟为8MHz-------*/
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
/*------选择系统主时钟为8MHz-------*/
P3DIR |= 0X07;
P4DIR |= 0XFF;
LCD_init();
set_pos(0,6);
LCD_write_data('W');
LCD_write_data('T');
LCD_write_data('F');
P2DIR |= BIT0; //设置P2.0为输出
P1SEL |= BIT2; //设置P1.2端口为功能模块使用
P1DIR &=~ BIT2;
P1IFG = 0;
TACTL = TASSEL1+TACLR+TAIE+MC1; //定时器A时钟信号选择SMCLK,同时设置定时器A计数模式为连续增计模式
CCTL1 = MC0+SCS+CAP+CCIE; //输入上升沿捕获,CCI0A为捕获信号源
start = 1;
disp_m = 1;
end = 1;
overflow = 0;
show_falg = 0;
_EINT();
while(1)
{
P2OUT |= BIT0;
delay(160); //给Trig一个启动脉冲
P2OUT &=~ BIT0;
while(show_falg); //等待 Echo的 下降沿
show(); //更新显示
}
}
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV) //向量查询
{ case 2: //捕获中断
if(CCTL1&CM0) //上升沿
{
CCTL1=(CCTL1&(~CM0))|CM1; //更变设置为下降沿触发
start=TAR; //记录初始时间
overflow=0; //溢出计数变量复位
}
else if (CCTL1&CM1) //下降沿
{
CCTL1=(CCTL1&(~CM1))|CM0; //更变设置为上升沿触发
end=TAR; //用start,end,overflow计算脉冲宽度
show_falg = 1; //打开显示计算处理程序
}
break;
case 10: //定时器溢出中断
overflow++;
break; //溢出计数加1
default:break;
}
}
void main(void)
{
uint i;
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P6DIR |= BIT2;P6OUT &= ~BIT2; //打开电平转换
P2DIR |= BIT3;P2OUT &= ~BIT3; //电平转换方向3.3V--->5V
P5DIR = 0xff;
P5OUT = 0xff;
/*------选择系统主时钟为8MHz-------*/
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
/*------选择系统主时钟为8MHz-------*/
P3DIR |= 0X07;
P4DIR |= 0XFF;
LCD_init();
set_pos(0,6);
LCD_write_data('W');
LCD_write_data('T');
LCD_write_data('F');
P2DIR |= BIT0; //设置P2.0为输出
P1SEL |= BIT2; //设置P1.2端口为功能模块使用
P1DIR &=~ BIT2;
P1IFG = 0;
TACTL = TASSEL1+TACLR+TAIE+MC1; //定时器A时钟信号选择SMCLK,同时设置定时器A计数模式为连续增计模式
CCTL1 = MC0+SCS+CAP+CCIE; //输入上升沿捕获,CCI0A为捕获信号源
start = 1;
disp_m = 1;
end = 1;
overflow = 0;
show_falg = 0;
_EINT();
while(1)
{
P2OUT |= BIT0;
delay(160); //给Trig一个启动脉冲
P2OUT &=~ BIT0;
while(show_falg); //等待 Echo的 下降沿
show(); //更新显示
}
}
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV) //向量查询
{ case 2: //捕获中断
if(CCTL1&CM0) //上升沿
{
CCTL1=(CCTL1&(~CM0))|CM1; //更变设置为下降沿触发
start=TAR; //记录初始时间
overflow=0; //溢出计数变量复位
}
else if (CCTL1&CM1) //下降沿
{
CCTL1=(CCTL1&(~CM1))|CM0; //更变设置为上升沿触发
end=TAR; //用start,end,overflow计算脉冲宽度
show_falg = 1; //打开显示计算处理程序
}
break;
case 10: //定时器溢出中断
overflow++;
break; //溢出计数加1
default:break;
}
}