打印

关于PIC16F690AD的问题

[复制链接]
3208|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cwandzll|  楼主 | 2011-8-28 12:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
690,带10位,11路AD。
这两天被搞的头大了,真的很奇怪,一些AD口工作正常,一些AD口读数在上电的瞬间有,然后马上就变0了,不知道是我的哪里没有配置好!请知情人告知下,昨晚上一晚上没有睡好就因为这个。
比如RB5口就不行。一上电的瞬间有AD数值,然后马上变0.RA2口也一样!
RB5/AN11/RX/DT
RA2/AN2/T0CKI/INT/C1OUT
大家帮忙看看!
我把配置给贴出来!
GIE=0;                  //GIE:全局中断总使能位
CM2CON0=0;                                 
CM2CON1=0;  
CM1CON0=0;
RCSTA=0;
TXSTA=0;
PIE1=0;
PIE2=0;
PIR1=0;
C1ON=0;
C2ON=0;
IOCB=0x00;
IOCA=0x00;
ANSEL=0x00;
ANSELH=0x08;
OPTION_REG=0x47;                              
TRISA=0x08;             //设置端口A输入输出(00001000)               
TRISB=0x60;             //设置端口B输入输出(01100000)         
TRISC=0x07;             //设置端口C输入输出(00000111)
TMR0=0xed;              //TMR0赋初值(8位时钟)---5ms
T1CON=0b10100000;
INTCON=0xa0;            
ADCON1=0x50;                  
ADCON0=0xAD;
上面是想把RB5作为AD口输入!但是情况就是上电一下有AD值,马上变0.
我用其他的口比如RC1,就工作正常!请大家帮帮忙!谢谢!



ADCON0=0xAD;
沙发
yewuyi| | 2011-8-29 08:44 | 只看该作者
我只能告诉你,690的ADC没有问题,因为我自己就批量用过690这个型号。

690的IO口复用的比较厉害,首先你要确定各个复用功能都关闭了吗?
其次你的通道切换是否准确?通道切换后要留出一点时间给ADC的采保电容充电。
你的ADC系统设置是否正确?

你可以一个通道一个通道的测试。

使用特权

评论回复
板凳
NE5532| | 2011-8-29 16:50 | 只看该作者
我也可以告诉楼主,690我也批量用,没问题。检查自己的设置有没有低级错误。先从静态电压开始测量起。

使用特权

评论回复
地板
virtualtryon| | 2011-8-30 21:52 | 只看该作者
本帖最后由 yewuyi 于 2011-8-31 09:06 编辑

楼主把你的AD采样的程序贴出来,而不仅仅是配置程序,比较能发现问题。
A/D采样有两个过程,一个是采样保持,另一个是转换。
A/D模块内部有一个采样保持电容,一般在几十PF,A/D转换开始时,首先用模拟开关切换转换通道,切换后,输入电压通过输入电阻向采样电容充电。
所以采样保持要延时一段时间,以保证采样保持电容能充满电,之后开始转换。
LZ会不会是采样保持的时间不够?

使用特权

评论回复
5
lzw625| | 2011-9-12 20:02 | 只看该作者
690上电瞬间采集AD数据是不准的,是有问题,要等待上电稳定后才可以,

使用特权

评论回复
6
andrewxu| | 2011-9-13 09:27 | 只看该作者
690批量太多了,确定是你自己的问题,
你把其他没有用到的复用功能 全部关闭
单独调试看行不行

使用特权

评论回复
7
yewuyi| | 2011-9-13 13:11 | 只看该作者
690上电瞬间采集AD数据是不准的,是有问题,要等待上电稳定后才可以,
lzw625 发表于 2011-9-12 20:02


如果你打开BOD的话,则是不可能的,除非你信号本身就是波动的。

使用特权

评论回复
8
KK无语了| | 2015-7-17 13:54 | 只看该作者
#include<pic.h>
#define uint unsigned int
#define uchar unsigned char
__CONFIG(0x3B31);
const uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//1,2,3,4,5,6,7,8,9共阳极数码管
const uchar table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点数字
void delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
        for(b=110;b>0;b--);
}
void chushihua()
{
        uchar i;
        TRISA=0X01;
        PORTA=0;
        TRISB=0;
        TRISC=0;
        PORTB=0;
        PORTC=0xff;
        ADCON0=0X85;
        ADRESH=0;
        ADRESL=0;
        ADCON1=0X10;
        NOP();NOP();
        for (i=0;i<3;i++);
        NOP();NOP();
}
uint getad()
{
        uint adval,aa;
        float advalf;
        GO=1;//启动转换
        while(GO);
        adval=ADRESH;
        adval=adval<<8|ADRESL;
        advalf=adval/1023*5000;
        aa=(int)advalf;
        return(aa);
}
void xianshi(uchar num1,uchar num2,uchar num3,uchar num4)
{
        PORTC=table[num1];
        PORTB=0x10;       
        delay(2);
        PORTC=table[num2];
        PORTB=0x20;
        delay(2);
        PORTC=table1[num3];
        PORTB=0x40;
        delay(2);
        PORTC=table[num4];
        PORTB=0x80;
        delay(2);
}
void main()
{
        uint lednum;
        uchar a1,a2,a3,a4;
        chushihua();
        while(1)
        {
                lednum=getad();
                a1=lednum/1000;
                a2=lednum%1000/100;
                a3=lednum%100/10;
                a4=lednum%10;
                xianshi(a1,a2,a3,a4);
        }
}
有谁知道这段代码写进芯片16F690之后,使用AN1端口只是在测试5V的时候有显示数字500,小于5V没有显示是什么原因

使用特权

评论回复
9
KK无语了| | 2015-7-17 13:56 | 只看该作者
yewuyi 发表于 2011-9-13 13:11
如果你打开BOD的话,则是不可能的,除非你信号本身就是波动的。

#include<pic.h>
#define uint unsigned int
#define uchar unsigned char
__CONFIG(0x3B31);
const uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//1,2,3,4,5,6,7,8,9共阳极数码管
const uchar table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点数字
void delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
        for(b=110;b>0;b--);
}
void chushihua()
{
        uchar i;
        TRISA=0X01;
        PORTA=0;
        TRISB=0;
        TRISC=0;
        PORTB=0;
        PORTC=0xff;
        ADCON0=0X85;
        ADRESH=0;
        ADRESL=0;
        ADCON1=0X10;
        NOP();NOP();
        for (i=0;i<3;i++);
        NOP();NOP();
}
uint getad()
{
        uint adval,aa;
        float advalf;
        GO=1;//启动转换
        while(GO);
        adval=ADRESH;
        adval=adval<<8|ADRESL;
        advalf=adval/1023*5000;
        aa=(int)advalf;
        return(aa);
}
void xianshi(uchar num1,uchar num2,uchar num3,uchar num4)
{
        PORTC=table[num1];
        PORTB=0x10;        
        delay(2);
        PORTC=table[num2];
        PORTB=0x20;
        delay(2);
        PORTC=table1[num3];
        PORTB=0x40;
        delay(2);
        PORTC=table[num4];
        PORTB=0x80;
        delay(2);
}
void main()
{
        uint lednum;
        uchar a1,a2,a3,a4;
        chushihua();
        while(1)
        {
                lednum=getad();
                a1=lednum/1000;
                a2=lednum%1000/100;
                a3=lednum%100/10;
                a4=lednum%10;
                xianshi(a1,a2,a3,a4);
        }
}
大神知道这段代码写进芯片16F690之后,使用AN1端口只是在测试5V的时候有显示数字500,小于5V没有显示是什么原因吗?

使用特权

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

本版积分规则

7

主题

16

帖子

0

粉丝