打印

PIC官方汇编例程错了么?

[复制链接]
1154|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版本的就好了!


1111.png (89.13 KB )

1111.png
沙发
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第一句

使用特权

评论回复
5
JY-DX-JY| | 2016-9-6 19:52 | 只看该作者
前两句高四位也置一吧

使用特权

评论回复
6
zhoujunfeng| | 2016-9-6 23:15 | 只看该作者
看一下ADcon0的定义

使用特权

评论回复
7
LexLu| | 2016-9-8 16:16 | 只看该作者
注释写得蛮清楚的,第一第二句就是配置A/D模块,不过顺带也把A/D模块启动了。个人猜想可能第三句是表明一个启动的动作。通常是先对ADCON做配置,然后再单独启动A/D模块。

使用特权

评论回复
8
北极风| | 2016-9-11 10:07 | 只看该作者
启动AD前要进行采样延时,等待等待所需的采集时间。

使用特权

评论回复
9
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转换完成.

使用特权

评论回复
10
datouyuan| | 2016-9-20 20:18 | 只看该作者
本帖最后由 datouyuan 于 2016-9-20 20:29 编辑
uint8 getAD(uint8 ch)
{
        ADCON0=0xf1+(ch<<2);
        ADCON0|=0x02;
        while(ADCON0&0x02);
        return ADRES;
}
//使用示范
//result0=getAD(0);//AD通道0
//result1=getAD(1);//AD通道1
//result2=getAD(2);//AD通道2



正常的C代码应该是这样的.这个肯定没汇编效率高,但作用和汇编是一样的.

使用特权

评论回复
11
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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

561

帖子

4

粉丝