TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F5529: 定时器捕获中断

Part Number:MSP430F5529

超声波模块不能用,好像会卡在中断#pragma vector=TIMER2_A1_VECTOR这个里面是咋回事

#include <msp430f5529.h>
//蓝牙串口
void UART0_lanya()
{
P3SEL|= BIT3 + BIT4;//设置IO口为第二功能模式,启用UART功能
UCA0CTL1 = UCSWRST;
UCA0CTL1 = UCSSEL_2; //SMCLK
UCA0BR0 =78; // 16MHz 9600(see User's Guide)
UCA0BR1 =0; // 16MHz 9600
UCA0MCTL=UCBRF_2+ UCOS16+UCBRS_0;
UCA0CTL1 &=~ UCSWRST;
P3DIR|= BIT3;//设置TXD0口方向为输出
UCA0IE |= UCRXIE; //打开中断
_EINT();//全局中断
}
//蓝牙串口发送字符串
void sendstring(unsigned char *p)
{
while(*p!='\0')
{
while(!(UCA0IFG&UCTXIFG));
UCA0TXBUF=*p++;
}
}
//电机PWM调速
void PWM_dianji_TimeA0_Init()
{
Dianji_Init(); //轮子电机io口初始化
P1DIR|=(BIT1+BIT2+BIT3+BIT4+BIT5);
P1SEL|=(BIT1+BIT2+BIT3+BIT4+BIT5);
P1DS|=(BIT1+BIT2+BIT3+BIT4+BIT5);//全力驱动
TA0CTL=MC_1+TASSEL_1+ID_0;//增模式+ACLK+1分频
TA0CCTL1=OUTMOD_7;
TA0CCTL2=OUTMOD_7;
TA0CCTL3=OUTMOD_7;
TA0CCTL4=OUTMOD_7;
TA0CCR0=1024;//周期
TA0CCR1=500;//P1.2左前轮
TA0CCR2=500;//P1.3右前轮
TA0CCR3=500;//P1.4左后轮
TA0CCR4=500;//P1.5右后轮

}
//舵机PWN控制
void PWM_duoji_TimeA1_Init()//P2.0
{
P2DIR|=BIT0;//输出口
P2SEL|=BIT0;
P2DS|=BIT0;//全力驱动
TA1CTL=MC_1+TASSEL_1+ID_0+TACLR;//增模式+ACLK+1分频
TA1CCTL1=OUTMOD_7;
TA1CCR0=1500;//周期30ms
TA1CCR1=1;
}

void CHaoshengbo_Trig()//P2.5
{
P2DIR|=BIT5;
P2OUT|=BIT5;//发送高电平
delay_us(15);
P2OUT&=~BIT5;
delay_ms(30);
}

void CHaoshengbo_TimeA2_Init()//P2.4,TA2.1
{
P2DIR&=~BIT4;
P2SEL|=BIT4;
TA2CTL = TASSEL__ACLK + ID__8 + MC_2 + TACLR + TAIE;
TA2CCTL1 = CM_1 + SCS +CAP + CCIE + CCIS_0;

}

unsigned char data;//蓝牙
unsigned int start,end,t,distance;//超声波

void main()
{

WDTCTL = WDTPW + WDTHOLD;//看门狗关闭
_EINT() ;//开中断
initClock();//最终MCLK:24MHZ,SMCLK:12MHZ,ACLK:48KHZ
PWM_dianji_TimeA0_Init();//电机PWM调速
PWM_duoji_TimeA1_Init();//舵机PWN控制
UART0_lanya();//蓝牙串口
Xunji_Init(); //循迹
CHaoshengbo_TimeA2_Init();//超声波
while(1)
{
CHaoshengbo_Trig();//P2.5
if(t>0)
{
RUN_qian();
}
else
{
Stop();
}
}

}

#pragma vector=TIMER2_A1_VECTOR
__interrupt void TIMER2_A1_ISR(void)
{
_DINT(); //关中断
switch(__even_in_range(TA0IV,14))
{

case 0: break; //无中断
case 2:
if(TA2CCTL1 & CM_1)//上升沿
{
start=TA2CCR1;
TA2CCTL1&=~CM_1; //清上升沿捕获
TA2CCTL1|=CM_2; //改为下降沿捕获
}
else if(TA2CCTL1 & CM_2)//下降沿
{
end=TA2CCR1;
TA2CCTL1|=CM_1; //改为上升沿捕获
TA2CCTL1&=~CM_2; //清下降沿捕获
t=end-start;
}
else break;//CCR1中断
case 4: break;//CCR2中断
case 6: break;//CCR3中断
case 8: break;//CCR4中断
case 10: break;//CCR5中断
case 12: break;//CCR6中断
case 14: break;//定时器溢出
default: break;
}
TA2CCTL1&=~CCIFG; //清除中断响应标志
_EINT() ;//开中断
}

#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR()
{

UCA0IFG &= ~UCRXIFG;
if((UCA0IFG)&(UCRXIFG));//接收
data=UCA0RXBUF;
if(data==runqian){ RUN_qian();}
if(data==runhou){ RUN_hou();}
if(data==runzuozhuan){ RUN_zuozhuan();}
if(data==runyouzhuan){ RUN_youzhuan();}
if(data==runzuoyi){ RUN_zuoyi();}
if(data==runyouyi){ RUN_youyi();}
if(data==stop){ Stop();}
}

Yale Li:

您好,有试过单步调试吗?程序具体会卡在哪个语句?

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F5529: 定时器捕获中断
分享到: 更多 (0)