这个测频程序问题出在哪里?

2019-03-24 16:09发布

程序利用两个定时器做频率测试,精度要求不高。测试的是以KHZ为单位的方波。串口助手显示测量结果 程序如下: #include "msp430x21x2.h" volatile unsigned  char fCounter;
volatile unsigned int tCounter;
unsigned char mark=0; //unsigned char pcString []="当前频率:";
#define delay10us _NOP(),_NOP(),_NOP(),_NOP(),_NOP() void Usart_PutChar(unsigned char cTXData)  //字节发送函数
{
   while (!(IFG2&UCA0TXIFG));            
    UCA0TXBUF = cTXData;                  // TX -> RXed character
} void Usart_PutString(unsigned char *pcString)
{
 while (*pcString)
 {
    Usart_PutChar(*pcString++);
 }
 //Usart_PutChar(0x0D);
 //Usart_PutChar(0x0A);  //结尾发送回车换行
}
void main()
{
  WDTCTL =WDTPW+WDTHOLD;  //关狗
 
   if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                    
      { 
         while(1);     // If calibration constants erased do not load, trap CPU!!
      }   
    BCSCTL1 =CALBC1_1MHZ;                     //设定DCO为1MHZ
    DCOCTL = CALDCO_1MHZ;                     //设定DCO 为1MHZ
   
  P1DIR &=~BIT0;
  P1SEL |=BIT0;  //P1.0配置为定时器时TA0钟输入
  P1SEL2 &=~BIT0;
  P3SEL= BIT5+BIT4;
 
  UCA0CTL1 |= UCSWRST;
  UCA0CTL1 |=UCSSEL_2;    //SMCLK
  UCA0BR0 = 104;        //9600波特率
  UCA0BR1 = 0;
  UCA0MCTL =UCBRS_1;
  UCA0CTL1 &=~UCSWRST;
  IE2 |=UCA0RXIE;        //接收中断使能*/
 
  TA1CTL=TASSEL_2+TAIE;
  TA1CCR0=1000;           //TA1比较中断定时1ms
  TA1CCTL0=CCIE;
  TA0CTL =TASSEL_0+TAIE;
 
  __bis_SR_register(GIE);
  TA0CTL |=MC_2;
  TA1CTL|=MC_1;
 
 
  while(1)
  {
   if(mark ==1)
   {
      Usart_PutString("当前频率:");
      Usart_PutChar(tCounter/1000+0x30);
      Usart_PutChar(tCounter%1000/100+0x30);
      Usart_PutChar(tCounter%1000%100/10+0x30);
      Usart_PutChar(tCounter%1000%100%10+0x30);
      Usart_PutString("KHZ");
      Usart_PutChar(0x0D);
      Usart_PutChar(0x0A);  //结尾发送回车换行
      for(int i=0;i<100;i++)
         for(int k=0;k<100;k++)
          delay10us;
     
      fCounter=0;
      TAR=0;
      TA1R=0;
      TA0CTL|=MC_2;//Timer0_Star
      TA1CTL|=MC_1;//Timer1 Star
      mark=0;
    }
  }
} #pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer0_A1(void)
{
  switch  (__even_in_range(TA0IV, 10))       // Efficient switch-implementation
  {
    case  2:
          break;                         // TA0CCR1  used
    case  4:
      break;                         // TA0CCR2 not used
    case 10:
         fCounter++;
         break;
  }
} #pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0(void)
{
  TA0CTL&=~MC_2;//Timer0_Stop
  TA1CTL&=~MC_1;//Timer1 Stop
  tCounter=TAR;
  mark=1;
  //P1OUT^=BIT0;
}
问题: 1.在调试时,在Timer1_A0(void)的中断内部mark=1;句设置断点,然后全速跑,测试显示正常。但是如果取消该断点全速运行的话程序一直在while()循环中的if(mark==1)处停止,似乎无法进入Timer1_A0(void)中断,不知是何原因。 2、对该系列的TA0和TA1他们的中断向量是否一样,都有TAXCCR0,TAXCCR1和溢出中断呢?
[ 本帖最后由 jiangwei0802 于 2011-6-17 00:09 编辑 ] 此帖出自小平头技术问答
0条回答

一周热门 更多>

相关问题

    相关文章