TI中文支持网
TI专业的中文技术问题搜集分享网站

TimerA 定时器的问题

您好,作为初学者,我向你们的msp430单片机发出由衷的赞美。但我在编程使用时出现了问题,我用的是msp4301611的片子,但你们能帮我看下简单的timerA定时采样的程序吗?

我的那条 "TACTL&=~TAIE;//禁止TimerA中断"语句并没有起到禁止中断的作用啊(这条语句在void ADC12(void)函数里面),能帮我修改并给我正确的程序吗?谢谢。如果能够禁止中断,那是什么原因造成我在使用中遇见的问题呢?谢谢

程序如下:

#include  <msp430x16x.h>

int restore[100];

int j;

void int_clk()

{

char i;                  

BCSCTL1&=~XT2OFF;// 打开XT2振荡器

BCSCTL2|=SELM1+SELS;//MCLK 8M 和SMCLK 1M

do

{

 IFG1 &=~OFIFG;          //清楚震荡错误标志

 for(i=0;i<100;i++)

   _NOP();

}

while((IFG1&OFIFG)!=0);

IFG1&=~OFIFG;

}

/*定义ADC初始状态*/

void init_ADC12(void)

{ int k;

 P6SEL|=0X01;              //打开P6的第二功能

 ADC12CTL0=SHT0_1+REFON+REF2_5V+ADC12ON;//采样保持选择K,使能在一次采样和转换时间为1/Ks,打开参考电压发生器,打开内部参考电压选择位中的2.5V,打开ADC12的内核

                                        //ADC12CTL1|=ADC12SSEL1+ADC12SSEL1;

  ADC12CTL1 = SHP;                          // 采样信号源自采样定时器有采样输入信号的上升沿触发采样定时器

  ADC12MCTL0 =INCH_0+SREF_1;                    // 参考电压选择为Vr+=Vref+ Vr-=AVss

  for ( k=0; k<0x3600; k++)                  // 为参考源的启动延时

 {

 }

 ADC12CTL0 |= ENC;                         // 使能ADC12转换

}

//采样

void ADC12(void)

{

 ADC12CTL0|=ADC12SC;           //开始转换,在ENC=1,ISSH=0;SHP=1的情况下A/D转换完后自动复位

 while((ADC12IFG&BIT0)==0);

  restore[j++]= ADC12MEM0;

  if(j>99)

   {

     j=0;

     TACTL&=~TAIE;//禁止TimerA中断

   }

}

void main(void)

{

 WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

 int_clk();

 P4DIR |= 0x01;                            // P1.0 output

 CCTL0 = CCIE;                             // CCR0 interrupt enabled

 CCR0 = 99;

 TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode

 init_ADC12();

 _EINT();

  while(1);

}

// Timer A0 interrupt service routine

#pragma vector=TIMERA0_VECTOR

__interrupt void Timer_A (void)

{

 P4OUT ^= 0x01;                            // Toggle P1.0

 ADC12();

}

user113574:

把CCIE也清掉试试看。

因为定时器A和捕获/比较的中断入口是一个地方,TAIE只是关闭了定时器功能的中断。

Richard Ma:

(1)

如果是用Capture/Compare模式,禁用中断应该用TACCTL0 &= ~CCIE;

普通模式才是用TACTL &= ~TAIE; 来禁用中断

=======================

(2)

CCTL0 = CCIE;     应该是 ->     TACCTL0 |= CCIE;

这是使能timerA的Capture/Compare中断

=======================

(3)

如果不是使用Capture/Compare需要用

TACTL = TASSEL_2 + MC_1 + TAIE;

来使能timerA中断

赞(0)
未经允许不得转载:TI中文支持网 » TimerA 定时器的问题
分享到: 更多 (0)