woshiyean 发表于 2010-7-27 20:36:21

看看我的程序,就是捕获不了!

我写的是430单片机测频率的程序,定时1S,用捕获计算脉冲的个数。程序比较简单,但是就是测频率没显示,难道是哪个寄存器设置错误?
求解于高手。
#include <MSP430x26x.h>

unsigned int Ts_width,Plus_times;
unsigned char overflow;
void Init_CLK(void);

void main (void)
{
    WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗定时器
   
    Init_CLK();
   
    P1DIR &=~BIT2;                        //设置P1.2方向为输入
    P1SEL |= BIT2;                           //设置P1.2端口为功能模块使用
    TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC_0;   //定时器A时钟信号选择SMCLK,1M,同时停止定时器A
    CCTL1 = CM_1+SCS+CAP+CCIE+CCIS_0;               //输入上升沿捕获,CCI1A为捕获信号源
    CCR0=5000-1;                                    //定时5ms
   
    _EINT();                                  //中断允许
    while(1)
{
   //显示频率,这里略写   
}
}

#pragma vector=TIMERA1_VECTOR            //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV)                              //向量查询
   {
      case 2:                           //捕获中断
      {
          Plus_times++;                  //记下脉冲个数
          TACTL |=MC_1;                   //开定时器
      }
      break;
      case 10:
      overflow++;
      if(overflow==200)               //定时1S到
      {
            CCTL1 &=CM_0;                   //禁止捕获
            overflow=0;
            Ts_width=Plus_times;
            Plus_times=0;
            CCTL1 |=CM_1;                   //捕获允许
      }
      break;
   default:
       break;
   }
}
/*****************高频时钟初始化**************************/
void Init_CLK(void)
{
unsigned int iq0;

   BCSCTL1&=~XT2OFF;               //打开XT2振荡器
   do
   {
   IFG1 &= ~OFIFG;                   // 清除振荡器失效标志
   for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
   }
   while ((IFG1 & OFIFG));   // 判断XT2是否起振,起振,则为0

BCSCTL2=SELM_2+SELS;          //选择MCLK、SMCLK为XT2,8M
}
显示部分绝对没问题,大家帮忙看看我的捕获模块怎么错了。
I am新手,请老手们赐解!

woshiyean 发表于 2010-7-27 21:08:06

case 2:                           //捕获中断
      {
          Plus_times++;                  //记下脉冲个数
         /****** TACTL |=MC_1;                   //开定时器********/
      }

/****** TACTL |=MC_1;                   //开定时器********/
难道是这句话错了???

jackwang123 发表于 2011-5-23 21:21:18

case 2:                           //捕获中断
      {
          Plus_times++;                  //记下脉冲个数
          TACTL |=MC_1;                   //开定时器
      }
      break;

程序没有仔细看,但你这个break应该在case的{}里面吧。

winfisher 发表于 2011-5-23 23:53:49

这个应该没关系吧。。
页: [1]
查看完整版本: 看看我的程序,就是捕获不了!