打印

求大神们帮下忙 msp430AD 的问题

[复制链接]
1379|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
/********代码********/
#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时,标志位自动清除

使用特权

评论回复
5
轻舞飞扬-青春|  楼主 | 2014-7-29 17:06 | 只看该作者
chenyu988 发表于 2014-7-29 16:07
在中断里面又while((ADC12IFG&BIT0)==0);//判断是否转换结束 不对吧,另外看看转换标志是自动还是需要软件 ...


手册里说当访问ADC12MEMx时,标志位自动清除

使用特权

评论回复
6
chenyu988| | 2014-7-29 17:18 | 只看该作者
while((ADC12IFG&BIT0)==0);//判断是否转换结束
把这句去掉试试,你既然用了中断,就不需要再去查询标志了

使用特权

评论回复
7
轻舞飞扬-青春|  楼主 | 2014-7-29 18:55 | 只看该作者
chenyu988 发表于 2014-7-29 17:18
while((ADC12IFG&BIT0)==0);//判断是否转换结束
把这句去掉试试,你既然用了中断,就不需要再去查询标志了 ...

没有用啊,我不加信号也是一直亮:'(:'(

使用特权

评论回复
8
Z_J_Q| | 2014-7-30 08:35 | 只看该作者
是不是因为你只是打开了P6.0口的第二功能,但是没有设置改口信号的方向为输入呢,你在P6SEL|=BIT0;前面加一条P6DIR = 0XFE;这条指令试试看

使用特权

评论回复
9
轻舞飞扬-青春|  楼主 | 2014-7-31 09:49 | 只看该作者
Z_J_Q 发表于 2014-7-30 08:35
是不是因为你只是打开了P6.0口的第二功能,但是没有设置改口信号的方向为输入呢,你在P6SEL|=BIT0;前面加一 ...

恩恩 我试试  不是默认的吗

使用特权

评论回复
10
奕者1999| | 2014-7-31 13:48 | 只看该作者
我记得应该是开总中断进低功耗模式,这样会一直重复启动adc的,等不到他转换完成。

使用特权

评论回复
11
juky20080105| | 2014-8-1 15:02 | 只看该作者
能进入中断吗,你采集到的ADC12MEM0是多少?

使用特权

评论回复
12
轻舞飞扬-青春|  楼主 | 2014-8-1 15:04 | 只看该作者
奕者1999 发表于 2014-7-31 13:48
我记得应该是开总中断进低功耗模式,这样会一直重复启动adc的,等不到他转换完成。 ...

我使用连续转换啊  没问题

使用特权

评论回复
13
轻舞飞扬-青春|  楼主 | 2014-8-1 15:06 | 只看该作者
问题解决了   P1DIR|=BIT1;//p1.1输出
  P1OUT=0x00;//P1初始化
  P6SEL|=BIT0;//使用P6.0的复用口A0输入模拟量
  
   这些声明不能放子函数里面   谢谢大家

使用特权

评论回复
14
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

粉丝