求助: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口
}
对于采用内部电源作参考电压,这内部电源电压是多少的啊,手册上没有找到。
ADCCL=0B0010101; 是不是少了个0 ?是否为 ADCCL=0X2C; 那么ADEN=1;也没开吧?
就算前面都没错 PCT3 = ADCRL & (1<<3); 这句 你确定你程序能走到这吗?丢while(1)里去吧!
内部参考电压就是VDD 手册这章概述里就写了 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; liujian6f 发表于 2013-9-11 09:57 static/image/common/back.gif
ADCCL=0B0010101; 是不是少了个0 ?是否为 ADCCL=0X2C; 那么ADEN=1;也没开吧?
就算前面都没错 PCT ...
谢谢大侠指点,确实少了1位。
应该是: ADCCL=0B00100101; 海尔_小海 发表于 2013-9-11 10:26 static/image/common/back.gif
ANSEL = 0B00000100;//选择AIN2通道(PA2口)为模拟IO
端口设置为0为模拟IO(用于ADC通道功能),设置成1 ...
哦,搞反了,谢谢海版的指正。 经过楼上两位大神的指正,我重新改正后编译下载调试,结果还是一样,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口
}
}
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;
}
}
} 参考一下上面的例程。 海版啊,我就是参考你贴出来的例程改写的,但不知是何原因,就是达不到想要的效果。 本帖最后由 zndz410 于 2013-9-13 17:06 编辑
海尔_小海 发表于 2013-9-13 14:59 static/image/common/back.gif
void ADC_10BITS_PRO(void)
{
PBT5=1; //该IO口设为输入
我也是参照这个来修改的,但达不到效果。
海版帮我看看这改的程序哪里出错了。
参考下{:smile:} 结果如何?
页:
[1]