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  
谢谢啦!

  • Yuan Fan,

    请查看datasheet P26, "inputs Px.x, TAx, TBx", t(cap) 在3V时,可达50ns, 另外,t(cap)为1.5 cycles, 故是和你的主频有关的。你可以评估一下。只要主频足够高,9k应该是没有问题的。

  • 如果向您说的那样,IO的输入50ns

    那应该可以做到20K吧。但是现在是到了大概9K我在线调试的时候

    看到的现象是可以进入捕获CCR1 但是就是无法进入定时器中断。

    不知道是不是因为频率高了,因为CCR1优先级比定时器溢出中断的高所以无法进去?

    还有,您说的主频是指的什么?有点不理解。

    请问149捕获I最大可以做到多少?

    谢谢您的回答

  • 50ns应该是对应20M,这是硬件可以支持的最高速率,但是肯定受主频,就是MCLK的影响的,因为t(cap)为1.5 cycles,指的就是(1/MCLK)*1.5,你可以算算。O(∩_∩)O~

  • 你好,

    我有注意到你程序中:

    #define CPU_F ((double)800000) 

    BCSCTL2 =SELM_2+SELS;   //选择MCLK、SMCLK为XT2  SMCLK  8分频

    建议MSCL不分频,以8M的速度跑,并且定时器时钟也使用MCLK,然后观察捕获1M信号的现象。

  • 你好,时钟是选择的子系统时钟SMCLK 这个是使用的8M没有分频。可能是之前的注释忘了删掉谢谢。

    还是无法解决这个问题。难道捕获只能做到这样?

  • 你好,

    晚点给你回复,我在实验室复现一下。

  • 好的,谢谢啦!

  •   if(Cap_Tar==65535)
           flag++;

    这个地方要改改

      

    if(Cap_Tar==65535)
    {
    flag++;
    Cap_Tar=1;
    }

    不然当Cap_Tar ==65535后Cap_Tar 自加就变零了

    但是改了还是进不去 不是这个的元婴 。我用调试看了下的,到了9K后无法进入定时器中断 。