2011年3月1日 星期二

把 Arduino 當成一個 AVR ISP(In-System Programmer) 使用(1)

ArduinoISP 簡介

這篇教學教你怎麼把 Arduino 板子變成一個 AVR ISP 燒錄器(In-System Programmer),讓我們把它稱作 ArduinoISP。ArduinoISP 允許你用 Arduino 板子把 bootloader 燒錄到 AVR 晶片上,比如 Arduino 板子上所用的 ATmega168 或 ATmega328 晶片。

image 
▲ Arduino Duemilanove w/ ATmega328

什麼是 Bootloader?

image
▲ AVR ISP

一般來說,要開發 AVR 晶片的程式,除了要有一張 AVR 開發板外,還需要準備一個像上圖一樣稱為 AVR ISP(In-System Programmer) 的特殊的裝置,這種裝置的用途主要是讓開發者可以用它把寫好的韌體上傳到晶片上。

image
▲ 標準 Arduino 板子上都有 ICSP 排針,AVR ISP 的傳輸線就接在這個位置

什麼是 bootloader 呢?簡單地說,bootloader 是一支程式,晶片上如果有 bootloader,便可以直接把韌體上傳到晶片上,你就不需要 AVR ISP 燒錄裝置了。我們買的 Arduino 板子上的 ATMega 晶片都預先燒錄了 bootloader。市面上也有在賣已經預先燒錄好 Arduino bootloader 的 ATmega 晶片。

平常在用 Arduino IDE 時候,我們既不用準備 AVR ISP,也沒有在 ICSP 介面上接任何連接線,而是直接走 USB 介面就可以上傳程式,之所以可以這麼方便,全都是因為有 bootloader 的關係。

什麼時候需要燒錄 bootloader 呢? 嗯,如果有一天你買了一些材料和全新的 ATmega 晶片,想 DIY 自己做 Arduino 板子的話,那麼就會需要燒錄 bootloader。

材料
  • Arduino 板子 x 2
  • 單心線 x N
  • 全新的 DIP(Dual In-line Package) 包裝 ATmega168 或 ATmega328 晶片

為了方便說明,我們為這兩張 Arduino 板子取個名字,一個是燒錄用的板子,叫作 ArduinoISP,另一個是要被燒錄 bootloader 的板子,稱為 Target board。全新的 ATmega 晶片要放到 Target board 上。

注意由於 Arduino UNO 目前還未支援,所以你不能把 Arduino UNO 當成 AVR ISP programmer 用。

最好順便準備一個 IC 夾,因為你可能會有需要把 ATmega 晶片從板子上拔起來的時候,使用 IC 夾拔 IC 可以避免接腳受損或折彎。

image 

▲ IC 夾 (圖片來源: 台灣金電子)

Bootloader 燒錄步驟

1) 首先,使用 USB cable 連接電腦與 ArduinoISP。啟動 Arduino IDE,點 File > Examples > ArduinoISP 並把程式上傳到 ArduinoISP 板子上。

image

2) 照著底下的接線圖把兩張 Arduino 板子接起來:

  • 兩張板子的 pin 11 ~ pin 13 兩兩對接,pin 11 接 pin 11,pin 12 接 pin 12,pin 13 接 pin 13。
  • 兩張板子的 5V 與 Gnd 也是兩兩對接,5V 接 5V,Gnd 接 Gnd。
  • 最後,ArduinoISP 的 pin 10 接到 Target board 的 Reset pin。

 image
▲ 適用 Arduino Duemilanove 或 Diecimila 的線路接法

Arduino NG 或更早之前的板子因為沒有 reset pin,接法要稍做調整,必須把 ArduiniISP 的 pin 10 接到 Target board 上的 ATmega 晶片的 pin 1:

 image
▲ 適用 Arduino NG 或更早期的板子的線路接法

3) 從 Arduino IDE 的 Tools > Board  選單中挑選 Target Board 的 ATMega 晶片要燒錄的 bootloader 版本。

假如你買了一顆全新的 ATMega328 晶片,你想拿這顆晶片來製作 Arduino Duemilanove 相容的板子,那麼在這個地方你就要選擇 "Arduino Duemilanove or Nano w/ ATmega328" 這個選項:

image

4) 點選 Tools > Burn Bootloader > w/ Arduino as ISP 開始燒錄 bootloader。

image
▲ 選 w/ Arduino as ISP

image
▲ 狀態列訊息: bootloader 燒錄中

image
▲ 狀態列訊息: bootloader 燒錄完畢

就這樣,當程式上傳完畢後,就完成了 bootloader 的燒錄工作。你可以試試看在 Target Board 上跑個 Blink 程式,看看晶片的運作是否正常。

底下是 bootloader 燒錄動作摘要:

  1. File > Examples > ArduinoISP 並把程式上傳到 ArduinoISP 板子上。
  2. 照著接線圖連接兩張 Arduino 板子。
  3. Tools > Board  選單中挑選 Target Board 的 ATMega 晶片要燒錄的 bootloader 版本。
  4. Tools > Burn Bootloader > w/ Arduino as ISP 開始燒錄 bootloader。
延伸閱讀

46 意見:

GCY 提到...

您好,我最近把UNO當ISP用麵包板連接的方法燒錄bootloader到新的target晶片,燒錄玩後把晶片跟舊的替換後整片板子功能正常所以我想target晶片有燒錄成功,可是問題來了!當我要做一塊官方網站簡易麵包板版本的arduino時,我把target晶片按照官方網站的線路接法接一接是有成功,可是當我要用市面上賣的FTDI模組跟target晶片的RXD、TXD連接然後再把它連到電腦upload程式都會失敗,結果google一下看到您這篇文章"注意"那段話所以我在想是不是跟這有關?麻煩版主指點迷津<(_ _)>

coopermaa 提到...

Hi GCY,

把 UNO 當 ISP 用,這我沒試過,因為手上沒 UNO。你有試成功了喔? 厲害喔!Arduino Forum 上也有人在討論這個議題,有些人說可以,有些人說不行。

嗯,你那簡易麵包板版本的 arduino 是走 USB 的嗎? 還是有透過另一張 Arduino 板子的 USB?我懷疑可能是 Reset pin 沒接的關係。

GCY 提到...

先感謝您的回覆:)

目前是這樣的,請先看這影片 -> http://dl.dropbox.com/u/16634624/MVI_3002.flv
影片中的動作讓我確定有把bootloader(UNO)燒錄進去,而且在upload blink example也有成功!但我是"把它放在先前買的arduino母板上才能upload成功blink"(圖 -> http://dl.dropbox.com/u/16634624/IMG_3003.jpg),但!問題是說如果我用把母板的RXD TXD孔連接到插在麵包板上的atmega時沒辦法upload成功blink程式(圖 -> http://dl.dropbox.com/u/16634624/IMG_3005.jpg),而且用FTDI模組連接到麵包板上的atmega也一樣(圖 -> http://dl.dropbox.com/u/16634624/IMG_3004.jpg),我也試過用官網 -> http://arduino.cc/en/Main/StandaloneAssembly 弄RS232+7404IC也一樣不能成功ORZ,總結我的問題就是燒錄過bootloader的atmega除了放在母板上upload程式外都不能成功ORZ

coopermaa 提到...

試試看這個方法,把母板的RXD TXD孔連接到插在麵包板上的atmega(圖 ->
http://dl.dropbox.com/u/16634624/IMG_3005.jpg),然後從母板 RESET pin(在3.3V 左邊)接一條線到 atmega 的 reset pin.

BTW, http://dl.dropbox.com/u/16634624/IMG_3005.jpg 這張圖的 reset pin 跟電阻好像沒接在一起耶!?

GCY 提到...

那個10k電阻有跟麵包板上的reset pin接在一起XD我試著你的建議,把這張圖 http://dl.dropbox.com/u/16634624/IMG_3005.jpg 麵包板上reset pin多接一條線到母板的reset pin,重新upload程式時會發現麵包板digital 13的紅色LED"有reset閃爍"所以這部份沒問題,但是似乎RXD、TXD兩條線一樣不能把程式upload上麵包板的atmega的樣子QQ

coopermaa 提到...

哈,被黑線擋住視線了,原來電阻有插在 reset pin.

結果還是不行嗎?我有拿 Duemilanove 實驗,可以成功 upload 程式。Arduino 官網是說 UNO 的 optiboot 還不支援 ArduioISP.pde, 可是你已經可以燒錄 bootloader 卻沒辦法 upload,這部份我就不曉得了。

GCY 提到...

我看到這篇後我的問題完全解決了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

http://forum.sparkfun.com/viewtopic.php?f=32&t=27960

之前我就一直改reset pin,沒想到手動就可以了XDDDDDDDDDDDD非常感謝大大這幾天幫我解答<(_ _)>受益良多

coopermaa 提到...

你是說手動按 reset 就可以了嗎?

不客氣,是你自己找到答案的,其實我還有點霧煞煞,哈~ 我看我得把 auto-reset 列入研究的事項。

GCY 提到...

用arduino母板有reset pin 但是我要用FTDI沒有所以可以用手動的XD

coopermaa 提到...

能解決問題就好。

你是做什麼的啊?為什麼會接觸 Arduino 呢?

歡迎常來啊。^o^

GCY 提到...

主要目標想做hexpod XD,所以才想自己客製化Arduino把PWM腳位擴充XD,自從農曆年前接觸Arduino之後才發現以前高中讀的物理電學電路是怎麼一回事,不單單只知道計算,而且從上個月我就一直在您的blog學到了不少的東西:)

GCY 提到...

順便貼一下這幾天的成果:)

http://dl.dropbox.com/u/16634624/IMG_3012.jpg

我自己上禮拜有自己學著洗PCB板,但是那一塊被我焊接爆炸了XD所以上面就先用洞洞板XD

coopermaa 提到...

你真厲害,會自己洗 PCB 板。你是學電子的嗎?

為什麼需要擴充 PWM? 是因為 arduino 的 pwm 腳位不夠用嗎?那一般 hexpod 需要多少支 pwm 腳位?

我看很多 Arduino 的玩家都是用 TLC5940 擴充 pwm。

GCY 提到...

我目前是南部某大學資工系一年級的學生XD

其實洗板子也還好,我只是照著這裡 http://dl.dropbox.com/u/16634624/%E9%9B%BB%E8%B7%AF%E6%9D%BFDIY%E6%B5%81%E7%A8%8B.html 還有這裡取得麵包板版本的曝光片layout http://dl.dropbox.com/u/16634624/DIY%20Arduino.html

因為控制18個servo要18個pwm腳位,所以我也打算用TLC5940來擴充,然後在弄個獨立電源XD

感謝指教:)

coopermaa 提到...

之前我也曾看到 The Complete DIY Arduino,作者真的很有心。

加油啊,希望日後也可以看到你的分享。:)

GCY 提到...

無意間發現大大也有上robofun XD

coopermaa 提到...

對啊,我偶爾會去 robofun 逛一下
不過,Arduino 的討論不熱絡耶,好像台灣的討論區都這樣

原來你也有上 robofun 啊。:)

GCY 提到...

馬大可以借您最後兩張圖放在在下blog嗎:)

coopermaa 提到...

Sure, no problem.

hclee 提到...

avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

請問燒錄時出現以上訊息
不知如何解決~

coopermaa 提到...

"avrdude: stk500_getsync(): not in sync: resp=0x00" --- 我沒遇過這個狀況

Arduino Forum 上剛好也有人在討論這問題:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1248528012/all

網友歸納了幾個可能原因:
1. 所選的 Board 跟實際用的沒有匹配
2. COM Port 沒有設對

檢查看看你的設定對不對,不行的話,Forum 上的網友說,在 upload sketch 的時候建議按一下 reset 鈕

鄭昆義 提到...

版大,我是剛碰實際電路的新手,想問個問題,是否可用您版上提到的方法燒ATMEL89S51的晶片呢??程式是否一樣可用ARDUINO的語言?(抱歉,對晶片不是很了解)

coopermaa 提到...

我也不確定能不能燒 89S51 的晶片。不過,這裏有篇文章有提供一個方法: http://brutalelectronics.blogspot.com/2011/09/how-to-program-at89s51-from-arduino.html

你打算用 Arduino 寫 89S51 的程式嗎? Arduino 目前只支援 atmega 和 attiny,8051 的晶片不支援喔。

鄭昆義 提到...

抱歉,最近要做個專題,所以必須要一些微控制器來做傳輸和感測,但若都用ARDUINO有點太貴,所以想說座個簡化版的微控器就好,所以還在考慮要用那些晶片,8051晶片相對下便宜,但似乎還需要做USB與他溝通的介面進行燒錄(畢竟USB訊號還要轉換),所以想說若可以向版大提到的,用ARDUINO做一個燒錄器這樣就可以在省下一筆成本,但是相對的ATMEGA晶片貴了點,不知道版大是否有其他看法或方案?(抱歉,這也是我第一次碰硬體方面,所以可能有些觀念不對還忘請版大指教^^)

coopermaa 提到...

不會的,你觀念很好
如果是以成本考量的話,我推薦你用 MSP430 Launchpad: http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_(MSP-EXP430G2)

MSP430 Launchpad 可以直接走 USB 介面燒錄,不需要另外購買燒錄器。這裏有很多關於這張板子的資訊:https://sites.google.com/site/msp430launchpaddiy/home

在露天拍賣也可以買到這張板子,只要台幣 140 元而已。

鄭昆義 提到...

感謝版大提供這麼好的寶物給我^^(抱歉,前幾天無法用電腦黑,晚了大大的一番心意),這晶片竟然不用錢@@而且還可以送到家@@而且成本又低,又有記憶體,整個符合我的需求,我會先好好研究看看這顆寶物,日後若有問題,還請板大多多指教提點提點^^

coopermaa 提到...

不客氣,歡迎常來交流啊。所以你已經申請 free sample 了嗎? 還是買 Launchpad 板子?

阿獠 提到...

回坂大,我還沒開始這部分的,只是一職在收集有關資料,目前正在做RF傳輸部分,這部分會要等RF用ARDUINO測試完畢知道使用方法後,就會往用板大給的這些資料去控制RF傳輸部分^^不過版大提供了這塊成本低廉的板子,說實在的應該會考慮用這塊^^,至於要買版還是用作的要跟組員討論一下時間與成本^^用做的似乎學的東西比較多。但我們主題不再這部分是ARDUINO~只是真的沒碰過MCU霧煞煞~.~很多專有名詞還在熟識中^^所以到時可能還需版大指教指教@@

coopermaa 提到...

了解。你們在玩哪一種 RF?
Openlab Taipei (OT)目前台灣比較熱絡的 Arduino 社團(不過,OT 不只玩 Arduino,也玩 Processing, Puredata 還有很多...)

那邊人很多熱鬧
歡迎你們加入 Openlab Taipei 一起討論交流喔
http://www.facebook.com/groups/openlab.taipei/

鄭昆義 提到...

嗯嗯 ,好的 我已經申請加入了^^謝謝板大的邀請~~

鄭昆義 提到...

版大您好,有個小問題想請問一下,
非常謝謝您提供ㄉMSP430,但是最後想說不然用ATMEGA8自製一ㄍARDUINO似乎可以節省再去熟悉另一ㄍ開發環境的時間,而且ATMEGA8似乎也比較低廉,但出現一個問題,如果使用您上述方法做燒錄BOOTLODER的話,我似否也可以用這個方法來寫程式進去自製簡化版的ARDUINO呢?(簡化版沒做USB介面的傳輸的話)直接走ARDUINO的USB燒程式進ARDUINO簡化版??

coopermaa 提到...

你在擔心再學另一個 IDE 會很累嗎?
ha~ 你一定沒試過 energia,先下回去試試看:

http://dl.dropbox.com/u/10073018/energia-0006-windows.zip

阿獠 提到...

請問這是???怎麼開發環境跟ARDUINO一樣呢@@只是他是用在寫??

coopermaa 提到...

沒錯,用在寫 MSP430 Launchpad 的程式
事實上,你用 energia 來寫 Arduino sketch 也行。我從這看到的:

http://www.mcuapps.com/blog/2012/04/26/arduino-ide-for-msp430-launchpad/

阿獠 提到...

板大,這也太棒了吧= =!!,完全不用學習新的開發環境啊= = ...不過看了那則新聞似乎還有一些相容問題還沒解決@@畢竟是要相容兩種開發板的開發環境~~不過這樣既方便好多~(只是我昨天跑去買了ATMEGA8 晶片哩@@但或許有這套我剩下還有三ㄍMCU可以考慮用MPS430嚕@@晶片也不用錢,也有不少文章可找)謝謝板大提供那麼棒的消息,不過現在我先把ATMEGA做ARDUINO先試著做好看看^^希望有問題還可以麻煩您指教^^

鄭昆義 提到...
作者已經移除這則留言。
鄭昆義 提到...

抱歉,板大~上面文章的問題我解決哩所以我刪除@@,不過現在遇到這樣低問題~~
avrdude: stk500_getsync(): not in sync: resp=0x00
目前爬文中,不知板大有解決方法了嗎^^?
謝謝~

coopermaa 提到...

這有很多可能原因,不容易歸納與縮小範圍,比如:

1. baud rate 不正確 (bootloader 燒錄的 baud rate,不是 serial monitor 的 baud rate)
2. 板子沒有選正確
3. Cable 問題
4. USB Driver 版本問題

阿獠 提到...

板大,謝謝您最近幫我解說這麼多^^
我已經解決我的問題了,一開始似乎是我ㄉ線路問題,最後我也碰到0X15搞了好久,用了官網說的120歐姆的電阻也沒用,最後小的白目串了兩ㄍ500歐姆的電阻=>1K歐姆,竟然燒成功了....我在猜很多人跟我一樣的問題,說不定也可以試試看我這樣的方法,呵呵,再次感謝您的解答,日後還請多多指教

coopermaa 提到...

咦? 我有點搞混了,「阿獠 == 鄭昆義」嗎?

換電阻也可以? 真是太神奇了!
之前一位朋友也有反應類似的問題
他當時的解法是更換 FTDI driver
他說不能用 Windows 內建的 FTDI driver,一定要用 Arduino-xxxx\drivers 底下的 FTDI driver,只是換了驅動程式就 ok 了。

阿獠 提到...

恩恩 不好意思,兩個都是我啦@@抱歉,我不知為什麼,有時候那ㄍ有時候這個~.~我自己也搞混也不知道如何條,所以抱歉抱歉~~
更換DRIVER嗎??可是一開始WINDOW應該就偵測不到才對@@我是這樣,所以一開始我就安裝ARDUINO下的DRIVER了。所以我應該不是這個問題^^只是怎麼用到將近1K就可以~.~還是很疑問,呵呵

coopermaa 提到...

原來是同一個人啊,哈。不會,不要介意。

謝伯源 提到...

站長您好~

我是arduino新手一名
我幫您做了一個實驗 uno R3也是可以用雙板燒錄
我燒的晶片是ATMEGA 8
但我是用1.0.1的IDE去燒錄的

有個建議,把方法一分成兩點 因為我沒看清楚要事先上傳ISP的程式進去版子內,上面的圖片也沒有說ISP的版子上需要插著一顆晶片(圖上沒插著 以為是不用插的)

以上 感謝您的文章^^ 燒錄成功~~

coopermaa 提到...

謝謝你的資訊,讓我開心了一下我以為是幫我做了一個 Arduino UNO R3 的板子...haha~~

你的建議很好,從善如流,我已經在 ISP 板子上插一顆晶片了

yang lamb 提到...

站長好~
我也是個新手
我試著用2560 R3的板子燒一顆ATMega8A,也出現了
avrdude: stk500_getsync(): not in sync: resp=0x00
我是用0022版的IDE去燒的
我是之前是參考這個網站做的
http://nirzaree.wordpress.com/2012/03/07/make-a-standalone-atmega8-circuit/
是Driver問題???還是要1.0版IDE??
請站長指教

coopermaa 提到...

請參考一下我之前的回覆,有幾個可能原因:

1. baud rate 不正確 (bootloader 燒錄的 baud rate, 不是 serial monitor 的 baud rate)
2. 板子沒有選正確
3. Cable 問題
4. USB Driver 版本問題