專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> Arduino >> 瀏覽文章

擴(kuò)展NDS掌機(jī)連接Arduino (1)--Arduino端最小系統(tǒng)實(shí)現(xiàn)

作者:c_gao   來源:轉(zhuǎn)的   點(diǎn)擊數(shù):  更新時(shí)間:2014年06月25日   【字體:
前幾天寫了這篇方案:擴(kuò)展NDS掌機(jī)連接Arduino方案設(shè)計(jì)。昨天在此基礎(chǔ)上實(shí)現(xiàn)了第一步,即Arduino端最小系統(tǒng)實(shí)現(xiàn)。此第一步主要內(nèi)容概括為不使用任何外部電子元件,實(shí)現(xiàn)僅Atmega328獨(dú)立運(yùn)行的最小系統(tǒng),包括支持3.3V運(yùn)行電壓下工作的bootloader,以及一個(gè)簡單的sketch (blink)的運(yùn)行。該最小系統(tǒng)目前在面包板上實(shí)現(xiàn)和運(yùn)行,圖1為實(shí)現(xiàn)效果。


圖1. 最小Arduino系統(tǒng)blink程序效果。左側(cè)面包板為最小系統(tǒng),右側(cè)無CPU的UNO僅為左側(cè)提供3.3V工作電壓。

下面記錄一下實(shí)現(xiàn)過程。

首先我手上的資源如下:
(1)兩塊Arduino UNO板子
(2)面包板一塊
(3)杜邦線若干

第一步,制做Arduino ISP。是在IDE里設(shè)置好正確的串口和板子類型(Arduino UNO),選擇File->Examples->ArduinoISP。編譯上傳該Sketch至其中一塊UNO板上。上傳成功后,這塊Arduino板子便成為了ISP (In-System Programmer),即燒寫器或編程器。


圖2. 用一塊Arduino給另一塊燒寫B(tài)ootloader。

第二步,燒寫bootloader。按圖2所示連接好兩塊UNO板的線。圖中上方的UNO為含需要被上傳bootloader的CPU板子,下方為第一步完成的作為ISP的Arduino UNO。然后按之前方案所述,在Sketchbook location路徑(該路徑可在菜單Preferences對(duì)話框內(nèi)查看)下創(chuàng)建hardware文件夾,并在該文件夾中創(chuàng)建breadboard文件夾,然后在這個(gè)breadboard文件夾中創(chuàng)建boards.txt文件,內(nèi)容如下:

##############################################################

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

然后,關(guān)閉Arduino IDE后重新打開IDE,此時(shí)在菜單Tools->Board里會(huì)出現(xiàn)一塊新的板子,即:ATmega328 on a breadboard (8 MHz internal clock)。選擇這塊板子。并在菜單Tools->Programmer里選擇Arduino as ISP。然后點(diǎn)擊菜單Tools->Burn Bootloader,IDE開始給另一塊板子的CPU燒寫B(tài)ootloader。燒寫成功后,被
燒的板子上的CPU就擁有了僅使用CPU內(nèi)部8MHz晶振作為時(shí)鐘源的最小系統(tǒng)。

這里不得不提一件非常重要的插曲,估計(jì)絕大多數(shù)用戶可能都會(huì)遇到的很難解決的問題。以下是我最初嘗試的第二步:將其中一塊的CPU取下后按之前方案中圖3連接好線后,怎么也刷不上bootloader,總是提示這樣的錯(cuò)誤:
 "avrdude: Yikes!  Invalid device signature." or "avrdude: Expected signature for ATMEGA328P is 1E 95 0F" 或
 "stk500_getsync(): not in sync: resp=0x00"
開始毫無頭緒,查了非常多的資料和論壇發(fā)現(xiàn),很多老外都遇到這個(gè)問題,而且?guī)缀趺總(gè)貼子都沒有解決,其中有一個(gè)貼子很多網(wǎng)友回復(fù),非常之長,提了N種可能的解決方法,包括添加10uF的電容在Reset和Gnd之間,以及添加10K電阻在Vcc和Reset之間,還有說UNO不帶FTDI芯片無法解決,可惜提問者也都沒有最終解決。而我除了第三種FTDI外,前兩種嘗試了N遍也都無果。其中10uF的電容我還是從同學(xué)的廢舊錄音機(jī)上拆下的。

還好我在第二天查到了另一種引發(fā)該問題的原因,即因?yàn)槲沂褂玫氖荂PU是從原UNO板上取下的Atmega328,該CPU已燒有帶16MHz外部晶振運(yùn)行的bootloader,因此無法取下后在沒有添加晶振和附加濾波電容的條件下重新燒錄bootloader或運(yùn)行。是這篇文章給了我回答和解決方法: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 different boot loader.
既然需要外部晶振,那么原來的沒取CPU時(shí)的UNO板子不就帶嗎?于是按這個(gè)思路最后實(shí)現(xiàn)了正確的第二步。而之前方案中采用的是剛出廠未被使用過的CPU,這種剛出廠未使用的CPU在出廠時(shí)默認(rèn)被設(shè)置為使用內(nèi)部晶振,因此可以不用外部晶振就能工作。這個(gè)理由應(yīng)該可以從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. 

因此第二步的成功和失敗經(jīng)驗(yàn)得出如下結(jié)論:
(1)如果是給已含有帶外部晶振的CPU燒只用片內(nèi)晶振的bootloader時(shí),需要添加外部晶振。
(2)如果是給出廠未使用過的CPU燒只用片內(nèi)晶振的bootloader時(shí),不需要添加外部晶振。

第三步,上傳Sketch。首先,將原作為Arduino ISP的板子上的CPU取下放到一邊(暫時(shí)用不上了),并按圖3所示連接好連線。


圖3. 上傳Sketch時(shí)的連線。
此時(shí),取下原CPU,再連好線后,任意選擇一個(gè)Sketch即可編譯上傳。我為了演示方便,選擇了最常用的Blink,然后對(duì)照?qǐng)D4,將Arduino 13號(hào)數(shù)字引腳對(duì)應(yīng)的Atmega328的第19號(hào)腳(PB5)和Gnd間串連個(gè)電阻(220~330歐左右)和LED,便能看到一秒停一秒亮的運(yùn)行效果了。


圖4. Atmega 168/328 和Arduino引腳的對(duì)照?qǐng)D。

至此,面包板上的東西就是個(gè)真正的最小系統(tǒng)了,無任何外電子元件。

注意:第二步和第三步里,操作的對(duì)象都是需要制做的最小系統(tǒng)的CPU,所以菜單Tools->Board里保持選擇ATmega328 on a breadboard (8 MHz internal clock)不變。

第四步,使用3.3V給最小系統(tǒng)供電。 這部分工作可能復(fù)雜,也可能很簡單,這和CPU類型,以及燒錄bootloader時(shí)boards.txt里寫的low fuse, high fuse, extend fuse有關(guān)。特別是extend fuse里可以設(shè)置brown-out電壓,按Atmel官方的資料, 雖然Atmega 168/328運(yùn)行電壓為1.8V~5.5V,但實(shí)際情況可能會(huì)因?yàn)檫\(yùn)行電壓低于一定值時(shí)CPU就無法工作。這就是為什么要設(shè)置extend fuse bit里brown-out電壓的原因,具體這里不給出說明了,可以google之。

因?yàn)槲也捎蒙鲜鯾oards.txt里的fuse bit設(shè)置后,將無CPU的Arduino UNO板3.3V口作為供電電源后,本方案一切運(yùn)行正常。所以第四步,對(duì)于我來說只是改變供電電壓便何。

敬請(qǐng)期待后續(xù)工作...

相關(guān)文章