【求助】MSP430 定时器A产生波形问题

楼主
【求助】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,估计这段程序忽视了某些东西,如果有高人写过类似程序,跪求啊!!!
1楼
你可以使用MSP430的TB模块,TB模块里头可以带有多个定时器功能的子模块。有足够的TB.x子模块来让你实现PWM功能。这样子的例子很多,你可以参考一下TI所提供的TB方面的例子,更重要的如果你需要应用好这些子模块,你必须要认真了解其原理。
2楼
#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);//结束
}
3楼
TBCTL = TBSSEL0 + TBCLR;
  TBCCR0 = 800;
  TBCCTL1 = OUTMOD_7;
  TBCCR1 = 200;
 
  P4DIR |= 0x02;
  P4SEL |= 0x02;
  TBCTL |= MC0;

电脑版 Page created in 0.1699 seconds width 3 queries.