打印

430 IO即当AD用 又当IO口检测电平用,出怪事了?

[复制链接]
5228|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
void AD(void)
{  
SD16CTL = SD16SSEL_1 + SD16DIV_1;               // SLCK=MCLK=1M   2分频 f=500KHz,OSR=1024,参考电源暂不开启,转换前开,转换后关。节能!
  SD16CCTL0 = SD16DF + SD16OSR_1024 + SD16SNGL;   // + SD16UNI // 输出格式为2的补码(8000--7FFF)+过采样速率1024+单次转换 双极性模式(默认模式)
  SD16INCTL0 = SD16INTDLY_0;                      // 中断延时(4第四次采样中断)   
   
  SD16AE = SD16AE0+SD16AE1;               // 设置通道0 因为通道0占用的脚是P1.0 P1.1
  SD16INCTL0 |=SD16GAIN_32 + SD16INCH_0;  // +增益为x32+通道为
   
  SD16CTL |= SD16REFON;               // 只打开1.2V参考源  
  Delay_us(100);                        
  SD16CCTL0 |=(SD16SC + SD16IE);      // 启动 SD16 进行转换并且允许 SD16 中断。

}



uchar check(void)
{
  unsigned char sta;
  SD16CCTL0 &= ~(SD16SC + SD16IE);          //关闭AD
  SD16AE &= ~(SD16AE0+SD16AE1);//关闭模拟输入
  P1SEL &=~(BIT0+BIT1); //P1.0 P1.1设为普通IO,输入输出功能
  P1REN &=~(BIT0+BIT1); //P1.0 P1.1上拉,下拉禁止
  P1DIR |=BIT0;         //P1.0 设为输出 1输出 0输入
  P1DIR &=~BIT1;        //P1.1 设为输入
  P1OUT |=BIT0;         //P1.0 输出高电平
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  if(P1IN & BIT1)   //获取P1.1引脚电平
    sta=0;//RTC 在线
  else
    sta=1;//断线
  return sta;
}


void main()
{
  BCSCTL1 = CALBC1_1MHZ;   // Set DCO to 1MHz 校正数据
  DCOCTL  = CALDCO_1MHZ;   // 校正  
  AD();
  check(); //运行完成这函数后,AD再也得不到值??为什么 ??????????????单独AD对,单独IO电平检测对。切换后就不对!!求解

}

#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
  SD16CCTL0 &= ~(SD16SC + SD16IE);       // SD16停止转换,禁止中断及关闭采集电路的电源。   
  adc_last_val = SD16MEM0; // 保存 ADC 最后的结果

相关帖子

沙发
ayb_ice| | 2011-1-24 16:21 | 只看该作者
一般不能这样用的
即使能这样用,结果也不准的

使用特权

评论回复
板凳
zhuyi2576|  楼主 | 2011-1-24 16:50 | 只看该作者
为什么?
我单独用AD功能时,我AD结果是很准的,,,,

在AD后加上了这个普通IO切换 AD就检测不到了,不是准不准的问题了,是AD功能无法用了,崩溃呀,搞了二天了

使用特权

评论回复
地板
yewuyi| | 2011-1-24 17:09 | 只看该作者
如果你是做AD口和输入口使用,则直接合并用AD口判断即可,根据AD值判断IO口输入是高还是低。

如果是既做输出口,又做AD口,那么可能会死的很惨,至少要保证两路不能出现电气上的冲突,否则会造成IO口栓死。

使用特权

评论回复
5
ayb_ice| | 2011-1-24 17:20 | 只看该作者
能不能既做AD输入又做普通IO这要看具体的芯片手册
有些芯片确实明确表示可以,但一般也建议不要这样去做
而有些芯片明确表示不可以,那肯定不能这样用的

使用特权

评论回复
6
twz8858877| | 2011-1-24 17:23 | 只看该作者
看看要使用ADC对IO配置有什么要求。

使用特权

评论回复
7
zhuyi2576|  楼主 | 2011-1-24 22:40 | 只看该作者
大家看一下,我程序并没有同时使用呀,先AD,再当IO口用,,IO口用完再用AD时,重新配置过了AD,可为什么就是不行呢?

我用的是MSP430F2013

使用特权

评论回复
8
yewuyi| | 2011-1-25 08:36 | 只看该作者
俺不是告诉你了嘛,你首先要保证没有电气上的冲突

使用特权

评论回复
9
ayb_ice| | 2011-1-25 08:36 | 只看该作者
LS
检查程序

使用特权

评论回复
10
zhuyi2576|  楼主 | 2011-1-25 08:50 | 只看该作者
谢谢大家

设置都在上面,实在没有看到哪有电气冲突!望指点

使用特权

评论回复
11
twz8858877| | 2011-1-25 10:04 | 只看该作者
程序有问题,AD转换还未完成就开始转换成普通IO了,在AD(); 和  check();中间加延时,或者检测一个AD完成的标志位。

使用特权

评论回复
12
ayb_ice| | 2011-1-25 10:04 | 只看该作者
你的MAIN都没有WHILE(1)循环

使用特权

评论回复
13
zhuyi2576|  楼主 | 2011-1-25 10:08 | 只看该作者
在采AD时,P1.0 P1.1 是做差分AD,,AD采集完 当IO口用,P1.0输出高电平,P1.1采集这个电平,当然中间有转换电路,有可能为高,也有可能为低

使用特权

评论回复
14
twz8858877| | 2011-1-25 10:46 | 只看该作者
不是电气冲突,而是程序的控制时序问题,在AD();函数中将AD打开进行转换,但是AD转换是需要时间的,紧接着的check();函数马上将AD转换关闭了,此时的AD转换还未完成,当然不会进入AD中断了。

使用特权

评论回复
15
zhuyi2576|  楼主 | 2011-1-25 22:24 | 只看该作者
找到一个问题:我在这二个脚之间接了一个100UF电容,,,,,放电竟然要很长时间,把电容去掉就行了。但AD严重飘,,唉

使用特权

评论回复
16
huangqi412| | 2011-1-26 09:58 | 只看该作者
电路也要考虑,把图贴上来吧。

使用特权

评论回复
17
zhuyi2576|  楼主 | 2011-1-26 22:24 | 只看该作者
[img][/img]

使用特权

评论回复
18
zhuyi2576|  楼主 | 2011-1-26 22:25 | 只看该作者
不知道在哪上图,,,,

使用特权

评论回复
19
zhuyi2576|  楼主 | 2011-1-26 22:26 | 只看该作者
终于上来的,接的是一热电偶

ourdev_606655EXYM8T.jpg (75.96 KB )

ourdev_606655EXYM8T.jpg

使用特权

评论回复
20
t.jm| | 2011-1-26 23:00 | 只看该作者
本帖最后由 t.jm 于 2011-1-26 23:05 编辑

F2013我还有点熟!
问题极有可能是因为:
F2103是16 位的Sigma-Delta ADC,你又是配置为第4次采样中断,AD()启动采样后中断没来,
AD又被check()禁止了。(就如14楼说的)

你把check()放到__interrupt void SD16ISR(void) 里去试一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

258

帖子

2

粉丝