Arduino可以看成是一个基于ATmega8的单片机系统,在目前硬件已经基本就绪的情况下,如何将编写好的程序烧写到单片机中是完成硬件功能验证的关键一步。单片机程序的烧写一般通过专用的硬件编程器来完成,当大部分单片机现在开始支持另外一种在线烧写方式:ISP,即通过相应的下载电缆就能够完成程序的烧写。
ISP下载可以通过串口、并口、USB等方式实现,下载电路可以很简单也可以很复杂。Arduino提供了一个非常简单的并口下载线制作过程,其相应的原理图如下所示:

由于只用到了几个电阻和一个DB25接口,该下载线的制作过程并不复制,完全可以按照相应的步骤手工完成。我怀疑这样的下载电路可能不太稳定,并且有可能对芯片有一定的影响,所有等有空的时候还是希望能够参考一些其他AVR下载线的电路。Arduino提供的这一下载线一共有5条连线,制作的时候我用的是普通的8芯网线,另一端则用的是市场中淘到的6芯接头:

下载线制作完成之后,将其连接到Arduino上的ICSP座上。注意不要接反,下载线上6芯接头上缺少一根连线的那端是1,应该与Arduino板上ICSP座上标为1的那端相对应。

接下去就需要安装相应的软件了。由于是在Windows下实验,而Arduino采用的又是AVR-GCC这一编译环境,因此安装Cygwin就是一项必不可少的准备工作,注意在选择相应的软件包时,需要从Devel分类中将make选中:

下一步就是安装Arduino集成开发环境(IDE)了,我下载的是Arduino 0009 Windows版本。Arduino集成开发环境基于的是Eclipse平台,因此只需要将其简单地解压缩到相应的目录,然后再运行其中的arduino.exe就可以了。注意在执行arduino.exe之前,最好将Arduino安装目录下的cygwin1.dll和cygiconv-2.dll这两个动态加载库用你机器上Cygwin安装目录下的bin目录中的相应文件覆盖,以避免版本不兼容的问题。

在Arduino安装目录下可以找到bootloader和bootloader168这两个目录,分别对应的是ATmega8和ATmega16所使用的bootloader。Arduino的bootloader其实也是一段运行在单片机中的小程序,它的任务主要是负责与Arduino集成开发环境进行通信,完成Arduino程序(sketches)的下载,如果bootloader在Arduino上电后的给定时间内没有收到集成开发环境发来的任何指令,则会自动执行已经下载到单片机中的Arduino程序。
按照Arduino提供的文档,我们可以在集成开发环境中完成bootloader的烧写。首先从Tools->Microcontroller (MCU)菜单中选择相应的微处理器类型,在我制作的Arduino模块上采用的是ATmega8:

检查下载线连接正确之后,给Arduino接通12V的直流电源,再选择Tools->Burn Bootloader (parallel port)命令,就可以将bootloader通过并口上的下载线下载到ATmega8单片机中。但我似乎没有那么幸运,执行该命令后得到的只是console窗口中一堆有关avrdude出错的信息。在Arduino的历史修改记录文件中发现,avrdude在新的版本中被用来取代uisp完成bootloader的烧写,难道是这一功能没有在0009 Alpha版本中做充分的测试?

Arduino安装目录下的bootloader目录中,脚本文件burnpara.bat同样能够用来完成bootloader的烧写,研究该脚步本不难发现它其实是调用了如下一些uisp命令来完成整个烧写过程:
tools\avr\bin\uisp -dpart=ATmega8 -dprog=dapa -dlpt=0×378 –wr_fuse_l=0xdf –wr_fuse_h=0xca
tools\avr\bin\uisp -dpart=ATmega8 -dprog=dapa -dlpt=0×378 –erase –upload –verify if=bootloader\ATMegaBOOT.hex
tools\avr\bin\uisp -dpart=ATmega8 -dprog=dapa -dlpt=0×378 –wr_lock=0xCF
虽然Arduino开始舍弃uisp而转而采用avrdude,但使用uisp仍然能够成功地完成对bootloader的烧写,我们可以手工执行burnpara.bat脚本来通过并口线下载bootloader。如果burnpara.bat脚本执行过程中没有报告任何错误,就可以检查bootloader是否能够正常工作了。检查的办法是在Arduino数字接口的13脚和GND之间接一个发光二极管,其正极接13脚,负极接GND脚:

Arduino的bootloader在正常启动之后,会通过多次变换13脚的电压,来达到使接在该脚上的发光二极管闪烁的效果。通过按下Arduino复位按钮后观察该发光二极管是否闪烁,可以判断bootloader是否已经正常启动了。实验中我发现该发光二极管在不复位的情况下间隔几秒会再次闪烁,估计是因为此时没有任何可以执行的Arduino程序,因此bootloader重新启动了。
至此,DIY Arduino过程中非常关键的一步就算成功完成了。下一步是用Arduino语言编写相应的程序,并通过串口线下载到Arduino上运行, 我将从一个非常简单的Hello World原理级程序入手;-)
No tags
