3795|4

25

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

msp430f149定时器和A/D用出现问题 [复制链接]

rt:我想用定时器去控制AD数据采集,但是没有达到理想结果,我首先用TB定时10ms,然后再TB的中断服务程序里面启动TA,给TA赋初值300us,TA的终端里面开启AD并给TA重新装入100us的值,到100us后关掉AD,程序编译没有问题,但是我运行的时候tbcounter和f1的数值比j的值要大4倍多,原则上应该几个值是一样的,在线等

#include <msp430x14x.h>

void InitSys(void)                      //初始化系统时钟
{
 unsigned int iq0;
 _DINT();                                //关中断
 BCSCTL1 &=~XT2OFF;
   do
   {
      IFG1 &= ~OFIFG;   // 清除振荡器失效标志
      for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
   }
   while ((IFG1 & OFIFG) != 0);  // 判断XT2是否起振 
   BCSCTL2 =SELM1+SELS;                 // MCLK,SMCLK时钟为XT2,8M
  /* DCOCTL = 0XFF;
   BCSCTL1 = RSEL2 + RSEL1 + RSEL0;*/
   //BCSCTL2 = SELM0;
  
}

void delay(void)
{
  int i;
  for(i=0;i<1000;i++);
}


void Init_ad(void) //初始化AD
{
  P6SEL |= 0x08;//A3
  ADC12CTL0 =  ADC12ON +SHT0_0 + REFON ;                  //+ MSC;//内核打开,采样保持定时定器, 
  ADC12CTL1 = SHP+ ADC12SSEL_2 + CSTARTADD_3+ CONSEQ_0  ; //MCLK,单通道多次转换,采样来自采样定时器,转换存储地址为mem3
  ADC12MCTL3 = SREF_1 + INCH_3;                           //Vr+=AREF+,VR-=AVSS;
  ADC12CTL0 |= ENC;                                       //使能转换
  ADC12IE = 0X08;                                         //允许a3中断
  delay();
}

void Init_ta(void)                            //初始化定时器A
{
  CCTL0 = CCIE;                               //允许CCR0中断
  CCR0 = 0;//300us
  //CCTL1 = CCIE;
  //CCR1 = 5000;
  TACTL = TASSEL_2  + TACLR + ID_1 ;         //选择系统主时钟8M,2分频,定时器清零,增记数模式
 
}

void Init_tb(void)                                //初始化定时器B
{
  TBCCTL0 = CCIE;
  TBCCR0 = 40000;                                  //10ms
  TBCTL = TBSSEL_2 + TBCLR   + MC_1 + ID_1;        //MCLK8M/2,clear,
 
}

unsigned int result=0;
int ReadArray[400]={0};
int Aver[100]={0};
double sum=0;
unsigned int m,n;

int tbcounter=0;
int ta1=0;

int j=0;
int i=0;
int f1=0;

int k=0;
int counter=0;
long int ADcounter=0;
int flag;
int tempkey;
void main(void)
{
   WDTCTL = WDTPW + WDTHOLD;
  
   P5DIR = BIT4 + BIT5 + BIT7;
   P5SEL = BIT4 + BIT5;
  
  
   InitSys();
   Init_ad();
   Init_ta();
   Init_tb();
  
   P5OUT =0X00;//open ad627
   //ADC12CTL0 = ADC12ON;//open ad
   _EINT(); //开总中断
   flag = 0;
 
   while(1)
   {
     if(flag==1)
     {
      // P5OUT = 0X80;
     ADC12CTL0 |= ADC12SC;
     }
      if(ADcounter==11)
  {
     ADC12CTL0 &= ~ADC12SC;
    Aver[j++]=sum/11;
    ADcounter=0;
    sum=0;
  }
   }
   //m=ADcounter&0XFFFF;
   // n=(ADcounter>>16)&0XFFFF;
   // n=m*1500/4096;
}


#pragma vector = ADC_VECTOR
__interrupt void ADC12ISR(void)
{
  sum+=ADC12MEM3;
  ADcounter++;
 
 
}


#pragma vector = TIMERA0_VECTOR
__interrupt void TIMER_A(void)
{
  counter++;
 if(counter==2)
 {
   //P5OUT = 0X80;
  //  ADC12CTL0 |= ADC12SC;
   flag = 1;
   CCR0 = 400;
   f1++;
 }
 if(counter==3)
 {
   flag=0;
   P5OUT = 0X00;
   //TBCTL ^= MC_1;
   TACTL ^=MC_1;

   counter=1;
 }
 
}
 

#pragma vector = TIMERB0_VECTOR
__interrupt void Timer_B(void)
{
   P5OUT = 0X80;
      CCR0=1200;
      tbcounter++;
             TACTL += MC_1;
}

最新回复

给TA赋值1200,然后再TA的中断里面更改为400,要把TA暂停,只要把TA中断关闭就行了。  详情 回复 发表于 2012-1-10 10:23
 
点赞 关注

回复
举报

25

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
 
 

回复

188

帖子

0

TA的资源

纯净的硅(中级)

板凳
 

回复 沙发 f585885 的帖子

中断嵌套中断时,要在中断中把全局变量打开,在TB的定时中断里其实全局中断时关闭的,故没有办法响应TA中断。另外,我也不太理解你这么做的意思
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 peter_zheng 的帖子

我的想法就是TB定时10ms,它一直都是循环的,TB10ms中断发生一次,给TA赋值1200,然后再TA的中断里面更改为400,之后就把TA暂停了,等到TB把它启动!
 
 
 

回复

153

帖子

0

TA的资源

一粒金砂(高级)

5
 
给TA赋值1200,然后再TA的中断里面更改为400,要把TA暂停,只要把TA中断关闭就行了。
 
个人签名希望在论坛中答疑解惑、得到启示,找到互惠的朋友。
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表