佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1540|回复: 9

adc 读不到资料。

[复制链接]
发表于 18-10-2007 10:40 PM | 显示全部楼层 |阅读模式
各位大大!我之前是使用汇编语言编程的,对于这颗晶也有一定程度的认识。曾经用过内置的 A/D converter,也相当顺利。

可是最近使用了 HI-TECH 的 PICC 编译器,在 ADC 方面出现了一个问题。我读不到 AN0 与 AN1的输入的 analog 电压。
我用 ICD-2 debugger,当我改变 analog 的输入电压时,ADRESH 与 ADRESL 的值完全没改变。
我认为问题是发生在我的 register configuration 处。我的configuration 如下:请看有什么问题吗?

void hardware_initialize(void)
{
    /* Bank 0 */
    STATUS  = 0x00;
    CMCON0  = 0x07;
    PORTA   = 0x00;
    PORTC   = 0x00;
    INTCON  = 0x00; /* Interrupt Control Bit*/
    PIR1    = 0x00; /* Interrupt Flag */
    PCON    = 0x03;
    ADCON0  = 0x00; /* A/D Result Format Left justified */
    ADCON1  = 0x40; /* Fosc/4 */
   
    /* Bank 1 */
    OSCCON  = 0x01; /* Internal oscillator is used for system clock */
    IRCF0   = 0;    /*                     (bit 4)*/
    IRCF1   = 1;    /* System clock 250kHz (bit-5)*/
    IRCF2   = 0;    /*                     (bit-6)*/
    PIE1    = 0x00; /* Interrupt Enable Bit */
    OPTION  = 0x80; /* Disable PORTA Pull-up */
    WPUA    = 0x00; /* Pull-up disable */
    TRISA   = 0x3F;
    TRISC   = 0x10;
    ANSEL   = 0x03; /* Analog input Select ANS1:ANS0 */
}




[ 本帖最后由 rothmans 于 18-10-2007 10:42 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 19-10-2007 09:45 AM | 显示全部楼层

回复 #1 rothmans 的帖子

你还是用回你熟悉的ASM吧。

你用Hitech-C, 还要control register。。。
你应该用它build in的ADC function, 这是用C的目的。
回复

使用道具 举报

 楼主| 发表于 19-10-2007 09:55 AM | 显示全部楼层
原帖由 pic 于 19-10-2007 09:45 AM 发表
你还是用回你熟悉的ASM吧。

你用Hitech-C, 还要control register。。。
你应该用它build in的ADC function, 这是用C的目的。


哦!版主,也许你误会了我的意思吧。我是说设置我的 SPECIAL FUNCTION REGISTERS. 就比如说我要 PORT-A 成为输入的话,必须设置 TRISA = 0xFF 类似的意思。Hitech-C 有build in的ADC function吗?不好意思,第一次用,不太了解。 我想让 ASM 成为我的历史了。

[ 本帖最后由 rothmans 于 19-10-2007 09:58 AM 编辑 ]
回复

使用道具 举报

发表于 19-10-2007 10:37 AM | 显示全部楼层
原帖由 rothmans 于 19-10-2007 09:55 AM 发表
哦!版主,也许你误会了我的意思吧。我是说设置我的 SPECIAL FUNCTION REGISTERS. 就比如说我要 PORT-A 成为输入的话,必须设置 TRISA = 0xFF 类似的意思。Hitech-C 有build in的ADC function吗?不好意思, ...

HiTech-C 我没有用过, 如你用CCS C 我可以告诉你。

就比如说我要 PORT-B 成为输入的话
set_tris_B(0b11111111);


更简单的是不用管TRIS的Setting, 直接用
int x;
x=input_B();  // port B 变input
PortB 的value就去x var了。

output_B(0xFF);// port B 又变output, 输出8个1.

注: 我很少用Input. / Output build in function)

当然,control I/O 还有其他方法。。。。

除非要Full control, 不然很少control SFR。
回复

使用道具 举报

 楼主| 发表于 19-10-2007 12:20 PM | 显示全部楼层
原帖由 pic 于 19-10-2007 10:37 AM 发表

HiTech-C 我没有用过, 如你用CCS C 我可以告诉你。

就比如说我要 PORT-B 成为输入的话
set_tris_B(0b11111111);


更简单的是不用管TRIS的Setting, 直接用
int x;
x=input_B();  // port B 变inp ...



多谢版主的指导,虽然没有得到答案,我还是会尽力的摸索,希望能与大家分享。我暂时是不会更换编译器的了。

[ 本帖最后由 rothmans 于 19-10-2007 12:22 PM 编辑 ]
回复

使用道具 举报

发表于 19-10-2007 02:12 PM | 显示全部楼层
原帖由 rothmans 于 19-10-2007 12:20 PM 发表



多谢版主的指导,虽然没有得到答案,我还是会尽力的摸索,希望能与大家分享。我暂时是不会更换编译器的了。


你用什么ic?
如果是16f877a。
大概是adcon0 的bit 0, ADON没有set.
ADCON0 = 0x01;

[ 本帖最后由 fritlizt 于 19-10-2007 02:16 PM 编辑 ]
回复

使用道具 举报

Follow Us
 楼主| 发表于 19-10-2007 02:47 PM | 显示全部楼层
原帖由 fritlizt 于 19-10-2007 02:12 PM 发表


你用什么ic?
如果是16f877a。
大概是adcon0 的bit 0, ADON没有set.
ADCON0 = 0x01;


非常抱歉,因为某些修改把使用的 PIC16F684 给删除了。

我已经将 ADON 设置成 "1"了,输入电压是 4.5V。测量结果请看图:

http://aycu25.webshots.com/image/29504/2003042316372309892_rs.jpg

[ 本帖最后由 rothmans 于 19-10-2007 03:19 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 19-10-2007 04:25 PM | 显示全部楼层
原帖由 rothmans 于 19-10-2007 02:47 PM 发表


非常抱歉,因为某些修改把使用的 PIC16F684 给删除了。

我已经将 ADON 设置成 "1"了,输入电压是 4.5V。测量结果请看图:

http://aycu25.webshots.com/image/29504/2003042316372309892_rs.jpg


各位大大,我发现到我的问题了,那就是在我的读取程序中,在 while 之前没加上 “GODONE = 1;”这条语句。而不单单只是需要置能 "ADON=1;". 万岁!万岁!
回复

使用道具 举报


ADVERTISEMENT

发表于 19-10-2007 04:36 PM | 显示全部楼层
原帖由 rothmans 于 19-10-2007 04:25 PM 发表


各位大大,我发现到我的问题了,那就是在我的读取程序中,在 while 之前没加上 “GODONE = 1;”这条语句。而不单单只是需要置能 "ADON=1;". 万岁!万岁!


我也是发现道。刚刚要回复你。
ADCON0 = 0x01; 过后就不需要ADON = 1;一样的东西来的。
你的function char adc_port是哪来做什么的?
在FUNCTION里面没有用到。
回复

使用道具 举报

 楼主| 发表于 19-10-2007 05:41 PM | 显示全部楼层
原帖由 fritlizt 于 19-10-2007 04:36 PM 发表


我也是发现道。刚刚要回复你。
ADCON0 = 0x01; 过后就不需要ADON = 1;一样的东西来的。
你的function char adc_port是哪来做什么的?
在FUNCTION里面没有用到。


哦! ,被你发现到了,其实char ADC_port是我用来传入一个参数的,就是说我测量 adc 的输入脚是可以有选择性的,并不是固定的一个脚而已。因为当调试时,我把它 disable 了 。这段(“ADCON0 = 0x01; 过后就不需要ADON = 1;”都是调试时加入的。。因此最重要的是加入“GODONE = 1或(ADCON0 bit 1 = 1)如之前提到的。

[ 本帖最后由 rothmans 于 19-10-2007 05:43 PM 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 24-12-2024 10:27 AM , Processed in 0.208625 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表