Attiny45 是一個 8-pin 的晶片,因為體積小而且功能強大且內建 4K 的 flash rom,對於簡單的一些練習是再好不過的晶片。但是這幾天為了想作一些關於 ADC 的實驗,於是就拿了它來做,結果呢? 它本身內建的功能沒有所謂的 UART (也就是在接腳圖上看不到 TxD 與 RxD ),而且手邊的Attiny2313 卻只有 on-chip Analog Comparator 兩支接腳作為類比比較用。一個有 ADC 卻沒硬體 UART,一個有 UART 卻只有一組 Analog Comparator 也不夠用 ......真是羚羊趕不完!
不過既然 Attiny45 有 USI 功能,想必可以用軟體實作的方式做出來!
上網 google 的一下,在 Atmel 官網中的一份文件( AVR307: Half Duplex UART Using the USI Module on tinyAVR and megaAVR devices) 有解決方案(如果找不到這份文件請 Google 一下,Updated 10/03,打文時又檢查了一遍連結發現ATEML官網最近有大改版)。不過事情卻沒想像中這麼容易,文件中所使用的晶片是 Attiny26,編譯器是 IAR Workbench。跟我用的都不一樣,所以如果要使用 Attiny45 內的 USI 做出 UART 的功能,必定要經過一番苦讀與修改。
首先要做的就是下載 AVR307所附的範例程式,把 Attiny26 相關的暫存器設定,修改為Attiny45,最後再修改整個 IAR 的程式碼讓它可以符合並通過 AVR Studio 編譯器的語法檢查,這樣才能產生所需要的Attiny45 UART 程式碼。
我的目的是要使用 ATtiny45 實現兩個 ADC 的監控。當然需要兩個 UART 功能的也可利用這個方法來做實現。
硬體線路:
硬體線路可以分為兩個部份,第一部分是Attiny45的線路部分,需要注意的是:當使用三線USI模式時,PB1(pin6) 是設定為 output 而且是一個open-drain output,所以必須要加上一個pull-up電阻。如圖中所示,加上了一個 1K 電阻,經實際測試是OK的!
- 請先用 AVR Studio 建立一個新的專案,專案建立的名稱與存放路徑隨你高興,這時你的專案中應該會有一個 <專案名稱>.c 的檔案在左側 "Source Files" 底下,我所設定的專案名稱為 "UART_45_Test"。
- 複製 AVR307 裡面 "main.c" 裡的內容到 "UART_45_Test.c" 裡
- 接著,複製 AVR307 範例程式中的 "USI_UART.c" 與 "USI_UART_config.h" 到專案目錄下並把這兩個檔案加入到專案檔中。
- 選擇 Project/Configuration Options 在此頁面下做專案檔參數設定
- 修改 "UART_45_Test.c" 程式碼,如下所示
"UART_45_Test.c" 修改後的檔案
若與 AVR307 "main.c" 做比較,就可以發現到程式碼修改了晶片進入到 idle 模式的部份,標頭檔只加入 "USI_UART_config.h",其餘的幾乎沒做變更。
- 修改 "USI_UART_config.h" 程式碼,如下所示
"USI_UART_config.h" 修改後的檔案
這個檔案只是新增兩個標頭檔 (
- 修改 "USI_UART.c"程式碼,如下所示
"USI_UART.c" 修改後的檔案
主要是修改 IAR 與 AVR Studio 不相容的語法,還有修改 ATtiny26 暫存器設定到 ATtiny45,讓 AVR Studio 編譯時可以通過。這裡有兩個檔案的比較結果,建議使用 PSPad 觀看,不然會有格式對齊的問題。
- OK!現在可以編譯產生 HEX 檔,然後將 HEX 檔燒錄進 ATtiny45 晶片中 。
- 如線路圖將線路接好
- 設定超級終端機 57600, 8, N, 1 (57600bps, 8 data-bit, no parity check, 1 stop-bit)。
- 開電測試
沒有留言:
張貼留言