工具/软件:Code Composer Studio
我的中断服务例程有问题。 基本上,我在捕获模式中的上升沿和下降沿都使用计时器 A,以便我可以测量时间间隔并将其转换为某个距离 。 但是,一旦 HC-SR04传感器检测到物体并设置 CCIFG 标志,即使附近没有物体,该标志也不会再次复位。 此外,就我知道是否设置了标志而言,一旦 GIE 被设置,我应该能够进入 ISR 例程。 但是,这两项都没有完成。 我需要我的编码指导。 提前感谢!
#include #include volatile unsigned int gap_in_cm; volatile unsigned int starting_time; volatile unsigned char num_funid='3'; //中断 服务后,处理器返回发送触发脉冲 #pragma vector = TIMERRA0_vector __interrupt void TA0_ISR (void){ if ((TA0CCTL2 & CCIFG)!= 0) {//一旦产生中断,我们就在上升沿 STARTING_TIME = TA0CCR2;//在产生中断后,计时器值将写入 TA0CCR0 } 否则、如果((TA0CCTL2 & CCIFG)=0) { GAP_IN_cm =(TA0CCR2 - Starting_Time)/58; } TA0CTL &=~TAIFG;//RESET timerA 中断标志 } void timerConf () { TA0CTL = tassel_1 | MC_2 | TAIE | TACLR; //ACLK (32kHz),选择连续模式 TA0CCTL2 = CM_3 | CCIS_0 | SCS | CAP | CCIE; //捕获模式(CM_3)设置为11b,这意味着在上升沿和下降沿都进行捕获, //CCIS 00B =选择 CCI1A、其中输入传感器发送的回波 // SCS,同步捕捉源,从而捕捉输入信号与定时器时钟同步 //cap 被选为01b、这意味着捕获模式 //CCIE 表示捕获控制中断使能 //如果出现上升沿或下降沿中断! } int main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 P5DIR |= BIT0; 选择//P5.0作为输出以产生触发脉冲 P5OUT &=~BIT0; P1SEL0 |= BIT6; //P1.6为 TA0.2 (选择 TimerA0通道2) CCR2 Capture:CCI2A 输入 P1REN |= BIT6; //P1DIR &=~BIT7; 选择//P1.7作为输入、以从传感器获取将在计时器 A0中处理的回波脉冲 P1OUT &=~BIT6; PM5CTL0 &=~LOCKLPM5; timerConf(); _bis_SR_register (GIE); //可屏蔽中断被启用 for (;;){ P5OUT |= BIT0;//p5.0高电平持续10微秒(触发脉冲) _DELAY_CYCLES (10); P5OUT &=~BIT0;//P. 50被变为低电平 __DELAY_CYCLES (10);//在80ms 间隔内测量可靠性。 if ((TA0CCTL2 & CCIFG)!= 0) {//一旦产生中断,我们就在上升沿 STARTING_TIME = TA0CCR2;//在产生中断后、定时器值被写入 TA0CCR0 if (((TA0CCTL2 & CCIFG)=0) { GAP_IN_cm =(TA0CCR2 - STARTING_TIME)/58; //以 cm 转换为单位的距离 } } TA0CTL &=~TAIFG;//复位 timerA 中断标志 if ((gap_in_cm <= 8)&&(gap_in_cm > 3)){ num_d空置--; } //在屏幕上显示 num_d空置 位置 否则、如果((GAP_IN_cm > 8)){ num_p空置++; } } 返回0; }