打印

求助PIC16F1826的AD转换问题

[复制链接]
3561|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huang51|  楼主 | 2011-9-26 21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
运用PIC16F1826作AD转换,在AN1,2,3上遇到了不能转换(测不到该脚上的电压)的问题,这些程序是在原16F616上通过的,只是稍作修改,移植过来的,编译没有任何问题,实测各引脚上均加有电压,但就是测不到,转换结果基本为0,采用8位AD也是同样的结果,由于这几个脚复用功能太多,复位时应该是将比较器,电容传感等功能设为关闭的,也进行过设置关闭,同样不起作用,不知什么原因,请各位帮手指点指点,以下为原程序:
/*==========================*/
void main(void)
{
PORTA=0b10010000;
TRISA=0b11011111;
PORTB=0b00001011;
TRISB=0b00010010;//RB0为CCP1


ANSELA=0b00000111;
ANSELB=0;


//TMRO intialize
OSCCON=0b01101010;//设置内部震荡为4MHZ
OPTION_REG=0b10000110;//禁止上拉使能,预分频器分配给TMR0,TMRO设置为128分频
TMR0=218;
INTCON=0b10100000;//TMR0中断使能,全局中断使能
while(1)
  {

     
   batvADC();
   //其它处理
  }
}
/*=========电压AD转换函数===========*/

void batvADC(void)
{
ADCON1=0b10010000;//ADC时钟8分频,参考电压VDD,转换结果右对齐
ADCON0=0b00001001;//使能ADC,并设置AD通道为AN2
_delay(100);
GO_nDONE=1;
while(GO_nDONE)
{
;
}
volvalue=ADRESH<<8+ADRESL;
}
沙发
yadaovs| | 2011-9-27 23:19 | 只看该作者
有可能是以下问题,LZ试试好了:
1.最后一条语句的问题,不要连写,试试看先读出ADRESH到一个变量中,下条语句再加上ADRESL吧。之前用PIC16F1825的这种写法基本上不正确。
        temp=ADRESH;
        temp=temp<<8+ADRESL;
2.注意volvalue变量加 volitale标识没有,最后加上。
3.转换完了以后要把AD关
4.如果还不行就把频率降低试试。
祝好运~

使用特权

评论回复
板凳
huang51|  楼主 | 2011-9-30 20:54 | 只看该作者
谢谢yadaovs的回复, 这几天有点忙,没上论坛,问题已解决,确如您所说,是最后一句语句的问题,改成以下三句,则无论在何编译器下,均可通过。给大家提个醒,能用简单语句则尽量不用复合语句。
temp=ADRESH;
temp=temp<<8;
temp=temp+ADRESL;

使用特权

评论回复
地板
谈的元| | 2011-10-1 21:12 | 只看该作者
优先级别问题:
temp=temp<<8+ADRESL; ==     temp=temp<<(8+ADRESL);

3楼需要的是:temp=(temp<<8)+ADRESL;

使用特权

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

本版积分规则

4

主题

31

帖子

0

粉丝