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

TimerA定时 ————禁止TimerA中断的问题

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

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

程序如下:

#include "msp430x16x.h"

/*初始时钟设置方式1*/

/*void init_SMCLK(void)

{

BCSCTL1&=~XT2OFF;//XT2有效

DCOCTL = DCO0 + DCO1 + DCO2;              // DCO设置为最大频率

BCSCTL1 = RSEL0 + RSEL1 + RSEL2;          // XT2振荡器开启, 选择最高标称频率

BCSCTL2 |= SELS;                   //选择SMCLK时钟源为XT2CLK,18M

}

void int_timer(void)

{

TACTL|=TASSEL1+TACLR+ID0+ID1;//选择SMCLK作为定时器的时钟,8分频

CCTL0=CCIE;

TACCR0=999;//中断频率为1K

TACTL|=MC_1+TAIE;//增加模式,并使能中断

}

int main( void )

{

 // Stop watchdog timer to prevent time out reset

 WDTCTL = WDTPW + WDTHOLD;

P4DIR|=BIT0;

init_SMCLK();

int_timer();

_EINT();

while(1);

}

#pragma vector=TIMERA1_VECTOR

__interrupt void Timer_A(void)

{

 //restore[i]=DAC12();

 // ADC12();

  P4OUT^=BIT0;

 // if(TAIV);

 //  CCR0 += 99;

}*/

//20000:37.56hz;999:376hz

/*#include  <msp430x16x.h>

int restore[100];

int j;

void int_clk()

{

char i;                  

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

BCSCTL2|=SELM_2+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_4+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;

}

void main(void)

{

 WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

 int_clk();

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

 CCTL0 = CCIE;                             // CCR0 interrupt enabled

 CCR0 = 49;

 TACTL = TASSEL_0 + 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();

}*/

#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();

}

kaixiang chen:

对不起,我的程序发错了,我想取消这个提问,以免麻烦各位

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