This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F149测频7K以下0.1HZ精度,超过9K无法测量无法进入定时器中断求解??

程序有点稀烂,大牛不要笑话。

其实程序有bug的,7K一下可以精确到0.1Hz
但是到了7-8K就会多出100多

到了9K以上就无法显示,其实是无法进入定时器中断。程序里面捕获的中断优先级比定时器高。
不知道是不是因为优先级的原因使频率高了无法进入定时器中断。

下面是程序:
#include  <msp430x14x.h>  
#include "Lcd1602.h"
#include "page.h"
#define CPU_F ((double)800000) 
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 

unsigned int Cap_Tar,Cap_first,Cap_last,Cap_num,flag=0;
float F,f;
unsigned int push,KEY,K;
void Init_CLK(void)
{
   unsigned int index;
   BCSCTL1&=~0X00;   //打开XT2振荡器
   do
   {
      IFG1 &= ~OFIFG;       // 清除振荡器失效标志
      for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振
    {
        ;
    }
    } while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
    
    BCSCTL2 =SELM_2+SELS;   //选择MCLK、SMCLK为XT2  SMCLK  8分频
}

void Capture_Init(void)
{
  
  P1DIR &=~BIT2;  //TA1
  P1SEL |=BIT2;   
  TACCR0=40000; //every intrupt 5ms;
  TACCTL1 =CAP+CM_1+CCIS_0+SCS;//+CCIE;  //Capture , pos. edge,CCIxA ,同步,捕获中断开                                             
  TACTL = TASSEL_2+TACLR+MC_1;//MC_1  //SMCLK,L  up to CCR0
// TACCTL1 |=CCIE;
// TACTL |=TAIE;
}

void IO_Init(void)
{
  P1SEL &=~(BIT6+BIT7);
  P1DIR &=~(BIT3+BIT5);
  P1DIR |=BIT6+BIT7;
  P1OUT |=BIT6;
  P1OUT |=BIT7;
  P1SEL &=~(BIT3+BIT5);
  P1IE |=BIT3+BIT5;  
}

void main(void)  
{  
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT 
  
  Init_CLK();
  IO_Init();
  init_lcd_port();
  Capture_Init();  
   lcd_init();//液晶初始化
  _EINT();                 //开总中断  
  display_tem_fre2(0x92,0);
  while(1)
  {
     display_tem_fre2(0x92,F);
  }
}  



#pragma vector=TIMERA1_VECTOR  //
__interrupt void Timer_A1(void)

   switch(TAIV)  
{

  case 2:
     if(Cap_Tar==0)
   {
      P2OUT &=~BIT0;
     //TACTL |=TACLR;
       push=0;
       flag=0;
      Cap_first=TACCR1;
      Cap_Tar++;
   }
   else
   {
     Cap_last=TACCR1;
     if(Cap_Tar==65535)
       flag++;
      Cap_Tar++;  
      
   }
   break;
   
  case 4:  break;  
  
   case 10:  //定时器中断  大于9K后进不去
      push++; 
     if(Cap_Tar==0)
       push=0;
     
     if(push==51)
      {
        K++;
       if(K==2)
       {
       TACTL &=~TAIE;
       TACCTL1 &=~CCIE;
       K=0;
       }
       Cap_num =Cap_Tar-1;  
       F = (Cap_num+flag*65535)*8000000.0/(50*40000+Cap_last-Cap_first);  //  f=N/T  ,T=200ms 
       Cap_Tar =0;
       push=0;
       flag=0;
       P1OUT ^=BIT6;
       
      }
      break;  
  }  
}


#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)

  
  delay_ms(100);
  if(((P1IFG&BIT3)>>3))  //按键按下后捕获
  { 
     P1IFG &=~BIT3;
     TACTL |=TAIE;
     TACCTL1 |=CCIE;
     TACTL |=TACLR;
  }
}


想做到1M ,还差很远呢,希望有高手帮忙分析下。
上面的7K一下可以精确到0.1HZ  
谢谢啦!