首先我手上的資源如下:
(1)兩塊Arduino UNO板子
(2)面包板一塊
(3)杜邦線若干
第一步,制做Arduino
ISP。是在IDE里設置好正確的串口和板子類型(Arduino
UNO),選擇File->Examples->ArduinoISP。編譯上傳該Sketch至其中一塊UNO板上。上傳成功后,這塊Arduino板子便成為了ISP
(In-System Programmer),即燒寫器或編程器。
第二步,燒寫bootloader。按圖2所示連接好兩塊UNO板的線。圖中上方的UNO為含需要被上傳bootloader的CPU板子,下方為第一步完成的作為ISP的Arduino
UNO。然后按之前方案所述,在Sketchbook
location路徑(該路徑可在菜單Preferences對話框內查看)下創建hardware文件夾,并在該文件夾中創建breadboard文件夾,然后在這個breadboard文件夾中創建boards.txt文件,內容如下:
##############################################################
atmega328bb.name=ATmega328 on a breadboard (8 MHz internal
clock)
atmega328bb.upload.protocol=stk500
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600
atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05
atmega328bb.bootloader.path=arduino:atmega
atmega328bb.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F
atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard
然后,關閉Arduino
IDE后重新打開IDE,此時在菜單Tools->Board里會出現一塊新的板子,即:ATmega328 on a
breadboard (8 MHz internal
clock)。選擇這塊板子。并在菜單Tools->Programmer里選擇Arduino as
ISP。然后點擊菜單Tools->Burn
Bootloader,IDE開始給另一塊板子的CPU燒寫Bootloader。燒寫成功后,被
燒的板子上的CPU就擁有了僅使用CPU內部8MHz晶振作為時鐘源的最小系統。
這里不得不提一件非常重要的插曲,估計絕大多數用戶可能都會遇到的很難解決的問題。以下是我最初嘗試的第二步:將其中一塊的CPU取下后按之前方案中圖3連接好線后,怎么也刷不上bootloader,總是提示這樣的錯誤:
開始毫無頭緒,查了非常多的資料和論壇發現,很多老外都遇到這個問題,而且幾乎每個貼子都沒有解決,其中有一個貼子很多網友回復,非常之長,提了N種可能的解決方法,包括添加10uF的電容在Reset和Gnd之間,以及添加10K電阻在Vcc和Reset之間,還有說UNO不帶FTDI芯片無法解決,可惜提問者也都沒有最終解決。而我除了第三種FTDI外,前兩種嘗試了N遍也都無果。其中10uF的電容我還是從同學的廢舊錄音機上拆下的。
還好我在第二天查到了另一種引發該問題的原因,即因為我使用的是CPU是從原UNO板上取下的Atmega328,該CPU已燒有帶16MHz外部晶振運行的bootloader,因此無法取下后在沒有添加晶振和附加濾波電容的條件下重新燒錄bootloader或運行。是這篇文章給了我回答和解決方法:Breaduino,文章里有一段原話:
So why couldn't I burn the bootloader using the Minimal
Circuit?
All my ATMega came preloaded with the regular Arduino Bootloader for use with the Arduino Board. That way they are configured to work with an external 16 MHz crystal.
So, because of that, the ATMega that I was trying to burn a bootloader into wasn't working. It needed the external crystal as configured for me to be able to burn a differentboot loader.
All my ATMega came preloaded with the regular Arduino Bootloader for use with the Arduino Board. That way they are configured to work with an external 16 MHz crystal.
So, because of that, the ATMega that I was trying to burn a bootloader into wasn't working. It needed the external crystal as configured for me to be able to burn a different
既然需要外部晶振,那么原來的沒取CPU時的UNO板子不就帶嗎?于是按這個思路最后實現了正確的第二步。而之前方案中采用的是剛出廠未被使用過的CPU,這種剛出廠未使用的CPU在出廠時默認被設置為使用內部晶振,因此可以不用外部晶振就能工作。這個理由應該可以從Atmel官方的DataSheet中查得到(我沒查),不過我在這篇文章:Fuse bits aren’t that
scary中查到了這樣兩句話:
1. Most
MCUs are shipped with the internal RC oscillator set as default
clock source.
2. ATmega48
is shipped with internal 8MHz RC oscillator set as an active clock
source and CKDIV8 fuse
set.
因此第二步的成功和失敗經驗得出如下結論:
(1)如果是給已含有帶外部晶振的CPU燒只用片內晶振的bootloader時,需要添加外部晶振。
(2)如果是給出廠未使用過的CPU燒只用片內晶振的bootloader時,不需要添加外部晶振。
第三步,上傳Sketch。首先,將原作為Arduino
ISP的板子上的CPU取下放到一邊(暫時用不上了),并按圖3所示連接好連線。
此時,取下原CPU,再連好線后,任意選擇一個Sketch即可編譯上傳。我為了演示方便,選擇了最常用的Blink,然后對照圖4,將Arduino
13號數字引腳對應的Atmega328的第19號腳(PB5)和Gnd間串連個電阻(220~330歐左右)和LED,便能看到一秒停一秒亮的運行效果了。
至此,面包板上的東西就是個真正的最小系統了,無任何外電子元件。
注意:第二步和第三步里,操作的對象都是需要制做的最小系統的CPU,所以菜單Tools->Board里保持選擇ATmega328
on a breadboard (8 MHz internal clock)不變。
第四步,使用3.3V給最小系統供電。
這部分工作可能復雜,也可能很簡單,這和CPU類型,以及燒錄bootloader時boards.txt里寫的low fuse, high
fuse, extend fuse有關。特別是extend fuse里可以設置brown-out電壓,按Atmel官方的資料,
雖然Atmega
168/328運行電壓為1.8V~5.5V,但實際情況可能會因為運行電壓低于一定值時CPU就無法工作。這就是為什么要設置extend
fuse bit里brown-out電壓的原因,具體這里不給出說明了,可以google之。
因為我采用上述boards.txt里的fuse
bit設置后,將無CPU的Arduino
UNO板3.3V口作為供電電源后,本方案一切運行正常。所以第四步,對于我來說只是改變供電電壓便何。
敬請期待后續工作...
【關閉窗口】