![[Illustration]](http://www.21ic.com/upload/2004_12/041228230695177.jpg) 
 
摘要:
Atmel公司的AVR 8位RISC单片机是一种非常普通的单片机.它是一个具有电擦写可编程只读存储器(EEPROM),随机访问存储器(RAM),模数转换器,大量的输入和输出线路,计时器,RS-232通讯接口UART以及其他很多功能的单片集成电路.
最好的莫过于在Linux下具有一个可供利用的完整编程环境:你可以采用GCC对这种单片机进行C语言编程.本文我将向你讲述如何安装和使用GCC.我也将向你讲述如何把软件载入单片机.你所需要的只是一块AT90S4433单片机,一个4Mhz的晶震,一些电缆和少量其它便宜的部件. 
这篇文章只是一个简单介绍.在以后的文章种我们将会制作一个具有少数按键的LCD显示屏,模数输入,硬件狗和一些LED.我们的想法是做一个普通的Linux服务器的控制面板,不过我们先要学习怎么配置编程环境,这也是本文的主要内容. 
|  | 
采用GNU C语言开发环境你需要下列软件:
| binutils-2.11.2.tar.bz2 | 可以从: ftp://ftp.informatik.rwth-aachen.de/pub/gnu/binutils/ 或者 ftp://gatekeeper.dec.com/pub/GNU/binutils/下载 | 
| gcc-core-3.0.3.tar.gz | 可以从: ftp://ftp.informatik.rwth-aachen.de/pub/gnu/gcc/ 或者 ftp://gatekeeper.dec.com/pub/GNU/gcc/下载 | 
| avr-libc-20020106 .tar.gz | 这个AVR C语言库可以从: http://www.amelek.gda.pl/avr/libc/ 也可以从这个服务器下载:下载主页 | 
| uisp-20011025.tar.gz | AVR编程器可以从: http://www.amelek.gda.pl/avr/libc/ 也可以从这台服务器下载: 下载主页 | 
mkdir /usr/local/atmel
bunzip2 -c binutils-2.11.2.tar.bz2 | tar xvf -
cd binutils-2.11.2
./configure --target=avr --prefix=/usr/local/atmel
make
make install
tar zxvf gcc-core-3.0.3.tar.gz
cd gcc-core-3.0.3
./configure --target=avr --prefix=/usr/local/atmel --disable-nls --enable-language=c
make
make install
设置一些环境变量(bash语法):
export CC=avr-gcc
export AS=avr-as
export AR=avr-ar
export RANLIB=avr-ranlib
export PATH=/usr/local/atmel/bin:${PATH}
./configure --prefix=/usr/local/atmel/avr --target=avr --enable-languages=c --host=avr
make
make install
tar zxvf uisp-20011025.tar.gz
cd uisp-20011025/src
make
cp uisp /usr/local/atmel/bin
![[circuit diagram]](http://www.21ic.com/upload/2004_12/0412282306951711.gif) 
 | ![[avr]](http://www.21ic.com/upload/2004_12/041228230695172.jpg)  | 1 x AT90S4433, Atmel 8 位AVR RISC处理器. | 
| ![[socket]](http://www.21ic.com/upload/2004_12/041228230695171.jpg)  | 2 x 14脚 IC插槽 或者 1 x 28 脚 7.5mm IC插槽 这种28脚插槽要找到有点点困难,通常28脚插槽是14mm宽的,但是我们需要的是7.5mm的插槽. | 
| ![[resistor crystal capacitor]](http://www.21ic.com/upload/2004_12/0412282306951710.jpg)  | 1 x 10K 电阻 (颜色代码: 棕,黑,橙) 3 x 470 欧姆 电阻(颜色代码:黄,紫,棕) 1 x 1K 电阻 (颜色代码: 棕,黑,红) 1 x 220 欧姆 电阻 (颜色代码:红,红,棕) 1 x 4Mhz 晶震 2 x 27pf 陶电容 | 
| ![[connector]](http://www.21ic.com/upload/2004_12/041228230695175.jpg)  | 用于编译器的任意种类的5脚插头/插座.我们通常买些连接器条,然后5个折成一段. | 
| ![[matrix board]](http://www.21ic.com/upload/2004_12/041228230695173.jpg)  | 聚酯板. | 
| ![[db25]](http://www.21ic.com/upload/2004_12/041228230695176.jpg)  | 1 x DB25 连接器 用于插到并口. | 
| ![[led]](http://www.21ic.com/upload/2004_12/041228230695178.jpg)  | 1 x LED | 
| ![[beardboard]](http://www.21ic.com/upload/2004_12/041228230695174.jpg)  | 一块模拟板. 我们在这里不用,但是如果你想做将来的AVR实验这是非重有用的.我建议你把微控制器与晶震和电容集中在聚酯板上,然后通过短电缆把它们的输入/输出脚连接到模拟板. | 
![[AVR programmer]](http://www.21ic.com/upload/2004_12/041228230695179.jpg)
| AVR端针脚 | 并口端针脚 | 
|---|---|
| SCK (19) | Strobe (1) | 
| MISO (18) | Busy (11) | 
| MOSI (17) | D0 (2) | 
| Reset (1) | Init (16) | 
| GND | GND (18) | 
void main(void)
{
      /* enable PD5 as output */
      sbi(DDRD,PD5);
      while (1) {
            /* led on, pin=0 */
            cbi(PORTD,PD5);
            delay_ms(500);
            /* set output to 5V, LED off */
            sbi(PORTD,PD5);
            delay_ms(500);
      }
}
export PATH=/usr/local/atmel/bin:${PATH} (for bash)
setenv PATH /usr/local/atmel/bin:${PATH} (for tcsh)
# /sbin/lsmod
parport_pc
ppdev
parport
modeprobe parport
modeprobe parport_pc
modeprobe ppdev
chmod 666 /dev/parport0
确保没有在并口上的打印守护进程运行.如果你运行了就要在你连接编程器电缆前停止这个进程.现在编译和单片机编程的所有准备工作都做好了.avr-objdump -h avrledtest.out
S显示程序的不同段的大小..text是调入falsh EEPROM的指令代码,.data是象avrledtest.out:     file format elf32-avr
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000008c  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00800060  0000008c  00000120  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00800060  0000008c  00000120  2**0
                  ALLOC
  3 .eeprom       00000000  00810000  00810000  00000120  2**0
                  CONTENTS
  4 .stab         00000750  00000000  00000000  00000120  2**2
                  CONTENTS, READONLY, DEBUGGING
  5 .stabstr      000005f4  00000000  00000000  00000870  2**0
                  CONTENTS, READONLY, DEBUGGING
你也可以用avr-size命令得到一个更精简的形式: 
avr-size avrledtest.out
   text    data     bss     dec     hex filename
    140       0       0     140      8c avrledtest.out
在AVR上工作你必须特别注意.text+data+bss不超过4K,data+bss+stack(你可以不考虑stack的大小,它取决于有多少嵌套调用)不能超过128字节.avr-objdump -S avrledtest.out
它会生成你的代码的汇编列表.