求教:MSP430G2553单片机捕获遇到问题

2019-07-15 16:05发布

当使用MSP430G2553单片机用来捕获方波的上升沿来计算频率时遇到问题:
程序在进入中断时一直进入溢出中断,这是怎么回事?
用的是tiMER1.2
下面是程序:
#include <msp430.h>
void Timer1Init();
int flag = 0;
unsigned long value = 0;
unsigned int  result1_start,result1_end;
unsigned int index=0;
unsigned int  temp;

/*
* main.c
*/
void main(void) {
        WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
        BCSCTL1=CALBC1_1MHZ;
        DCOCTL=CALDCO_1MHZ;
        //P2DIR &=~BIT5;          //P2.5,为输入引脚
        P2SEL |= BIT5;          // P2.5 = (InputDirection + TA1.2) = CCIxB.2 --> CCR2,P2.5作为输入,CCI2B,指定输入

        Timer1Init();
    P1SEL |= BIT4;
    P1DIR |= BIT4;
    P1DIR |= BIT0;
    P1OUT |= BIT0;

    _EINT();
    while(1)
    {
            value = result1_start;
    }
}


void Timer1Init()
{
        TA1CCTL2 = CAP + CCIS_1 + CM_3 + CCIE+SCS;     // Capture CCIxB, both edge, interrupt enable.CCI2B->p2.5
        TA1CTL |=TASSEL_2 + ID_0 + MC_2+ TAIE+TACLR ;//选择1M-SMCLK时钟,continuous mode
        TA1CCR2=0;
        //TACTL&=~CCIFG;
}

#pragma vector=TIMER1_A1_VECTOR

__interrupt void TAIV_ISR(void)
{

         switch(TA1IV)
                {
                 case 4:                    //ccr2中断向量
                         if (TA1CCTL2&CCI)    //上升沿触发
                                {
                                     result1_start=TA1CCR2;//记录初始值
                                     index=0;
                                     break;
                                }
                         else
                           {
                                          result1_end=TA1CCR2;          //记录结束值
                                    if(result1_end>result1_start)//结果比开始数值肖,表示溢出了一次或者几次,但是一般从0开始计数的话是不溢出的,这超声波实际测不了那么远,最多有个4米,5米的样子已经很好了
                                                                               //TACTL|=TACLR;//这句貌似不需要
                                       temp=result1_end-result1_start;
                                    else
                                        temp=result1_end+index*65535-result1_start;
                                    index=0;         //溢出清零
                                    break;
                           }

                 case 2: break;
                 case 10: index++;P1OUT ^= BIT0;break;           //溢出中断向量,其实就2,4,10号向量有用那些手册里也没说,用不到
                 default :break;
                }
         TACCTL1&=~COV
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。