完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我使用的是PIC16F1937的ADC。我设置adfm=1(转换的m***是adresh的第1位,而adresl的l***是0位)当结果就绪时,adresh的最大值不应该是3吗?我得到B7。谢谢。
|
|
相关推荐
12个回答
|
|
|
我应该说我在调试器菜单中使用了icd3In,我为ADCON1寄存器设置了一个新表,但是当我一步一步地通过代码时,监视窗口没有显示值。
|
|
|
|
|
|
我认为有些代码列表可能会有帮助,特别是A/D设置和读取部分。
|
|
|
|
|
|
0=Left Justify 1=Right Justify所以adfm=1是正确的justfiy,因此adresh不能大于0x03。
|
|
|
|
|
|
这让我抓狂~我试图附加源代码,但有些单词触发“拒绝访问”,如果格式不正确,抱歉这里是adc配置:/*********************配置ADC*******************/ADCON1bits.ADFM=1;//正确的结果ADCON1bits.ADCON1bits.ADNREF=0;/-电压引用nce Vss ADCON1bits.ADPREF=0;//+电压参考Vdd ADCON1bits.ADCS=0b100;//将转换时钟设置为Fosc/4=1MHzPIE1bits.ADIE=0;//禁用adc中断ADCON0bits.ADON=1;//打开adchere是读函数://这个函数返回包含x&y位置的数据包//操纵杆或变速操纵杆jc2000_joy._position get_jc2000_joy._.(UINT8 js_number){UINT8.=0,pass=0;UINT16 x_adc_result,y_adc_result;//操纵杆位置过滤器变量UINT8 filter_cnt=64;UINT8 i,copy_filter_cnt,._amt;UINT16 x_sum, y_sum, x_avg, y_avg; jc2000_joy._.jc2000_js_pos; x_avg=0; y_avg=0; x_sum=0; y_sum=0; copy_filter_cnt=filter_cnt; ._amt=0; ._amt=0; //移动x_sum以获得(copy_filter_cnt;copy_filter_cnt>=2; copy_filter_cnt/=2){._am对(i=0;i&lt;FieldJ.CNT;I++){同时()!完成){//操纵杆选择开关(js_number){//读取方向操纵杆情况0: //频道选择开关(通过){//选择x方向频道情况0: ADCON0bits.CHS=X_DIR_CHAN; //设置adc频道break;//选择y方向信道情况1: ADCON0bits.CHS=Y_DIR_CHAN; //set adc信道break; //set adc信道; default: break; }//信道选择开关_u._us(5); ADCON0bits.GO_nDONE=1; //开始转换hile(ADCON0bits.GO_nDONE);//等待结果x_adc_result=0;/y_adc_result=0;//adc转换开关(pass){x_adc_result=ADRESH<9;/x_adc_result+=ADRESL;break;[1]//读取y方向adc_case 1: y_adc_result=ADRESH<<9; y_adc_result+=ADRESL; break;缺省值: break; }//adc转换开关x_sum+=x_adc_result; y_sum+=y_adc_result; pass+;。如果(pass==2).=1;break;//read shifting操纵杆情况1: ADCON0bits.CHS=FWD_REV_X_CHAN; //set adc..u._us(5); ADCON0bits.GO_nDONE=1; //开始转换,而(ADCON0bits.GO_nDONE); //等待结果y_adc_result=ADRESH<<8;y_adc_result+=ADRESL;y_sum+=y_adc_result;.=1;break;default: break; }//操纵杆选择开关}//.(!.=0;pass=0;}//for.(adc过滤器)x_avg=x_sum>>._amt;y_avg=y_sum>>._amt;jc2000_js_pos.x_.=x_avg;jc2000_js_pos.y_.=y_avg;返回jc2000_js_js_pos;}//get_x y_.
|
|
|
|
|
|
哦-PIC16*的银行可能无法在监视窗口中显示它,但是应该可以访问。如果不是通过监视,那么最终通过0x20BE的线性重新映射的地址(如果我计算正确,最好检查数据表)。
|
|
|
|
|
|
x_adc_result=ADRESH<<9;No 8 x_adc_result+=ADRESL;x_avg=x_sum>>._amt;除以64将生成白化病相同的代码。
|
|
|
|
|
|
这能更好吗?XY-ADClRESULTS=ADRESH;XY-ADClRESULL =(XY-ADClRESULT和LT;8)+ ADRESL;为什么要移动9?如果你在ADC完成后把断点放好,你读AdRESH和ADRESL的值是多少?
|
|
|
|
|
|
x_adc_result=(x_adc_result<<8)|ADRESL;应该更正确。优化器如何将两个字节移动到一个单词中,对于这三个单词中的任何一个,都是猜测。(我的建议是行之有效的。)
|
|
|
|
|
|
老实说:最好的办法是使XyAdCl结果为UIT1616T和2 UIT88T’的结合。这样,你可以移动字节而不移动,然后使用得到的单词。我承认:这也是你对CPU、编译器等最了解的解决方案。
|
|
|
|
|
|
编译器将以字节移动的方式处理移位8。它也会把一个除以2,4,8,ECT作为一个移位。即使在自由模式下它也有一些智能。
|
|
|
|
|
|
嘿,让我猜猜:1。ADRESH被读取到低字节地址2。而不是移位8位,低位字节转移到高字节地址????直接将ADRESH读到highByte地址isa)高效和b)可移植(如果移植了联合部件)。
|
|
|
|
|
|
我可以说所有编译器都会这么做。虽然同意你的怀疑,如果你要广泛使用编译器,你应该了解它的局限性。不是像你这样的代码比编译器更聪明。例子XC8知道除以2最好做为& gt;& gt;2。但是我看到很多代码带有移位,没有注释,意图是分割。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475 浏览 0 评论
5795 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1126浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1098浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 13:27 , Processed in 1.644144 second(s), Total 94, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1802