在线情况
楼主
  • 头像
  • 级别
    • 积分2
    • 经验200
    • 文章1
    • 注册2011-04-03
    【求助】MSP430 定时器A产生波形问题
    我想用TACCR0和TACCR1中断来实现产生一个时间脉冲,编译能通过,但是无法产生相应的波形,单步调试着看发现经过几次正常进入中断后,出现各异常问题,始终无法再进入中断,状态寄存器中的SCG0、SCG1自动置1,不知道什么原因,跪求高手指教。
    代码如下:
    #include "msp430x22x4.h"
    //                MSP430F2274
    //             -----------------
    //         /|\|              XIN|-  
    //          | |                 |
    //          --|RST          XOUT|-
    //            |                 |
    //            |             P1.0|-->波形

    int main( void )
    {
      WDTCTL=WDTPW+WDTHOLD;                   //关看门狗
      BCSCTL1 =CALBC1_12MHZ;                   //设定DCO为12MHZ
      DCOCTL =CALDCO_12MHZ;
      BCSCTL2 |= DIVS_2;                       //SMLK 4分频  频率为3MHz
      P1DIR |=BIT0;                           //LED使能
      TACTL=TASSEL_2+TACLR;                    //定时器A时钟源为SMCLK,并清TAR
      TACCTL0 |=CCIE;                         //TACCR0中断使能
      TACCR0 =60000;                            //计数值为60000个SMCLK周期  即20ms的PPM总信号周期
      TACCR1=1500;                                //间隔信号为0.5ms 的高电平
      TACTL |=MC_1;                            //动定时器A为单增模式
      _BIS_SR(GIE+CPUOFF);
      return 0;  
    }

    #pragma vector = TIMERA0_VECTOR           //TACCR0中断服务
    __interrupt void ta0_isr(void)
    {
      TACCTL1 |=CCIE;                         //TACCR1中断使能
      //TACTL |=TACLR;                             //TAR清零
      //TACCR1=TAR+1500;                              //间隔高电平信号0.5ms
      P1OUT |=BIT0;                           //拉高电平
    }

    #pragma vector = TIMERA1_VECTOR           //TACCR1中断服务
    __interrupt void ta1_isr(void)
    {
      switch( TAIV )
     {
       case  2:
                P1OUT &=~BIT0;                           //拉低电平
                TACCTL1 &=~CCIE;                         //TACCR1中断关闭    
                break;                         
       case  4:                                // CCR2
                break;                         
       case 10:                                  // TAR
                break;
     }
    }

    另外,说明一下,我是想利用msp430实现产生六通道PPM总信号,这只是第一步工作,由于初学msp430,估计这段程序忽视了某些东西,如果有高人写过类似程序,跪求啊!!!
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    你可以使用MSP430的TB模块,TB模块里头可以带有多个定时器功能的子模块。有足够的TB.x子模块来让你实现PWM功能。这样子的例子很多,你可以参考一下TI所提供的TB方面的例子,更重要的如果你需要应用好这些子模块,你必须要认真了解其原理。
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分21
      • 经验516
      • 文章33
      • 注册2009-10-13
      #include <msp430x14x.h>
      #define   uint  unsigned int
      #define   uchar unsigned char
      #define   PWM   BIT2
      void int_clk()
      {
          uchar i;
          BCSCTL1&=~XT2OFF;  //打开XT振荡器
          BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M  
          do
           {
              IFG1 &= ~OFIFG;                 //清除振荡错误标志
              for(i = 0; i < 100; i++)
             _NOP();                  //延时等待
              }
          while ((IFG1 & OFIFG) != 0);      //如果标志为1继续循环等待
          IFG1&=~OFIFG;
      }
      void int_pwm()
      {
        P1SEL|=PWM;//选择P12作为PWM输出
        P1DIR|=PWM;  
        TACCR0=800;//PWM信号周期10KHz
        TACCR1=100;//占空比1:1
        TACCTL1=OUTMOD0+OUTMOD1+OUTMOD2; //输出模式选择
        TACTL|=TASSEL1+MC0;
      }
      void main()
      {
        WDTCTL=WDTPW+WDTHOLD;//关看门狗
        int_clk();  //初始化时钟
        int_pwm();  //初始化PWM
        while(1);//结束
      }
      再思考一下
      在线情况
      4
      • 头像
      • 级别
        • 积分21
        • 经验516
        • 文章33
        • 注册2009-10-13
        TBCTL = TBSSEL0 + TBCLR;
          TBCCR0 = 800;
          TBCCTL1 = OUTMOD_7;
          TBCCR1 = 200;
         
          P4DIR |= 0x02;
          P4SEL |= 0x02;
          TBCTL |= MC0;
        再思考一下
        Powered by LeadBBS 9.2 .
        Page created in 0.2500 seconds with 5 queries.