在线情况
楼主
  • 头像
  • 级别
    • 积分3
    • 经验419
    • 文章6
    • 注册2011-07-21
    msp430f149定时器捕捉寄存器问题
    [P] void main()
    {
      WDTCTL=WDTPW+WDTHOLD;         //关闭看门狗
     
       //-------开晶振XT2---------[/P][P]   BCSCTL1&=~XT2OFF;                //打开XT2振荡器
       do
       {
       IFG1 &= ~OFIFG;                     // 清除振荡器失效标志
       for (i=256;i>0;i--);                     // 延时,等待XT2起振
       }
      while ((IFG1 & OFIFG) != 0);            // 判断XT2是否起振[/P][P]  BCSCTL2 =SELM_2+SELS;             //选择MCLK=SMCLK为XT2[/P][P]  //-----------------------------
      P1DIR|=BIT0;
      P4SEL|=BIT0;                          //P4.0作为捕获模块功能的输入端输入方波
      P5DIR|=BIT6+BIT4;
      P5SEL|=BIT6+BIT4;
      Set_UART1();
      TBCCTL0&=~(CCIS1+CCIS0);          // 捕获源为P4.0,即CCI0A(也是CCI0B)
      TBCCTL0|=CM_2+SCS+CAP;           //下降沿捕获,同步捕获,工作在捕获模式
      TBCCTL0|=CCIE;                     //允许捕获比较模块提出中断请求
      TBCTL|=ID_2;
      TBCTL|=TBSSEL_2;                   //选择时钟SMCLK
                        //定时器清零,
      TBCCR0=TBCLR;
      TBCTL|=MC_2;     //定时器开始计数(连续计数模式0~0xFFFF)
      P1OUT|=BIT0;
      _EINT();
      while(1);
    }[/P][P]#pragma vector=TIMERB0_VECTOR        
    __interrupt void TimerB0(void)
    {  
     
       if(TBCCTL0&CM1)                        //捕获到下降沿(检测是下降沿触发中断)
         {
          TBCTL|=TBCLR;
          TBCCTL0=(TBCCTL0&(~CM1))|CM0;    //改为上升沿捕获:CM1置零,CM0置一[/P][P]     }
       else if(TBCCTL0&CM0)                    //捕获到上升沿(检测上升沿触发中断)
         {
          width[i++]=TBCCR0;                  //记录下结束时间
         
          TBCCTL0=(TBCCTL0&(~CM0))|CM1;   //改为下降沿捕获:CM0置零,CM1置一
          if(i==12)
          { i=0;
          h++;
          }
          }
      if(h==300)
      { h=0;
      P1OUT=~P1OUT;
        send(width,12);
      }
    }[/P][P]问题:我查了很多资料,可还是找不到问题在哪里,定时器B选择SMCLK进行分频时 TBCTL|=ID_3;可以工作 串口有数据,可TBCTL|=ID_2;为什么就不能接收了,感觉没进入中断啊。串口收发程序正常,请高手指点....我是拿ACLK接得输入[/P]
    期待......ing
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    [P]请问你的程序控制流程是什么?你贴子里没有描述。“串口有数据”与这TB的捕获是什么关系?[/P]
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分3
      • 经验419
      • 文章6
      • 注册2011-07-21
      [P]崩溃 为什么用 CCIE位   捕获/比较模块中断允许位和 _DINT(); 效果不一样啊 为什么前者数据发送一会就没有了     真的很郁闷到现在还是没找出哪的问题   希望版主不吝赐教..... 我是把串口发送数据改到[/P][P]while(1)
        {  if(h==300)
          { h=0;
          P1OUT=~P1OUT;
          send(width,10);
          }
        } 放到中断里少捕获了几个(这个放到中断里正常的)[/P][P] [/P][P]    [/P]
      期待......ing
      在线情况
      4
      • 头像
      • 级别
        • 积分2
        • 经验99
        • 文章2
        • 注册2011-11-16
        [P][LINE-HEIGHT=21px][ALIGN=left][BGCOLOR=rgb][SIZE=14px]   if(TBCCTL0&CM1)                        //捕获到下降沿(检测是下降沿触发中断)
             {
              TBCTL|=TBCLR;
              TBCCTL0=(TBCCTL0&(~CM1))|CM0;    //改为上升沿捕获:CM1置零,CM0置一[/SIZE][/BGCOLOR][/ALIGN][/LINE-HEIGHT][/P][P][LINE-HEIGHT=21px][ALIGN=left][BGCOLOR=rgb][SIZE=14px]     } [/SIZE][/BGCOLOR][/ALIGN][/LINE-HEIGHT][/P][P][LINE-HEIGHT=21px][ALIGN=left][BGCOLOR=rgb][SIZE=14px]
        [/SIZE][/BGCOLOR][/ALIGN][/LINE-HEIGHT][/P][P][LINE-HEIGHT=21px][ALIGN=left][BGCOLOR=rgb][SIZE=14px]第二句, TBCTL |= TBCLR; [/SIZE][/BGCOLOR][/ALIGN][/LINE-HEIGHT][/P][P][LINE-HEIGHT=21px][ALIGN=left][BGCOLOR=rgb][SIZE=14px]会把 TB计数模式 清零 ,  变为 MC_0, 停止计数[/SIZE][/BGCOLOR][/ALIGN][/LINE-HEIGHT][/P]
        微控网感谢您的参与
        Powered by LeadBBS 9.2 .
        Page created in 2.4849 seconds with 5 queries.