求大神们帮下忙 msp430AD 的问题

[复制链接]
1735|13
 楼主| 轻舞飞扬-青春 发表于 2014-7-29 14:34 | 显示全部楼层 |阅读模式
/********代码********/
#include<msp430x16x.h>
#define uchar unsigned char
#define uint unsigned int

// 精准延时函数
#define CPU_F ((double)800000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

void ADC12INIT();
uint i;
uint ADCO;
void main()
{
  ADC12INIT();//ADC12初始化
  while(1)
  {
   ADC12CTL0|=ADC12SC;//启动转换
   _BIS_SR(GIE);//开启总中断
  }
}
void ADC12INIT()
{
  WDTCTL=WDTPW+WDTHOLD;//关闭看门狗定时器
  P1DIR|=BIT1;//p1.1输出
  P1OUT=0x00;//P1初始化
  P6SEL|=BIT0;//使用P6.0的复用口A0输入模拟量
  
  ADC12CTL0=ADC12ON+REFON+REF2_5V;//打开ADC12,使用内部参考电压2.5V
  delay_ms(30);//延时30ms
  ADC12CTL0|=SHT0_12+MSC;//采样保持时间为12个时钟周期,使用采样定时器采样
  ADC12CTL1=SHP;
  
  ADC12MCTL0|=SREF_1+INCH0;//参考电压为Vref,AVSS,使用A0输入
  ADC12IE=0x01;
  
  ADC12CTL0|=ENC;//打开转换使能
  //ADC12CTL0|=ADC12SC;
  
}
#pragma vector=ADC_VECTOR
__interrupt void ADC12_ISR(void)
{
  //_BIS_SR(GIE);
  while((ADC12IFG&BIT0)==0);//判断是否转换结束
  ADCO=ADC12MEM0;//把转换得到值放入变量
  if(ADCO<0x7ff)//得到的值与1.5v比较
    {
       //P1OUT^=BIT1;
       //for(i=0;i<5000;i++);
       P1OUT&=~BIT1;//LED熄灭
    }
  else
    {
      P1OUT|=BIT1;//LED亮
     // delay_ms(200);
    }

采样时钟AD12OSC,系统时钟为默认

为什么我的LED一直亮,不管电压是几伏特。

感觉输入信号加不进去
 楼主| 轻舞飞扬-青春 发表于 2014-7-29 14:56 | 显示全部楼层
大神们帮下忙    搞了几天了出不来啊
chenyu988 发表于 2014-7-29 16:07 | 显示全部楼层
在中断里面又while((ADC12IFG&BIT0)==0);//判断是否转换结束 不对吧,另外看看转换标志是自动还是需要软件清除
 楼主| 轻舞飞扬-青春 发表于 2014-7-29 16:47 | 显示全部楼层
手册里说当访问ADC12MEMx时,标志位自动清除
 楼主| 轻舞飞扬-青春 发表于 2014-7-29 17:06 | 显示全部楼层
chenyu988 发表于 2014-7-29 16:07
在中断里面又while((ADC12IFG&BIT0)==0);//判断是否转换结束 不对吧,另外看看转换标志是自动还是需要软件 ...


手册里说当访问ADC12MEMx时,标志位自动清除
chenyu988 发表于 2014-7-29 17:18 | 显示全部楼层
while((ADC12IFG&BIT0)==0);//判断是否转换结束
把这句去掉试试,你既然用了中断,就不需要再去查询标志了
 楼主| 轻舞飞扬-青春 发表于 2014-7-29 18:55 | 显示全部楼层
chenyu988 发表于 2014-7-29 17:18
while((ADC12IFG&BIT0)==0);//判断是否转换结束
把这句去掉试试,你既然用了中断,就不需要再去查询标志了 ...

没有用啊,我不加信号也是一直亮:'(:'(
Z_J_Q 发表于 2014-7-30 08:35 | 显示全部楼层
是不是因为你只是打开了P6.0口的第二功能,但是没有设置改口信号的方向为输入呢,你在P6SEL|=BIT0;前面加一条P6DIR = 0XFE;这条指令试试看
 楼主| 轻舞飞扬-青春 发表于 2014-7-31 09:49 | 显示全部楼层
Z_J_Q 发表于 2014-7-30 08:35
是不是因为你只是打开了P6.0口的第二功能,但是没有设置改口信号的方向为输入呢,你在P6SEL|=BIT0;前面加一 ...

恩恩 我试试  不是默认的吗
奕者1999 发表于 2014-7-31 13:48 | 显示全部楼层
我记得应该是开总中断进低功耗模式,这样会一直重复启动adc的,等不到他转换完成。
juky20080105 发表于 2014-8-1 15:02 | 显示全部楼层
能进入中断吗,你采集到的ADC12MEM0是多少?
 楼主| 轻舞飞扬-青春 发表于 2014-8-1 15:04 | 显示全部楼层
奕者1999 发表于 2014-7-31 13:48
我记得应该是开总中断进低功耗模式,这样会一直重复启动adc的,等不到他转换完成。 ...

我使用连续转换啊  没问题
 楼主| 轻舞飞扬-青春 发表于 2014-8-1 15:06 | 显示全部楼层
问题解决了   P1DIR|=BIT1;//p1.1输出
  P1OUT=0x00;//P1初始化
  P6SEL|=BIT0;//使用P6.0的复用口A0输入模拟量
  
   这些声明不能放子函数里面   谢谢大家
juky20080105 发表于 2014-8-1 16:07 | 显示全部楼层
轻舞飞扬-青春 发表于 2014-8-1 15:06
问题解决了   P1DIR|=BIT1;//p1.1输出
  P1OUT=0x00;//P1初始化
  P6SEL|=BIT0;//使用P6.0的复用口A0输入模 ...

可是放在子函数里不影响你的端口初始化啊。
这3条语句已经执行过了的。
我觉得不影响你的执行结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部