打印

求教pic16F1824的内部ADC的问题

[复制链接]
4771|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bingbingrere|  楼主 | 2013-3-7 13:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天写了个1824内部ADC的程序,通过串口到上位机,但是不掉电的话数据不更新,只有断电后上电才回更新数据,还有就是在保持上电的情况下插拔ICD3连接到下载口的情况下,串口发出的数据也会随电位器的调节而有所改变。求教啊。

#include<pic.h>
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON  & CP_OFF  & BOREN_OFF & CLKOUTEN_OFF);
__CONFIG(WRT_OFF & STVREN_OFF & BORV_LO & BOREN_OFF & LVP_OFF);
__IDLOC7(0x20,0x12,0x06,0x01);
void Init(void);

unsigned char receive,xdata_m[50],address;
unsigned int  ithrob,byte_cnt,i,adnum;
unsigned char a1,a2,a3,a4;

void delay(unsigned int x)
{
        unsigned int a,b;
        for(a=x;a>0;a--)
                for(b=110;b>0;b--);
}

unsigned int get_ad()
{
        unsigned int adval;
        float advalf;
        delay(100);
        ADGO=1;
        while(ADGO);
        adval=ADRESH;//00000000 00000011
        adval=adval<<8|ADRESL;//00000011 11111111
        advalf=adval/1023.0*5.0;//==2.3843
        adval=advalf*1000;
        return (adval);       
}



void main()
{
        Init();

        while(1)
        {       
                adnum=get_ad();
                a1=adnum/1000;
                a2=adnum%1000/100;
                a3=adnum%100/10;
                a4=adnum%10;
        }
       
}

void Init(void)
{
        OSCCON = 0b01101000; //4MHZ
        TRISC = 0b00101111;
        TRISA = 0b00010111;
        ANSELA = 0x17;
        ANSELC = 0x0f;

//        Flag_1=0;       
        OPTION_REG = 0x05;  //1:64
        T1CON=0x31;//1:8
        TMR1IE=1;
        PEIE=1;
        GIE=1;     
        RCIE        = 1;
//        ADIE        = 1;  
        RCIF        = 0;
//        ADIF                = 0;
        TXEN        = 1;
        CREN        = 1;
        SYNC        = 0;
        SPEN        = 1;  
        SPBRG       = 25;  //9600bps
        BRGH        = 1;
        BRG16       = 0;
        ADCON0=0x09;
        ADCON1=0x90;
        delay(10);
}
void interrupt isr(void)
{
        if(RCIE&&RCIF==1)   
        {
                receive=RCREG;
                TXREG=a1+0x30;while(!TRMT);
                TXREG=0x2e;while(!TRMT);
                TXREG=a2+0x30;while(!TRMT);
                TXREG=a3+0x30;while(!TRMT);
                TXREG=a4+0x30;while(!TRMT);
                TXREG=0x5f;while(!TRMT);
        }       
}
沙发
兰天白云| | 2013-3-7 16:47 | 只看该作者
代码没有注释,让人看着累呀
ICD3不要热插拔,其他的烧写器也如此
如果AD值是相同的,看起来就象没更新,但我觉得还是代码有问题,还是再查一遍吧

使用特权

评论回复
板凳
yklstudent| | 2013-3-7 18:21 | 只看该作者
串口中断时这样写的吗????

使用特权

评论回复
地板
bingbingrere|  楼主 | 2013-3-8 08:36 | 只看该作者
yklstudent 发表于 2013-3-7 18:21
串口中断时这样写的吗????

应该是吧,我以前一直这样用的啊。。。

使用特权

评论回复
5
bingbingrere|  楼主 | 2013-3-8 08:38 | 只看该作者
兰天白云 发表于 2013-3-7 16:47
代码没有注释,让人看着累呀
ICD3不要热插拔,其他的烧写器也如此
如果AD值是相同的,看起来就象没更新,但 ...

应该是程序的问题吧,硬件很简单的。然后ICD仿真用watch窗口查看采得的值是有变化的。不知道为什么程序下进去就不能实时更新了。

使用特权

评论回复
6
兰天白云| | 2013-3-8 15:32 | 只看该作者
用ICD可以而烧录后不可以一般是配置问题

使用特权

评论回复
7
leofoolish| | 2013-4-18 18:24 | 只看该作者
RCIF不需要清0么?

使用特权

评论回复
8
whatinever| | 2013-4-27 08:24 | 只看该作者
配置位的问题

使用特权

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

本版积分规则

3

主题

20

帖子

0

粉丝