網頁

2011年3月3日 星期四

實作 UART 功能使用 Attiny45 USI

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的!


第二部份是一個 RS232 準位準換電路,Attiny45 所標示的的 Tx 與 Rx 分別接到 232 晶片的 pin11 和 pin12,由於輸出已經直接跳線到 D-Type 母接頭,因此在與電腦連接時並不需要特別購買 9-pin 的 RS232跳線,直接用一般的線就好。圖中所使用的晶片為 MAX232 和 HIN232,若你使用的晶片代號不一樣時,請查閱一下晶片手冊。對於簡單應用與測試來講這個線路很足夠了,不但簡單而且零件很容易取得,價錢又便宜!

修改:

工具:AVR Studio、AVR307程式碼、Attiny26 與 Attiny45 手冊

  • 請先用 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" 修改後的檔案
這個檔案只是新增兩個標頭檔 (, ) 宣告在此處,改變兩個常數定義 (SYSTEM_CLOCK = 8000000, BAUNRATE = 576000),所以 UART 的設定為 "576000, 8, N, 1",這個也是在設定超級終端機連線時的重要參數,不然會無法通訊的。
  • 修改 "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)。
  • 開電測試
這時在超級終端機視窗按下任意字元,例如 "G",視窗會出現

You just sent me: G

這就是修改之後可以用在 ATtiny45 晶片的 UART 程式,而且可以用在沒有 UART 但是有 USI module 的 AVR  晶片上,然後實現或是擴充 UART 的功能。

有時候我們必須去使用別人已經寫過的程式來加速實現自己所要完成的東西,雖然在看起來是種抄襲,但是當我們學習至熟悉前,不是都是經由抄襲別人過去的經驗,傳承之後加以咀嚼再慢慢消化變成成長的養分,咀嚼的越夠越容易被消化!就像是把別人寫的程式看懂、了解其寫作 key point 以及功能實現的方法,這樣自然比你自己瞎子摸象般的學習快的多了,您說是吧!

畢竟要看懂別人寫的程式,自己也要下過功夫!

下一個主題就是利用這邊所實現成功的 ATtiny45 UART 的功能,加入CDS與溫度監控的 ADC 轉換功能,然後將轉換數據輸出到超級終端機裡。

沒有留言:

張貼留言