打印

PIC16F690单片机AD转换出现异常的现象,有高手可以解惑吗?

[复制链接]
1021|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
KK无语了|  楼主 | 2017-3-9 22:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是程序
#include<pic.h>
#define uint unsigned int
#define uchar unsigned char
__CONFIG(0x3BE4);//0x3b34
void reset();
void delayus(uint x ,uchar y);
void delay(uint x);
uchar getad();//获取函数选择AN11 ADCON0=0X2D;
uchar getad1();//获取函数选择AN10 ADCON0=0X29;
//uchar k;
void main()
{
//        k=1;
        uchar r,g,n,f;
        r=0;
        g=0;
        n=0;
        f=0;
        reset();
        PORTC=0X30;
        r=getad();
        while(!(r<180&&r>80));
        r=getad();
        while(!(r<180&&r>80));
        r=getad();
        while(!(r<180&&r>80));
        PORTB=0X40;
        delay(2);
        r=getad1();
        if(r<4)  n++;//短路检测
        r=getad1();
        if(r<4)  n++;//短路检测
        r=getad1();
        if(r<4)  n++;//短路检测
        while(n==3)       
        {
                PORTB=0;
        }
        r=getad1();
        if(r>89) f++;//开路检测1
        r=getad1();
        if(r>89) f++;//开路检测2
        r=getad1();
        if(r>89) f++;//开路检测3
        r=getad1();
        if(r>89) f++;//开路检测4
        r=getad1();
        if(r>89) f++;//开路检测5
        r=getad1();
        if(r>89) f++;//开路检测6
        while(f>=4)
        {
          PORTB=0;
        }
               
        delay(30);
               
        INTCON=0XC0;//中断配置设置
       
        TMR1IE=1;//开启中断
       
        TMR1L=(65536-2000)%256;//中断初始值高位设置
       
        TMR1H=(65536-2000)/256;//中断初始值低位设置
       
        T1CON=0X01;//定时器开启时间设置是2ms切换一次
       
          g=getad1();//测试函数
          r=getad();//测试函数
        while((r>80&&r<180)&&(g>4&&g<89))
        {
                g=getad1();//测试函数
                  r=getad();//测试函数                       
        }
        PORTB=0;       
}       
void reset()
{
        OSCCON=0x61; //晶振选择4M 默认选项可以不写
       
        TRISA=0XFF; //A端口全部选择输入
       
        TRISB=0X30;        //RB6\RB7是输出控制端口RB4\RB5是AD端口检测脚位B端口引脚只有4位全部使用完
       
        TRISC=0; //C端口RC4\RC5\RC6\RC7控制,其他端口不使用选择输出
       
        PORTB=0;//示波器测试出现瞬态高电平点测试是否配置位导致的

        ADRESH=0;         //AD转换高位数值清零
       
        ADRESL=0;   //AD转换低位数值清零

        ANSELH=0X0C;//AN10、AN11模拟输入(xxxx1111)XXXX AN11\AN10\AN9\AN8               
}

/**毫秒级延时**/
void delay(uint x)
{
        uint a,b;       
        for(a=x;a>0;a--)       
                for(b=108;b>0;b--);
}
/**微秒级延时**/
void delayus(uint x ,uchar y)
{
        uint i;
        uchar j;
        for(i=x;i>0;i--);
        for(j=y;j>0;j--);               
}
uchar getad1()//高电压点测试函数
{
        uchar adval;
        ADCON1=0X10;//ADCON1=0X10;//选择fosc/8   //ADCON1=0X50;fosc/16先设置后开启       
        ADCON0=0X29;//选择AN10 ADCON0=0X29;选择AN11 ADCON0=0X2D;先设置后开启
        delay(1);//采样电容稳定时间                                       
        GO=1;//启动转换       
        while(GO);//等待标志位清零                               
        adval=ADRESH;//读取高位数据
        ADON=0;//关闭AD的上电
        return(adval);
}
uchar getad()//输入电压测试函数
{
        uchar adval;
        ADCON1=0X10;//ADCON1=0X10;//选择fosc/8   //ADCON1=0X50;fosc/16
        ADCON0=0X2D;//选择AN10 ADCON0=0X29;选择AN11 ADCON0=0X2D;
        delay(1);//采样电容稳定时间                                       
        GO=1;//启动转换               
        while(GO);//等待标志位清零                       
        adval=ADRESH;//读取高位数据
        ADON=0;//关闭AD的上电       
        return(adval);
}
void interrupt kk()//切换脉冲
{
        T1IF=0;//定时器标志位清零
        TMR1L=(65536-2000)%256;//定时延迟2ms
        TMR1H=(65536-2000)/256;
        PORTC=~PORTC;//按位去反方波

}

现象是只要我的两个AD转换程序一调用,B端口的输出(PORTB=0X40;)电平就会发生变化。
AD转换会影响其它引脚的输出电平吗?       

沙发
KK无语了|  楼主 | 2017-3-10 08:40 | 只看该作者
开路和短路保护(B口关闭)都是合理值,还没有触发保护,B端口就出现变化。屏蔽AD转换就可以实现功能,使用就会出现变化,开路和短路保护都还没有到触发值。B端口就出现变化。

使用特权

评论回复
板凳
NE5532| | 2017-3-10 10:35 | 只看该作者
用了十多年的PIC,没有发现这个问题,楼主多怀疑自己软硬件设计上是否存在漏洞。

使用特权

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

本版积分规则

2

主题

5

帖子

0

粉丝