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/ 也可以從這台服務器下載: 下載主頁 我們把所有這些程序安裝到/usr/local/atmel下. 這是為了使這些程序和普通Linux C語言編譯器分開. 用下面的命令建立這個目錄: mkdir /usr/local/atmel 軟件安裝:GNU binutils 這個binutils軟件包提供建立目標文件所需要的所有低級工具.它包括一個AVR匯編器(avr-as),連接器(avr-ld),庫處理工具(avr-ranlib,avr-ar),生成可載入單片機EEPROM目標文件的程序(avr-objcopy),反匯編器(avr-objdump)和象avr-strip和avr-size這類的工具軟件. 運行下列命令編譯安裝binutils: 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 添加/usr/local/atml/lib這行到/etc/ld.so.conf文件裡面,運行/sbin/ldconfig命令重建連接器緩存.
軟件安裝:AVR GCC編譯器 avr-gcc將是我們的C語言編譯器. 運行下列命令編譯安裝這個編譯器: 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
軟件安裝:AVR C語言庫 這個C語言庫仍在開發中.安裝過程可能版本與版本之間有些細微的差別.如果你想照著本文一步一步做的話我推薦采用上表列出的版本.上表中的軟件我已經做過測試了,本文中我們所寫的程序和後面的文章中的程序都在上面這個版本上工作得很好. 設置一些環境變量(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
軟件安裝:編程器 這個編程器將指定的准備好的目標代碼載入到我們單片機的EEPROM中. 這個Linux下的uisp是一個非常好的編程器.可以直接用在Makefile裡面.你只要添加"make load"規則,這樣你就可以編譯載入軟件一次完成. uisp按照下面這樣安裝: tar zxvf uisp-20011025.tar.gz cd uisp-20011025/src make cp uisp /usr/local/atmel/bin
一個小的測試工程 我們將以一個小的測試電路開始.這個測試電路的目的僅僅是測試我們的開發環境.我們用它來編譯,下載以及測試一個小程序.這個測試程序僅僅是引起LED閃爍. 我建議給這個單片機弄一個小的印刷電路板.以後你就可以在這塊電路板的區域做你自己的試驗.一個好辦法是用一個模擬板當作這個.你無論如何也不能嘗試著把AVR和它的4MHz晶震直接放在模擬板上.更好的辦法是用少量的短線把輸入和輸出腳與模擬板相連,因為這樣的模擬板不是為快速數字電路制作的. 4Mhz的晶震和電容器在物理上應該非常靠近單片機. 在我們這個例子裡編程器的連接器電阻實際上是不必要的.只有在你打算把port-B 輸入輸出腳用於其他目的時才需要.
需要的硬件 你需要的部件列在下表中.所有的這些都非常普通,便宜,只是單片機貴點,大概7.5歐元.盡管它是非常普通的單片機,它也不是隨便在那家當地的無線電商店就能買到的,象那些大的電子部件銷售商例如:(www.reichelt.de(德國),www.conrad.de(德國),www.selectronic.fr(法國)等等........,可能在你的國家這些類似的站點)的倉庫裡才有全部的部件. 1 x AT90S4433, Atmel 8 位AVR RISC處理器. 2 x 14腳 IC插槽 或者 1 x 28 腳 7.5mm IC插槽 這種28腳插槽要找到有點點困難,通常28腳插槽是14mm寬的,但是我們需要的是7.5mm的插槽. 1 x 10K 電阻 (顏色代碼: 棕,黑,橙) 3 x 470 歐姆 電阻(顏色代碼:黃,紫,棕) 1 x 1K 電阻 (顏色代碼: 棕,黑,紅) 1 x 220 歐姆 電阻 (顏色代碼:紅,紅,棕) 1 x 4Mhz 晶震 2 x 27pf 陶電容 用於編譯器的任意種類的5腳插頭/插座.我們通常買些連接器條,然後5個折成一段. 聚酯板. 1 x DB25 連接器 用於插到並口. 1 x LED 一塊模擬板. 我們在這裡不用,但是如果你想做將來的AVR實驗這是非重有用的.我建議你把微控制器與晶震和電容集中在聚酯板上,然後通過短電纜把它們的輸入/輸出腳連接到模擬板. 除開上面的這些,還需要提供一個穩定的5V直流電源,你也可以采用4.5V的電池作為電源供應.
安裝編程器硬件 AT90S4433支持在線編程(ISP). 簡單說就是:你沒有必要為了給單片機編程而移動單片機模塊.你會看到可以用50-150歐元買到做好的編程器硬件,但沒有必要為一個編程器更多地投資.采用Linux,uisp軟件和免費的並口你就可以建立起一個非常好的簡單的AVR編程器,也就采用一根簡單的電纜連接而已.編程器電纜的線必須符合下列要求: AVR端針腳 並口端針腳 SCK (19) Strobe (1) MISO (18) Busy (11) MOSI (17) D0 (2) Reset (1) Init (16) GND GND (18) 電纜長度不超過70cm.
寫入軟件 在GCC的幫助下AT90S4433可以用一般的C語言編程. 了解一些AVR匯編很有用,但也不是非要不可.AVR C語言庫的avr-libc-reference 講述了libc的大部分函數. Harald Leitner寫了一個關於如何使用AVR和GCC的帶有大量有用的例子的文檔(haraleit.pdf, 286Kb, 原作 http://www.avrfreaks.net/AVRGCC/). 從Atmel公司的網頁, (www.atmel.com, 找到: avr prodUCts -> 8 bit risc-> Datasheets), 你可以下載完整的數據資料 (復制到本地: avr4433.pdf, 2361Kb) . 它描述了所有的寄存器以及如何使用CPU. 使用4433的時候有一點要注意的是它只有128字節的RAM和4K字節的EEPROM.這就意味著你不能定義大的數據結構和字符串.程序中不能采用深入的嵌套調用或者是遞歸調用. 就像寫 char string[90]; 這樣一行就已經太大了. 一個整數是16bit,如果需要一個小的整數你可以采用 unsigned char i; /* 0-255 */ 你將非常驚訝你的程序是多麼大.它真是一個強大的處理器. 理論不如實踐,我們將寫一個程序讓我們的LED每隔0.5秒閃爍一次.雖然不是很有用不過也是一個非常好的開頭,而且可以用來測試我們的開發環境和編程器. 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); } } 上面的例子可以看出用它寫個程序是多麼簡單.你看到的僅僅是主程序,delay_ms函數包含在全部的清單(avrledtest.c)中. PD5腳用作輸出的話,你必須在數據寄存器中為D端口(DDRD)設置PD5位.然後就能用cbi*(PORTD,PD5)函數給PD5設置0V電壓(清除PD5)或者用sbi(PORT,PD5)設置5V電壓(設置PD5)."PD5"值的定義包含在通過io.h包含的io4433.h中.你不用擔心這點. 如果你曾經在象Linux這樣的多用戶多任務系統下寫過程序的話你就知道絕不要寫一個非模塊化的無窮的循環.這會浪費CPU時間,減慢系統速度.在AVR上就不一樣了,我們沒有多個任務,也沒有其他程序在運行,這甚至不是一個操作系統,在這上面運用無窮循環顯得很普遍.
編譯和載入 在開始之前確認一下PATH中包含了/usr/local/atmel/bin路徑,必要的話編輯你的.bash_profile或者.tcshrc,添加如下內容: export PATH=/usr/local/atmel/bin:${PATH} (for