PIC官方汇编例程错了么?

[复制链接]
1526|10
 楼主| hzocce 发表于 2016-8-28 20:10 | 显示全部楼层 |阅读模式
    ;Sample code operates out of BANK0
                       MOVLW 0xF1;configure A/D
                      MOVWF ADCON0
                      BSF ADCON0, 1;start conversion
loop0              BTFSC ADCON0, 1;wait for ‘DONE’
                      GOTO loop0
                     MOVF ADRES, W;read result
                     MOVWF result0;save result
                      BSF ADCON0, 2;setup for read of;channel 1
                      BSF ADCON0, 1;start conversion
loop1             BTFSC ADCON0, 1;wait for ‘DONE’
                     GOTO loop1
                     MOVF ADRES, W ;read result
                     MOVWF result1;save result
                     BSF ADCON0, 3;setup for read of
                     BCF ADCON0, 2;channel 2
                     BSF ADCON0, 1;start conversion
loop2            BTFSC ADCON0, 1;wait for ‘DONE’
                     GOTO loop2
MOVF ADRES, W;read result
MOVWF result2;save result


个人各位第一行,第二行,是多余的,说白了,就是将ADCON0的最低位赋1;第三行一步都完成了,干嘛要写前面2步?
左边的LOOP1 2 也是多余的么?
谁帮忙解释一下?谢谢!
汇编表示看不懂,能转个C版本的就好了!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| hzocce 发表于 2016-8-28 20:21 | 显示全部楼层
谁帮忙敲一个C的呗
xyz549040622 发表于 2016-8-29 07:37 | 显示全部楼层
相应的c代码,也是可以在网络找到的吧。
XIEYUANBIN 发表于 2016-8-30 12:14 | 显示全部楼层
adcon0 = 0xF1;
adcon0bits.GO = 1;
while (adcon0bits.DONE);
....
第一第二行汇编相当于C第一句
JY-DX-JY 发表于 2016-9-6 19:52 | 显示全部楼层
前两句高四位也置一吧
zhoujunfeng 发表于 2016-9-6 23:15 来自手机 | 显示全部楼层
看一下ADcon0的定义
LexLu 发表于 2016-9-8 16:16 | 显示全部楼层
注释写得蛮清楚的,第一第二句就是配置A/D模块,不过顺带也把A/D模块启动了。个人猜想可能第三句是表明一个启动的动作。通常是先对ADCON做配置,然后再单独启动A/D模块。
北极风 发表于 2016-9-11 10:07 | 显示全部楼层
启动AD前要进行采样延时,等待等待所需的采集时间。
datouyuan 发表于 2016-9-20 20:04 | 显示全部楼层
本帖最后由 datouyuan 于 2016-9-20 20:08 编辑

ADCON0=0xf1;
ADCON0|=0x02;
while(ADCON0&0x02);
result0=ADRES;

ADCON0|=0x04;
ADCON0|=0x02;
while(ADCON0&0x02);
result1=ADRES;

ADCON0|=0x08;
ADCON0&=0x04;
ADCON0|=0x02;
while(ADCON0&0x02);
result2=ADRES;

我按照改成了c,从代码可以看出:
ADCON0的bit3 bit2 决定了AD的通道. 00为通道0,01为通道1,10为通道2,假如有通道3的话应该是11.
ADCON0的bit1 写1就启动ad转换,读为1表示处于ad转换中,读为0表示ad转换完成.
datouyuan 发表于 2016-9-20 20:18 | 显示全部楼层
本帖最后由 datouyuan 于 2016-9-20 20:29 编辑
  1. uint8 getAD(uint8 ch)
  2. {
  3.         ADCON0=0xf1+(ch<<2);
  4.         ADCON0|=0x02;
  5.         while(ADCON0&0x02);
  6.         return ADRES;
  7. }
  8. //使用示范
  9. //result0=getAD(0);//AD通道0
  10. //result1=getAD(1);//AD通道1
  11. //result2=getAD(2);//AD通道2



正常的C代码应该是这样的.这个肯定没汇编效率高,但作用和汇编是一样的.
datouyuan 发表于 2016-9-20 20:35 | 显示全部楼层
本帖最后由 datouyuan 于 2016-9-20 20:38 编辑

BSF ADCON0, 1;start conversion

楼主的错误是认为该句置1的是bit0,实际该句置1的是bit1.
所以该句和第1 2行的语句作用是完全不一样的.假如要和前2行合并,应该是ADCON0=0xf3
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

617

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部