2013/02/01

將Arduino Uno當做一台ISP線上燒錄器,燒錄bootloader或sketch到麵包板上的ATmega328P-PU晶片

我買了一顆ATmega328P-PU晶片,裡頭空空的,沒有Arduino的bootloader也沒有任何sketch。但我有一塊Arduino Uno R3板子,它可化身成一台ISP燒錄器;把ATmega328P-PU放上麵包板,再接上一些電子元件與線材後,便可從主機電腦透過Arduino Uno R3板、將bootloader或sketch燒錄到麵包板的ATmega328P-PU晶片裡。

我的板子是Arduino Uno R3,Arduino軟體開發環境是1.0.3 Windows版,燒錄對象是ATmega328P-PU。

本篇介紹的內容,應該也可套用到其他Arduino板子與其他型號的AVR晶片,但我也沒試過,所以此篇內容皆以我的環境為準。(我另一篇是燒錄到ATtiny85-20PU。)

若不清楚ISP是什麼意思,若想知道ATmega328P-PU的P與PU之意,請參考我寫的:Arduino與AVR微控制器相關詞彙

底下是我的板子Arduino Uno R3,其微控制器晶片是ATmega328P-PU,屬於PDIP封裝。(另有SMD版本。)


首先,要讓Uno板變成一台ISP燒錄器。很簡單,請開啟Arduino軟體開發環境,然後選File - Examples - ArduinoISP,將這支sketch,Upload(上傳、燒錄)進Uno板,如此即可,ArduinoISP這支sketch的功能就是讓Arduino板子變成一台ISP燒錄器。

底下是單獨的ATmega328P-PU晶片。


接下來,我們想要將bootloader燒錄到麵包板的ATmega328P-PU晶片裡,需要一些硬體線路,所需電子元件如下:

  • 16 MHz crystal石英晶體
  • 10K ohm電阻
  • 18~22 pF陶瓷電容,2個

也可以燒錄一般的sketch,之後將會燒錄Blink範例(閃爍LED),所以還需要底下的元件:
  • LED
  • 220 ohm電阻

底下是ATmega328晶片的腳位功能對照(328與168是一樣的),對照這張圖進行接線。


Arduino板的5V與GND接到麵包板。
ATmega328P-PU的腳位7(VCC)、20(AVCC)接到5V。
ATmega328P-PU的腳位8(GND)、22(GND)接地。





然後是16 MHz石英晶體(不分極性),兩隻腳分別接一個18~22 pF陶瓷電容後,接地。陶瓷電容不分極性。

ATmega328P-PU的腳位9(XTAL1)、10(XTAL2)接到石英晶體的兩隻腳。




然後根據ArduinoISP這支sketch定義的ISP腳位接線,

ATmega328P-PU的腳位1(RESET)接5V。

Arduino Uno板腳位10,接ATmega328P-PU的腳位1(RESET)。
Arduino Uno板腳位11,接ATmega328P-PU的腳位17(MOSI)。
Arduino Uno板腳位12,接ATmega328P-PU的腳位18(MISO)。
Arduino Uno板腳位13,接ATmega328P-PU的腳位19(SCK)。




如此便完成硬體線路了,接下來要燒錄bootloader。

Arduino Uno板以USB線連接主機電腦後,開啟Arduino軟體開發環境,先做一些設定:
  • 設定Tools - Board選為Uno。這個設定的意思是「被燒錄的對象」,但我們並不是要燒錄到Uno板子,因為Uno板使用的晶片跟麵包板上的ATmega328P-PU相同,所以選此設定,但選Arduino Duemilanove w/ ATmega328也是可行的,不過會有些差異,譬如說將燒錄不同版本的bootloader,詳情請見Arduino軟體開發環境目錄\hardware\arduino\boards.txt。如果要燒錄別的型號的晶片,就要選別的選項,甚至要動手修改boards.txt自己新增。
  • 設定Tools-Serial Port。這是Uno板連接到電腦的序列埠號。
  • 設定Tools - Programmer,選為Arduino as ISP

然後執行Tools - Burn Bootloader,便可將bootloader透過Arduino Uno板(扮演一台ISP線上燒錄器),燒錄到麵包板上的ATmega328P-PU晶片裡。

會顯示訊息Burning bootloader to I/O Board (this may take a minute)...,會花一點時間,以我的環境來說不到1分鐘。

之後會顯示Done burning bootloader.,代表成功了。只要再加上USB轉TTL序列訊號的電路(譬如SparkFun的Breakout Board for FT232RL USB to Serial),就幾乎等同於一塊普通的Arduino板子了。

相關參考資料請看Physical Computing at ITP的教學文章Setting up an Arduino on a breadboard、swf.com.tw的用麵包板組裝Arduino微電腦實驗板、Dale Wheat的How to Build an Arduino-compatible Physical Computing Platform on a Solderless Breadboard

接下來要把一般的sketch燒錄到麵包板上的ATmega328P-PU晶片裡。

有一個作法是,拔除Uno板的晶片,然後修改接線(板子的0 RX接到晶片的2、板子的1 TX接到晶片的3),這麼一來,就能跟平常一樣,Upload(上傳、燒錄)一般的sketch了。這種作法就好像是以麵包板的晶片取代Uno板的晶片。詳情請見Arduino官方網站的From Arduino to a Microcontroller on a Breadboard

上述作法,bootloader與sketch共存,就跟平常使用Arduino板子時一樣。

底下介紹的作法,燒錄sketch會蓋掉先前的bootloader。

原先的接線維持不變,Arduino Uno板仍然扮演ISP燒錄器的角色。

讓我們試著燒錄閃爍LED的sketch,先接好硬體線路,麵包板的ATmega328P-PU晶片的腳位4(就是Arduino數位腳位2),接220 ohm電阻後、接LED長腳,LED短腳接地。




開啟File-Examples-01.Basics-Blink,將sketch裡頭設定的腳位13改為2,然後執行File - Upload Using Programmer,便能將sketch透過Arduino Uno板(扮演ISP線上燒錄器)燒錄到麵包板的ATmega328P-PU晶片裡,成功的話,就能看到LED閃爍。


參考資料:

127 comments:

  1. 您好,我想詢問站長,是否有把arduino的晶片改成ATmega88P呢!?
    我有在網路上找過資料,但是照著步驟後出現
    avrdude: Expected signature for ATMEGA88 is 1E 93 0A

    Double check chip, or use -F to override this check.

    ReplyDelete
    Replies
    1. 沒有,我只試過ATmega328P-PU與ATtiny85-20PU。

      你說的按照步驟是什麼步驟?

      該錯誤訊息的意思是:每個AVR晶片都有個signature,型號不同signature也會不同,

      ATmega88是0x1e 0x93 0x0a
      ATmega88P是0x1e 0x93 0x0f

      你可從arduino目錄\hardware\tools\avr\etc\avrdude.conf查看,

      看起來,應該是你使用avrdude時,指定的是ATmega88,但實際上的晶片卻是ATmega88P,所以出現此錯誤。

      Delete
    2. http://www.morethantechnical.com/2012/04/04/bootloading-an-atmega88-for-arduino-w-code/
      我照這個網頁的步驟操作
      是不是因為沒有更改到下面這個!?
      I ended up using:
      EFUSE = 0x00
      LFUSE = 0xe2
      HFUSE = 0xdf

      Delete
    3. 在網頁裡也有說,$(ARDUINO)/hardware/arduino/boards.txt裡必須加入新板子的一些設定,也就是該微控制器型號專屬的設定,該網頁裡寫著:

      atmega88.name=ATmega88

      atmega88.upload.protocol=arduino
      atmega88.upload.maximum_size=7168
      atmega88.upload.speed=19200

      atmega88.bootloader.low_fuses=0xe2
      atmega88.bootloader.high_fuses=0xdf
      atmega88.bootloader.extended_fuses=0x00
      atmega88.bootloader.path=atmega88
      atmega88.bootloader.file=ATmegaBOOT_88_m88.hex
      atmega88.bootloader.unlock_bits=0x3F
      atmega88.bootloader.lock_bits=0x0F

      atmega88.build.mcu=atmega88
      atmega88.build.f_cpu=8000000L
      atmega88.build.core=arduino
      atmega88.build.variant=standard

      這些當然要加入,因為必須為atmega88加入適當的設定。而且,沒有上面這些東西,Tools -> Board 裡就看不到ATmega88了吧?



      Delete
    4. 我的這個步驟已經有加進去了
      所以我的BOARD的部分,也有看的到ATmega88的選項

      Delete
    5. 我再看了一次該網頁,
      他是將atmega88插在麵包板裡,接線後提供ISP燒錄器介面,根據內文,用的應該是AVR ISP MKII http://www.atmel.com/tools/AVRISPMKII.aspx。以上的硬體接線的部份,至於bootloader軟體的部份,作者也修改並準備好適用於atmega88的bootloader了。他用的是專屬的ISP燒錄器,我是使用Arduino Uno板來進行燒錄工作,不太一樣。

      bootloader燒錄到atmega88裡之後,為了讓它相容於Arduino的軟體開發環境,所以需要
      atmega88.name=ATmega88
      atmega88.upload.protocol=arduino
      atmega88.upload.maximum_size=7168
      ...
      等等這些設定,讓Arduino知道並支援atmega88,然後從電腦連接USB線、接到http://arduino.cc/en/Main/USBSerial、再接到atmega88,然後就可以跟平常一樣,燒錄sketch到atmega88裡。



      Delete
  2. 是喔,我以為用uno當成isp就可以燒錄了
    謝謝板大還花費您的時間看文章了
    結果我後來有看mcu的fuse更改,
    到時有空再來測試,可以的話,再和板大說

    ReplyDelete
    Replies
    1. 「我以為用uno當成isp就可以燒錄了」...應該是可行的,但那篇文章沒有介紹。

      Delete
  3. 請問如何清除 328上的東西
    我買的時候賣家已經有燒Bootloeder了
    我想洗掉

    ReplyDelete
    Replies
    1. 嗯,可以用ISP線上燒錄器燒錄空程式碼,bootloader就會不見了。

      Delete
    2. avrdude: Yikes! Invalid device signature.
      Double check connections and try again, or use -F to override
      this check.

      請問出現這個要怎麼解決@@
      電路都沒接錯
      燒空白程式碼出現這個

      Delete
    3. Atmel的微控制器晶片都有個識別碼(device signature),譬如ATmega328是0x1E 0x95 0x14,ATmega328P是0x1E 0x95 0x0F。

      錯誤訊息告訴我們,avrdude收到指令想要燒錄某顆晶片,可是電路裡的實際晶片卻是另外一顆,不符合,所以停止燒錄。

      Delete
    4. 在請教大大一下
      我換了一顆新的328PU一燒就成功了
      但另一顆328PU要如何救他><
      還是被我搞壞了??

      Delete
    5. 有ISP線上燒錄器就可以再燒一次吧,不行嗎?

      除非之前燒錯fuse設定,那就有可能救不回來了(或很難救)。

      Delete
    6. 謝謝大大
      線路全部重插
      就沒出現avrdude: Yikes! Invalid device signature.的問題了
      另外我在網路上找了3組程式碼各一個.c與.h檔共6個
      想燒到同一個328再接按鈕控制要用哪組程式碼輸出
      這樣可行嗎 有什麼需要注意的嗎
      不好意思又要麻煩大大@@

      Delete
    7. 線路全部重插就沒出現Invalid device signature,嗯,怎麼會,真奇怪。

      呃,應該可以。將三份程式碼的setup與loop改名,另寫一份程式讀取按鈕狀態,執行相對應的setup與loop。需將全部程式編譯後連結成一塊,...etc...etc...

      只是空想而已,沒做過。

      Delete
  4. 我又來請教大大了
    如果有數個檔案是一個接一個燒進IC就好嗎
    會不會把之前燒的的蓋掉啊= =

    ReplyDelete
  5. 葉大
    請問有辦法用UNO燒.hex檔到MCU嗎

    ReplyDelete
    Replies
    1. 將Arduino Uno當做一台ISP線上燒錄器,燒錄bootloader或sketch到麵包板上的ATmega328P-PU晶片
      http://yehnan.blogspot.tw/2013/02/arduino-unoispbootloadersketchatmega328.html

      參考一下吧。

      Delete
  6. 葉大你好
    我是用ATmega328P的晶片,使用8Mhz的內部震盪器
    我已經把程式燒進去了,但在最後出現下列這段:
    --------------------
    avrdude: verifying ...
    avrdude: verification error, first mismatch at byte 0x010a
    0x68 != 0x60
    avrdude: verification error; content mismatch
    avrdude: Send: Q [51] [20]
    avrdude: Recv: . [14]
    avrdude: Recv: . [10]

    avrdude done. Thank you.
    -----------------------
    不僅如此,我用Blink指定在pin13但她都在pin0閃
    請問如何解決??
    謝謝

    ReplyDelete
    Replies
    1. 錯誤訊息我沒看過。
      你是使用Arduino IDE進行燒錄吧,照理說震盪頻率不同的話,必須修改fuse的設定值,應該也要修改f_cpu的設定。但我沒試過orz。

      如果上述地方有問題的話,那麼後續在哪個腳位閃爍,也就不能當真了。

      我建議您先使用外部的16 MHz crystal石英晶體吧。

      Delete
    2. 謝謝你的回覆
      我的確是用Arduino IDE 版本是1.0.5版
      我是用這個http://arduino.cc/en/Tutorial/ArduinoToBreadboard去試作的
      至於16 MHz crystal石英晶體因為我手邊沒有,所以我才用他的內部震盪器看看結果怪怪的 T.T
      總之謝啦~~

      Delete
  7. 請問有辦法將現成的hex檔
    直接燒錄ATMEGA8-16U裡嗎?

    ReplyDelete
    Replies
    1. 使用燒錄程式avrdude,自己下指令與參數進行燒錄。

      Delete
  8. 你好
    請問為什麼我在燒錄bootloader的時候
    會顯示avrdude: stk500_getsync(): not in sync: resp=0x00錯誤
    謝謝

    ReplyDelete
    Replies
    1. 這個錯誤訊息可代表很多種意義,主要是因為燒錄工具與開發板微控制器晶片裡的bootloader無法溝通所導致。

      請確認板子與序列埠的設定是否正確,驅動程式是否安裝成功,試著重新啟動Arduino,試著插拔USB連接線,試著使用別的USB埠,試試看使用額外的USB集線器,也有可能是擴充板與腳位0與1(RX、TX)起衝突;也可試試加入重置鈕,在atmega328p的腳位1連接一個按壓式開關、開關的另一腳接地,在燒錄時,試試看在各個時間點按下重置鈕。

      Delete
  9. Anonymous18/8/14 01:08

    請問Arduino Uno的 ATmega328P-PU可當ISP燒錄器,
    Arduino Nano的ATmega328是不是也可以當ISP燒錄器?

    ReplyDelete
    Replies
    1. 照理說應該可以。
      但我沒有Nano板子。

      Delete
    2. Anonymous18/8/14 08:21

      我試過Nano真的可以,
      用小盒子裝起來再拉線出來,
      這樣燒錄會方便多了.
      因為2560跟Uno都太大塊了!

      Delete
    3. Great. 多謝回報。

      Delete
    4. 請問一下
      燒完後的Mega328可以不接arduino的板子使用嗎??

      Delete
    5. 請參考
      在麵包板上建構Arduino(ATmega328P加USB轉TTL Serial轉接卡)
      http://yehnan.blogspot.tw/2013/09/arduino_9.html

      Delete
    6. arduino Mega328燒完程式之後
      可以把Mega328單獨拔出來用嗎??
      還是一定要接arduino才能有功能
      (抱歉 新手 很多問題需要請大大幫忙)

      Delete
    7. 可以。但你就沒有Arduino Uno板子上的其他功能,譬如USB轉TTL Serial,穩壓器,等等。

      還請參考拙作
      Arduino輕鬆入門:範例分析與實作設計
      http://yehnan.blogspot.tw/2014/02/arduino_21.html

      Delete
  10. 葉大大 你好
    我是個剛碰這類東西的新手,最近想說要來動手做個東西,想要做可以燒錄89S51的電路
    不知道ARDUINO AS ISP 可不可以燒?? 我自己試著接接看都不能順利燒錄,我是用AVRDUDE指令測試的,avrdude.conf檔我也有加上這個網站(http://www.avrfreaks.net/forum/writing-at89s52-through-usbasp)上說的東西

    另外網路上有看過 可以用 ATMEGA8 這顆晶片來燒程式做成ISP(但我手頭上買的時候買成ATMEGA328P)
    而這個網站(http://www.fischl.de/usbasp/)上也有附CODE 和.hex檔
    不知道有沒有什麼方法可以將裡面的code compiler 程可以for ATMEGA328P

    希望大大可以提點一下 感謝!!

    ReplyDelete
    Replies
    1. 不可以。
      89S51是8051(MCS-51)架構,Arduino的單晶片是AVR架構(ATmega168、ATmega328)。ARDUINO AS ISP只能燒AVR架構。

      http://www.avrfreaks.net/forum/writing-at89s52-through-usbasp使用的燒錄器是USBasp。

      照理說,ATmega328P是ATmega88的更高階版本,所以應該重新編譯即可。
      不過燒錄是低階動作,http://www.fischl.de/usbasp/裡的程式碼可能會含有專屬於ATmega88的腳位定義、時序、特別的設定,雖然理論上應可行,但實際上可能會碰到許多需要修改的地方。

      Delete
  11. 請問石英震盪器如果不接會有什麼問題嗎?
    還有我看到有的電路把VCC和GND並聯一顆0.1uf的電容,請問作用是什麼?

    ReplyDelete
    Replies
    1. 不接應會使用晶片內部的震盪器,我記得atmega328p內建的是8MHz吧,但還要設定正確的fuse。

      該電容有助於穩定電源。

      Delete
  12. Anonymous6/7/15 16:50

    原文章:開啟File-Examples-01.Basics-Blink,將sketch裡頭設定的腳位13改為2,然後執行File - Upload Using Programmer,便能將sketch透過Arduino Uno板(扮演ISP線上燒錄器)燒錄到麵包板的ATmega328P-PU晶片裡,成功的話,就能看到LED閃爍。
    疑問之處:然後執行File - Upload Using Programmer. 是否應為:然後執行Sketch - Upload Using Programmer
    謝謝!

    ReplyDelete
    Replies
    1. 因為Arduino IDE改版,所以變了。

      Delete
  13. 您好
    我依照您的方法將bootloader燒入ATMEGA328P-AU裡
    並用UNO的板子將Blink的範例sketch燒進我的板子上
    看起來sketch有運作成功
    但是奇怪的是我只能燒一次sketch
    接下來要燒就會出現錯誤訊息

    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x55

    然後就要重燒bootloader才能在燒一次sketch

    請問您有遇過這種情形嗎

    ReplyDelete
    Replies
    1. 你說的說,是用本篇介紹的「UNO板子當做ISP線上燒錄器」來燒嗎?
      若如此,燒錄sketch的話會蓋掉bootloader。

      當你燒完bootloader後,請改用一般的燒錄方式來燒路sketch。

      Delete
    2. 感謝您的回覆
      剛剛發現原來是reset沒接到
      所以造成燒code時沒有反應
      將reset接上UNO後就能正常燒code了~~

      Delete
  14. 您好,
    我使用ISP線上燒錄器燒錄程式後,
    發現RX腳位好像有點問題,
    MCU會接收不到資料,可是TX是沒有問題的。
    請問您有發生過類似問題嗎?

    ReplyDelete
    Replies
    1. 大大救命啊

      我按你的'方法出現
      avrdude: Yikes! Invalid device signature.
      Double check connections and try again, or use -F to override
      this check.

      版上與新ic 同型號

      請問如何解決



      Delete
    2. 你確定IC型號相同?Atmel的微控制器晶片都有個識別碼(device signature),譬如ATmega328是0x1E 0x95 0x14,ATmega328P是0x1E 0x95 0x0F。
      兩者雖然照理說一樣,僅差在picoPower技術而已(較省電)。

      錯誤訊息告訴我們,avrdude收到指令想要燒錄某顆晶片,可是電路裡的實際晶片卻是另外一顆,不符合,所以停止燒錄。

      若你的是ATmega328,有個解決辦法,請見http://www.instructables.com/id/Bootload-an-ATmega328/step6/ATmega328-PU-workaround/,但不保證沒有後遺症。

      Delete
  15. This comment has been removed by the author.

    ReplyDelete
  16. 葉大您好
    有幸拜讀了這篇文章後,有個不成熟的問題想請教:
    請問能用Arduino去燒錄89s52嗎?

    (目前有些小型應用在考量要採用PIC or Atmel,但基於未來希望能進軍MSP430 or STM32系列的32bit mcu所以希望能從atmel開始學習)

    ReplyDelete
    Replies
    1. 沒試過。

      不過網路找一找,還是有人做出來了。
      http://www.instructables.com/id/ARDUINO-AS-A-8051-PROGRAMMER/

      https://tiktakx.wordpress.com/2012/03/21/using-an-arduino-to-program-at89s52/

      http://www.wdong.org/wordpress/blog/2012/07/04/programming-at89s52-with-arduino/

      Delete
  17. 請教一下,如果燒錄完之後的atmega328,的接法,驅動LED,是跟你blog一樣接法嗎?
    現在有一個問題是Arduino是如何提供3.3跟5V?

    ReplyDelete
    Replies
    1. 這篇部落格最後,有燒錄LED閃爍的sketch,驅動atmega328實體腳位4(對應到Arduino數位腳位2)的LED。

      Arduino板子上有3.3V與5V的腳位插孔。

      Delete
  18. 請教一下atmega168可以適用嗎?

    ReplyDelete
    Replies
    1. 應該可以,但我沒真正試過。

      在這一篇的「設定Tools - Board選為Uno。」的地方,已經註明了「如果要燒錄別的型號的晶片,就要選別的選項,甚至要動手修改boards.txt自己新增。」

      我想設為「Arduino Diecimila or Duemilanove w/ ATmega168」應該就可以。

      再強調一次,我沒真正試過。

      Delete
  19. Arduino:1.6.5 (Windows 8.1), 板子:"Arduino Duemilanove or Diecimila, ATmega168"

    草稿碼使用了 4,420 bytes (30%) 的程式存儲空間。最大值為 14,336 bytes。

    全域變數使用了 319 bytes (31%) 動態記憶體,剩餘 705 bytes 的局部變數。最大值為 1,024 bytes 。

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x63

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x63

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x63

    avrdude: stk500_recv(): programmer is not responding

    上傳到板子時發生問題。可行建議請見http://www.arduino.cc/en/Guide/Troubleshooting#upload。

    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x63

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x63

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x63

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x63

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x63

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x63

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x63

    發生這樣的錯誤@@

    ReplyDelete
    Replies
    1. 此錯誤的原因很多,請參閱
      http://yehnan.blogspot.tw/2014/10/arduinostk500getsync-not-in-sync.html

      Delete
  20. 我試了,成功了,我試用新版的IDE,但有一個疑問是,我每燒錄一次都要重新燒錄給我那個ISP板子一次ISP Code嗎?

    ReplyDelete
    Replies
    1. 什麼意思?

      你是說ArduinoISP嗎?燒錄一次即可。

      Delete
    2. 意思就是 因為你說我燒入一次sketch,會覆蓋Arduino ISP板,那這樣之後要再燒其他程式碼,還要再稍一次ISP Code嗎?

      Delete
    3. 看不懂。

      > Arduino ISP板
      > ISP Code
      這些是什麼?

      Delete
    4. 打錯 是會覆蓋掉ArduinoISP code ,所以假設我要再從我的那塊板子燒到另一個晶片,就要再稍一次example裡面的 ArduinoISP Code嗎?

      Delete
    5. ArduinoISP也是Arduino的sketch。你不燒錄另一份sketch,就不會覆蓋掉。

      Delete
    6. 懂了,感謝您!

      Delete
  21. http://programmermagazine.github.io/201405/htm/article1.html 我是用這個網站XD!

    ReplyDelete
  22. This comment has been removed by the author.

    ReplyDelete
  23. This comment has been removed by the author.

    ReplyDelete
  24. 您好,

    目前計畫自製Arduino UNO開發平台,請問新買之ATmega328P-PU與Atmega16U2是否需先燒入bootload

    感謝幫忙!!!

    ReplyDelete
    Replies
    1. 單獨買ATmega328P-PU與Atmega16U2的話,裡頭照理說應該沒東西,需自己燒錄,除非賣家特別說明。

      Delete
    2. 您好,

      以ATmega328P-PU而言,可用您書中之CH12所授之方法(或是本文之內容)燒入bootload;請教Atmega16U2該如何燒入bootload,並且該到何處取得欲燒入之file...

      感謝幫忙!!!

      Delete
    3. 請參考
      http://yehnan.blogspot.tw/2013/08/arduino-unousb.html

      Delete
    4. 您好,
      請問該文之燒入bootload to Atmega16U2的方法,也適用於將被燒入之Atmega16U2是空白的(新買的)情況下嗎...
      (文中之例子,在燒入"Arduino-keyboard-0.3.hex" 前,應該已存在 "Arduino-usbserial-atmega16u2-Uno-Rev3.hex"。)

      另外請教,在燒入Atmega16U2之bootload前,ATmega328P-PU是否需先燒入bootload...

      感謝幫忙!!!

      Delete
    5. 嗯,我回答的有錯。
      根據官網http://www.atmel.com/devices/ATMEGA16U2.aspx的文件http://www.atmel.com/Images/doc7618.pdf

      16U2出廠時應已內建bootloader,與電腦的USB埠連接並溝通,便可使用Atmel的Flip軟體進行燒錄。

      Arduino Uno板子上的16U2,預設會燒錄Arduino-usbserial-atmega16u2-Uno-Rev3.hex,作為電腦USB埠與328P之間的溝通管道(轉換USB與序列介面)。

      如果要燒錄16U2的bootloader,應該要有另外的燒錄器;我沒試過。

      > 在燒入Atmega16U2之bootload前,ATmega328P-PU是否需先燒入bootload
      兩者無關吧。

      Delete
    6. 您好,
      若是我買的Atmega16U2已內建bootloader的話,是否就可使用您文中教授的方法,使用Atmel Flip燒入 "Arduino-usbserial-atmega16u2-Uno-Rev3.hex"

      感謝幫忙!!!

      Delete
  25. 瞭解,感謝指導。

    ReplyDelete
  26. 我用QPF32轉DIP28 我bootloader跑出結果成功 但我上傳程式沒有反應 為什麼?

    ReplyDelete
  27. 是因為我的轉接座 插錯嗎?

    ReplyDelete
  28. 可以將這個燒在89S51晶片嗎?

    ReplyDelete
  29. 請問葉大,是否可以將328P的內容讀出後再轉燒製另一顆328P?

    ReplyDelete
    Replies
    1. 可以。使用avrdude的話,指令大概如下:

      $(AVRDUDE) $(PROGRAMMER) -p $(DEVICE) -U flash:r:flashdump.hex:i

      Delete
    2. 感謝回答,再請教您,可以在Arduino UNO R3直接作讀取嗎? 若可以直接讀取,在讀取之後改如何將讀出的HEX燒到空IC中??
      再次感謝

      Delete
    3. 可以。

      空IC? 裡頭沒有bootloader的話,要用燒錄器。
      同樣用avrdude指令進行燒錄。

      Delete
    4. 請教葉大,我們可以將Arduino Uno當成USBAsp使用嗎,若可以的話該怎麼去設定,
      指令這樣下是否正確?
      avrdude -q -c USBAsp -p atmega328p -U flash:r:flashdump.hex:i

      感謝

      Delete
    5. 這篇不就是把Uno當做ISP燒錄器嗎?

      指令我不熟,請照這篇的作法,觀看Arduino IDE下avrdude指令時,設定了哪些參數。

      Delete
  30. 請問燒錄之後clock還是一樣嗎?
    我燒錄之後的delay1000不是一秒,是我電路接錯了嗎

    ReplyDelete
    Replies
    1. > clock
      沒改,當然一樣。

      > 接錯了嗎?
      不知道。

      Delete
  31. 我使用您教的第2種方法
    燒錄完後,LED會閃爍,但是閃爍建隔不是一秒,請問是正確的嗎

    ReplyDelete
    Replies
    1. 不正確。

      震盪器的頻率錯了?

      Delete
    2. 16.000M沒錯
      不過我用的是石英震盪子不是石英震盪器會有差別嗎?

      Delete
    3. > 石英震盪子不是石英震盪器
      請問這兩者有何差別?

      你的零件,跟這一篇都相同嗎?ATmega328P?電容?
      你用哪一版Arduino IDE?
      程式裡,有無更改設定頻率?
      閃爍間隔不是一秒,那是幾秒?

      Delete
    4. 版本是1.6.11
      我用ATMEGA328P-PU 電容:22pf
      程式部分都沒變動,只有把腳位13改成2!
      我等等換成石英震盪器試試看~

      Delete
    5. 你說的是Resonator與Oscillator之分吧,
      要用Oscillator才對。

      Delete
    6. 我是用震盪器
      check很多次了
      只有把pin13改pin2
      delay維持1000
      實際delay大概12秒

      Delete
    7. 嗯,fuse設定大概是使用atmega328p內部的時脈頻率1MHz吧,
      若果真如此,需要修改fuse設定才行。

      到http://www.engbedded.com/fusecalc
      取得正確的fuse設定值,
      使用avrdude燒錄,修改fuse。

      Delete
    8. 好~
      謝謝你~

      Delete
    9. 我也遇到一樣的狀況....只是我用28PINS的atmega328P-PU燒錄一切正常....使用TQFP32的atmega328P-AU就變成時脈很慢(應該就是設定到內部時脈)

      Delete
  32. 請教一下,能在Arduino IDE中設定燒錄的FUSE值嗎?
    如果是更改avrdude.conf?
    謝謝

    ReplyDelete
    Replies
    1. 呃,應該可以。設定值在boards.txt裡。
      不過隔了Arduino IDE,不知道它執行avrdude時,會下什麼參數。

      建議還是自己執行avrdude。

      Delete
  33. Anonymous9/11/16 21:25

    想請問:
    "燒錄sketch會蓋掉先前的bootloader",這樣的作法跟兩者都存在有什麼差異?

    ReplyDelete
    Replies
    1. 有bootloader的話,就能用一般的燒錄方式燒錄sketch,不需要特別的燒錄器。

      Delete
  34. 請問"有bootloader的話,就能用一般的燒錄方式燒錄sketch,不需要特別的燒錄器。"

    那後續要用甚麼工具,對哪些腳位才能進行sketch燒錄呢?

    ※因為想挪掉uno ISP燒錄的方式

    ReplyDelete
    Replies
    1. 把bootloader放進atmega微控制器晶片後,
      再加上【usb轉序列埠】的產品,就等同於一般的arduino板子。

      請參看
      http://yehnan.blogspot.tw/2013/09/arduino_9.html

      Delete
  35. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. 葉大您好:
      請問一下bootloader及sketch是兩者必須都燒進去空白的atmega328P-PU才能脫離Arduino板獨立工作嗎?!
      還是如果空白的atmega328P-PU燒sketch也可以獨立工作呢?!

      因為葉大這篇上面有寫說"燒錄sketch會蓋掉先前的bootloader"
      那這樣也就是表示空白的atmega328P-PU直接燒sketch也可以脫離Arduino板獨立工作嗎??。
      謝謝

      Delete
    2. > bootloader及sketch是兩者必須都燒進去空白的atmega328P-PU才能脫離Arduino板獨立工作嗎?!
      > 還是如果空白的atmega328P-PU燒sketch也可以獨立工作呢?!
      什麼叫【獨立工作】?

      > 因為葉大這篇上面有寫說"燒錄sketch會蓋掉先前的bootloader"
      > 那這樣也就是表是空白的atmega328P-PU直接燒sketch也可以工作嗎??。
      yes.

      Delete
  36. 獨立工作就是把燒好的atmega328P-PU當成一般IC,焊在洞洞板上執行程式,而不是在Arduino板工作這樣。

    ReplyDelete
    Replies
    1. > bootloader及sketch是兩者必須都燒進去空白的atmega328P-PU才能脫離Arduino板獨立工作嗎?!
      燒完sketch後,就可以獨立工作。

      > 還是如果空白的atmega328P-PU燒sketch也可以獨立工作呢?!
      yes.

      Delete
    2. 嗯嗯,那我了解了,因為剛接觸所以搞不太懂這兩種是擇一燒入,還是兩種都要燒入才可以這樣。
      謝謝葉大,那有其他異常問題在來請教您了。

      Delete
    3. 出現
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x9d
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x9d
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x9d
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x9d
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x9d
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x9d
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x9d
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x9d
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x9d
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x9d
      Problem uploading to board. See http://www.arduino.cc/en/Guide/Troubleshooting#upload for suggestions.
      如何解決?

      Delete
    4. 請參考
      http://yehnan.blogspot.tw/2014/10/arduinostk500getsync-not-in-sync.html

      Delete
  37. 葉大請教目前用uno燒錄bootloader進Atmega644PA晶片順利也成功,後續透過USB-TTL方式也可順利上傳sketch至644晶片內,有需要再額外設定fuse的問題嗎?

    因為目前卡在同一組code在uno可正確執行(pin3發射),但在atmega644pa晶片上(改pin9發射),會有點狀況(接收端不動作)。

    ReplyDelete
    Replies
    1. > 有需要再額外設定fuse的問題嗎?
      既然都可上傳且執行了,應該沒有。但我也沒玩過644,不確定。

      > 改pin9發射
      呃,為什麼是9?
      請參看 https://github.com/z3t0/Arduino-IRremote 做修改。

      Delete
    2. 感謝提醒,已解決....原來接腳錯誤,是14pin

      Delete
  38. Anonymous7/5/17 17:38

    你好
    我在燒錄bootloader實也會發生

    avrdude: Device signature = 0xff00ff
    avrdude: Expected signature for ATmega328P is 1E 95 0F
    Double check chip, or use -F to override this check.

    但是我參考https://forum.arduino.cc/index.php?topic=420070.0
    14樓的方法卻可以
    不清楚甚麼原因

    ReplyDelete
  39. 你好我在大陸買了6軸機器人是nano mega328p主板前陣子不知道什麼原因bootloader是乎被破壞掉對方有給我一個bootloader.hex檔請問我要如何將這個bootloader.hex燒到主板

    ReplyDelete
    Replies
    1. 首先需要一台燒錄器,例如本篇的作法,或是買一台,例如http://yehnan.blogspot.tw/2013/09/avr-ispadafruit-usbtinyisp.html

      然後,到Arduino目錄底下,找出你那塊主板所使用的bootloader檔案,換成你得到的新檔,然後燒錄。

      Delete
  40. This comment has been removed by the author.

    ReplyDelete
  41. 請問一下
    我將程式以燒錄器上傳至atmega328p成功以後
    想要觀察他的序列埠狀態該如何觀察?
    直接點取好像仍然是原先arduino

    ReplyDelete
    Replies
    1. 假定你是按照這篇的作法。上傳至atmega328p成功以後,

      但你的atmega328p與一般的uno板,還差一個重要元件「usb轉序列埠」,
      你的電腦的usb埠 接 usb線 接到 usb轉序列埠 接到 atmega328p的TX/RX。

      請參考
      http://yehnan.blogspot.tw/2013/09/arduino_9.html

      Delete
    2. 您好 我在露天看usb ttl的模組
      想問一下cp2102可以用嗎? 還是一定要用FTDI

      Delete
  42. 老師好,與您請教

    我目前是使用一個 Arduino Uno R3 當作燒錄器,對空白的 ATmega328P 進行燒錄

    我疑惑的點在於,若 ATmega328P 裡面不燒 Arduino 的 Bootloader,選擇直接將程式碼燒錄至空白的 ATmega328P ,除了無法使用 USB to Uart 的方式進行程式碼的燒寫之外,與有燒寫 Bootloader 的 ATmega328P 有什麼不同之處嗎?

    我原本以為沒有燒寫 Bootloader 的話,就無法使用 digitalWrite 等等的 Arduino 函式,但我後來想到這些函式的定義在編譯程式碼的過程中就會被 include 進來,所以沒這問題

    那我就疑惑了,好像除了不能用 Uart 燒寫程式碼以外,沒什麼不同之處

    PS: 或許我可以查看看 Arduino 的 Bootloader 裡面做了哪些暫存器設置,這樣就能知道有/無 Bootloader 的 ATmega328P 有哪些預設值被改變 !?

    ReplyDelete