极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24597|回复: 10

如何学习arduino的“硬件和软件接口”的知识?

[复制链接]
发表于 2012-2-23 00:18:10 | 显示全部楼层 |阅读模式
最近在学习arduino 1.0的代码,关注了一下arduino reference里的几个function的实现。
能看懂大概的意思,想继续深入研究,但是对arduino硬件和软件接口的知识不了解。

比如analogRead函数的实现,首先是给ADMUX赋值。对328p来说,ADMUX实际上就是0x7c。
为什么要给0x7c赋值呢,为什么要赋值为(1 << 6) | (pin & 0x07)呢?

这部分知识属于“硬件和软件接口”的知识,如果能知道这部分知识,不需要参考别人的代码,
完全可以自己写一个analogRead函数出来。

请问怎么样获取这些知识呢?
希望大侠们解惑,谢谢。

int analogRead(uint8_t pin)
{
uint8_t low, high;

        // set the analog reference (high two bits of ADMUX) and select the
        // channel (low 4 bits).  this also sets ADLAR (left-adjust result)
        // to 0 (the default).
//        ADMUX        =        (analog_reference << 6) | (pin & 0x07);
        ADMUX        =        (1 << 6) | (pin & 0x07);

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
        // the MUX5 bit of ADCSRB selects whether we're reading from channels
        // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
        ADCSRB        =        (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#endif

        // without a delay, we seem to read from the wrong channel
        //delay(1);

        // start the conversion
        sbi(ADCSRA, ADSC);

        // ADSC is cleared when the conversion finishes
        while (bit_is_set(ADCSRA, ADSC));

        // we have to read ADCL first; doing so locks both ADCL
        // and ADCH until ADCH is read.  reading ADCL second would
        // cause the results of each conversion to be discarded,
        // as ADCL and ADCH would be locked when it completed.
        low                =        ADCL;
        high        =        ADCH;

        // combine the two bytes
        return (high << 8) | low;
}
回复

使用道具 举报

 楼主| 发表于 2012-2-23 23:01:54 | 显示全部楼层
没有人指点一下迷津?
回复 支持 反对

使用道具 举报

发表于 2012-2-23 23:09:35 | 显示全部楼层
看看51的书吧,更接近底层一些
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-23 23:12:51 | 显示全部楼层
bzzdzc 发表于 2012-2-23 23:09
看看51的书吧,更接近底层一些

谢谢。
现在我是想知道arduino的“接口”知识,从而更好的了解arduino。
回复 支持 反对

使用道具 举报

发表于 2012-2-23 23:33:32 | 显示全部楼层
你要是有单片机基础,那就直接上AVR C,找本书看看AVR单片机寄存器 中断啥的,arduino就是一个AVR单片机的开发板。

如果没有,那还是先熟悉arduino的功能,熟悉之后再深究
回复 支持 反对

使用道具 举报

发表于 2012-2-23 23:40:42 | 显示全部楼层
同意楼上的建议 ,先了解arduino它的功能作用,才能更好的帮组了解更深层的东西。先打好基础吧!
www.arduino.cc/en/  上面都有介绍,可以慢慢看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-23 23:53:18 | 显示全部楼层
我觉得要一般了解arduino的功能作用,一个blink实验差不多就能知道是怎么回事了。
但是要深入理解arduino的话,得分析它的提供的编程接口,学习arduino reference里functions的实现。
更深一步,就是前面几位提到的avr c, avr单片机的体系结构了。
回复 支持 反对

使用道具 举报

发表于 2012-2-24 01:17:57 | 显示全部楼层
arduino是封装了AVR的功能,ATMETA的芯片太多,所以想通用的话最好去研究AVR,这样通过芯片的白皮书你可以知道IO口的作用。而arduino对其所支持的几个芯片做了封装了,所以当你使用Pin1,Pin2时,它已经帮你定义好了芯片的物理接口,而arduino又提供了好多接口和类,你直接调用就行了,而不用管底层的东西。好久没碰arduino了,我的理解是这样
回复 支持 反对

使用道具 举报

发表于 2012-2-24 13:04:53 | 显示全部楼层
你可以看atmega芯片的datasheet,从官网可以下到,上面有各个接口的含义,如果想深入系统学习单片机,建议从51开始,arduino只适合快速搭建平台,不能让你接触过多底层
回复 支持 反对

使用道具 举报

发表于 2012-2-26 00:54:09 | 显示全部楼层
ADMUX其实是芯片的ADC寄存器
想要更深入的了解arduino,那就学avr吧
学单片机不一定要从51开始,avr其实是个不错的选择
等你把avr的各种常用寄存器,中断,定时器什么的搞懂你对arduino就会有更深的理解了
回复 支持 反对

使用道具 举报

发表于 2012-3-5 09:48:07 | 显示全部楼层
从基础做起那是必须的,我也是从51过来的。学东西不能太急!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 10:33 , Processed in 0.040619 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表