zndz410 发表于 2013-9-10 22:19:16

求助:HR7P90H的ADC程序

本帖最后由 zndz410 于 2013-9-10 22:24 编辑

最近在对HR7P90H的ADC模块进行学习,改写了ADC的C程序,但没有达到效果,特向大神们求助,哪里出问题。

功能是: 4脚 AIN2(PA2)作输入,接电位器, 14脚PC3外接一LED作AD转换结果的显示。结果是LED一直亮,调整电位器对LED没有影响,不会亮灭变化。


程序如下:


#include <HIC.h>
#include <HR7P90H.h>

#define unchar   unsigned char

section1    unchar   ADC_RESULT_L;
section1    unchar   ADC_RESULT_H;


void main()
{
PCT3= 0;            //PC口输出,用以AD转换结果显示
PAT2 = 1;             //PA2输入,用以AD输入
   
   ANSEL = 0B00000100;//选择AIN2通道(PA2口)为模拟IO
   
   ADCCH=0B00000010;//ADCCH控制寄存器设置: (BIT7-BIT4)设置AIN11-AIN8通道数模IO切换。
                                           //(BIT3-BIT2)----。
                                           //(BIT1) ADFM=(0 左对齐, 1 右对齐)。
                                           //(BIT0) ADVREF=(1 外部参考, 0 内部VDD作为参考电压) 。
   ADCCL=0B0010101;//ADCCL控制寄存器设置: (BIT7-BIT4)设置ADCHSx ADC模块输入通道选择。
                                          //(BIT3-BIT2)设置ADCSx ADC时钟选择位: 00--FOSC, 01--FOSC/4, 10--FOSC/16, 11--内部NC时钟(250K HZ)。
                                          //(BIT1) 设置ADTRG转换状态位:0--AD未进行转换或已经转换完成, 1--AD正在进行转换,该位置1启动ADC转换。
                                          //(BIT0) 设置ADEN模块使能位:0--OFF,1--ON。

          // ADCRL寄存器保存低8位ADC转换值,ADCRH寄存器保存高8位ADC转换值。

_asm
        {
          NOP;
          NOP;
        }

ADTRG=1;         //使能AIN2通道开始ADC转换

while(1)
        {
           if(ADTRG==0)
          {                 
              //AD转换结果从ADCRH,ADCRL获取
                        ADC_RESULT_L=ADCRL;
                        ADC_RESULT_H=ADCRH;
                        ADTRG=1;
          }
        }
   
   PCT3 = ADCRL & (1<<3);       //将结果的高八位送与PC口
   
}



对于采用内部电源作参考电压,这内部电源电压是多少的啊,手册上没有找到。



liujian6f 发表于 2013-9-11 09:57:47

ADCCL=0B0010101; 是不是少了个0 ?是否为 ADCCL=0X2C; 那么ADEN=1;也没开吧?   

就算前面都没错   PCT3 = ADCRL & (1<<3);   这句   你确定你程序能走到这吗?丢while(1)里去吧!

内部参考电压就是VDD 手册这章概述里就写了

海尔_小海 发表于 2013-9-11 10:26:14

liujian6f 发表于 2013-9-11 09:57 static/image/common/back.gif
ADCCL=0B0010101; 是不是少了个0 ?是否为 ADCCL=0X2C; 那么ADEN=1;也没开吧?   

就算前面都没错   PCT ...

ANSEL = 0B00000100;//选择AIN2通道(PA2口)为模拟IO

端口设置为0为模拟IO(用于ADC通道功能),设置成1为数字IO。
ANSEL = 0B11111011;

zndz410 发表于 2013-9-11 11:40:32

liujian6f 发表于 2013-9-11 09:57 static/image/common/back.gif
ADCCL=0B0010101; 是不是少了个0 ?是否为 ADCCL=0X2C; 那么ADEN=1;也没开吧?   

就算前面都没错   PCT ...

谢谢大侠指点,确实少了1位。

应该是: ADCCL=0B00100101;

zndz410 发表于 2013-9-11 11:42:21

海尔_小海 发表于 2013-9-11 10:26 static/image/common/back.gif
ANSEL = 0B00000100;//选择AIN2通道(PA2口)为模拟IO

端口设置为0为模拟IO(用于ADC通道功能),设置成1 ...

哦,搞反了,谢谢海版的指正。

zndz410 发表于 2013-9-12 15:55:08

经过楼上两位大神的指正,我重新改正后编译下载调试,结果还是一样,LED长亮,不会随电位器的调整而亮灭。

还请大神们帮我再看看程序哪里出问题了。{:cry:}

#include <HIC.h>
#include <HR7P90H.h>

#define unchar   unsigned char

section1    unchar   ADC_RESULT_L;
section1    unchar   ADC_RESULT_H;


void main()
{
   PCT3= 0;            //PC口输出,用以AD转换结果显示
PAT2 = 1;             //PA2输入,用以AD输入
   
   ANSEL = 0B11111011;//选择AIN2通道(PA2口)为模拟IO
   
   ADCCH=0B00000010;//ADCCH控制寄存器设置: (BIT7-BIT4)设置AIN11-AIN8通道数模IO切换。
                                           //(BIT3-BIT2)----。
                                           //(BIT1) ADFM=(0 左对齐, 1 右对齐)。
                                           //(BIT0) ADVREF=(1 外部参考, 0 内部VDD作为参考电压) 。
   ADCCL=0B00100101;//ADCCL控制寄存器设置: (BIT7-BIT4)设置ADCHSx ADC模块输入通道选择。
                                          //(BIT3-BIT2)设置ADCSx ADC时钟选择位: 00--FOSC, 01--FOSC/4, 10--FOSC/16, 11--内部NC时钟(250K HZ)。
                                          //(BIT1) 设置ADTRG转换状态位:0--AD未进行转换或已经转换完成, 1--AD正在进行转换,该位置1启动ADC转换。
                                          //(BIT0) 设置ADEN模块使能位:0--OFF,1--ON。

   _asm
      {
          NOP;
          NOP;
      }

ADTRG=1;         //使能AIN2通道开始ADC转换

while(1)
      {
         if(ADTRG==0)
            {                  
            //AD转换结果从ADCRH,ADCRL获取
                ADC_RESULT_L=ADCRL;
                        ADC_RESULT_H=ADCRH;
                        ADTRG=1;
            }

      PCT3 = ADC_RESULT_L & (1<<3);       //将结果的低八位中的第3位送与PC3口

      }
      
}



海尔_小海 发表于 2013-9-13 14:59:59

zndz410 发表于 2013-9-12 15:55 static/image/common/back.gif
经过楼上两位大神的指正,我重新改正后编译下载调试,结果还是一样,LED长亮,不会随电位器的调整而亮灭。
...

void ADC_10BITS_PRO(void)
{
        PBT5=1;         //该IO口设为输入
        ANSEL&=0B01111111;//选择AIN7通道(PB5口)做为模拟IO
//ADCCH控制寄存器设置(BIT7-BIT4)设置AIN11-AIN8通道数模IO切换 BIT3-BIT2(--) BIT1-ADFM=0左对齐 ADFM=1右对齐 BIT0-ADVREF(1-外部参考 0-内部VDD做为参考)
        ADCCH=0B00000010; //右对齐 内部VDD做为参考
//ADCCL控制寄存器设置ADCHSx-> BIT7-BIT4 ADC模块输入通道选择ADCSx->BIT3-BIT2 ADC时钟选择位 00-FOSC 01-FOSC/4 10-FOSC/16 11-内部RC时钟(250k HZ)
//                   ADTRG->BIT1转换状态位 0-AD未进行转换或已经转换完成 1-AD正在进行转换,该位置1启动ADC转换。ADEN->BIT0 ADC模块使能位 0-OFF 1-ON
ADCCL=0B01110101;// 通道选择AIN7 转换时钟为FOSC/4(内部振荡8M,TAD时间为2uS) 不启动ADC转换ADC模块使能位打开
//ADCRL寄存器保存低8位ADC转换值ADCRH寄存器保存高8位ADC转换值
__asm      
                        {         
                                NOP;      
                          NOP;
                        }   
        ADTRG=1;   //使能AIN7通道开始ADC转换
        while(1)
        {
                if(ADTRG==0)
                        {
                                ADC_RESULT_L=ADCRL;
                                ADC_RESULT_H=ADCRH;
                        }
        }

}

海尔_小海 发表于 2013-9-13 15:00:38

参考一下上面的例程。

zndz410 发表于 2013-9-13 17:02:37

海版啊,我就是参考你贴出来的例程改写的,但不知是何原因,就是达不到想要的效果。

zndz410 发表于 2013-9-13 17:03:43

本帖最后由 zndz410 于 2013-9-13 17:06 编辑

海尔_小海 发表于 2013-9-13 14:59 static/image/common/back.gif
void ADC_10BITS_PRO(void)
{
        PBT5=1;         //该IO口设为输入



我也是参照这个来修改的,但达不到效果。


海版帮我看看这改的程序哪里出错了。


qq11qqviki 发表于 2013-10-14 09:12:38

参考下{:smile:}

cooleaf 发表于 2014-1-9 20:00:47

结果如何?
页: [1]
查看完整版本: 求助:HR7P90H的ADC程序