• 專注電子技術學習與研究
    當前位置:單片機教程網 >> Arduino >> 瀏覽文章

    擴展NDS掌機連接Arduino (1)--Arduino端最小系統實現

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


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

    下面記錄一下實現過程。

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

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


    圖2. 用一塊Arduino給另一塊燒寫Bootloader。

    第二步,燒寫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,總是提示這樣的錯誤:
     "avrdude: Yikes!  Invalid device signature." or "avrdude: Expected signature for ATMEGA328P is 1E 95 0F" 或
     "stk500_getsync(): not in sync: resp=0x00"
    開始毫無頭緒,查了非常多的資料和論壇發現,很多老外都遇到這個問題,而且幾乎每個貼子都沒有解決,其中有一個貼子很多網友回復,非常之長,提了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 different boot loader.
    既然需要外部晶振,那么原來的沒取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所示連接好連線。


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


    圖4. Atmega 168/328 和Arduino引腳的對照圖。

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

    注意:第二步和第三步里,操作的對象都是需要制做的最小系統的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口作為供電電源后,本方案一切運行正常。所以第四步,對于我來說只是改變供電電壓便何。

    敬請期待后續工作...

    相關文章

    亚洲一区二区制服在线|在绩专区欧美自拍日韩|青春娱乐网97超碰人人射|在线观看国产网址你懂的