Search

2011年6月19日 星期日

DIY Arduino - 將Bootloader寫進ATMega晶片!(3)

因為這兩天產能低下沒作到什麼事,所以就寫完這最後一篇好了,來完成承諾XD

事實上所謂的Arduino指的其實是它的Bootloader跟Compiler,至於Bootloader的功用簡單來說就是你不用直接去寫AVR的Assemble,用搭配的Compiler寫C/C++就可以透過它的Interface去控制ATMega了,許多做控制板的公司也都早就使用這種概念,主要是簡短一般的開發時間而且方便教學,但需要優化或是要寫複雜的演算法可能就比較不足,電路只要用能剛好驅動ATMega晶片即可(官方網站的麵包板版本就是),要怎麼layout電路就是看個人喜好了,不過官方有個COM Port的標準版本可以參考,就稱它為官方標準版本好了。


首先先取得Arduino的IDE,有Windows、Linux、MAC OS X跟Source Code可以選擇需要的來用:http://arduino.cc/en/Main/Software

接著下面三個方法選擇一種即可,不過只有前兩種我有測試成功,但是第三種按照官方步驟不曉得Parallel Port有問題還是我方法錯誤,使用前兩種方法你必須已經有了有燒錄Arduino Bootloader的ATMega晶片的板子!


先將你有燒錄Arduino Bootloader的晶片的板子接上電腦並打開Arduino IDE,接著選擇 File -> Examples -> ArduinoISP會跳出新的視窗。

然後按下新視窗很像播放鍵的按鈕,然後下方會提示完成編譯。




接著按下Upload將編譯好的程式上傳到Arduino,就算完成接下來第一跟第二個方法,將現有的Arduino當成ISP的前置步驟了。




接著如果你自己製作了官方標準版本可以將要燒錄的ATMega晶片放到上面,可以照著下面接線圖跟已經可以當成Arduino ISP的Arduino接上線,圖片下面那張板子是你剛剛Upload進能將Arduino當成ISP的板子,所以它依然是接著電腦的。




或者你製作的是精簡板的可以將想要燒錄Arduino Bootloader的ATMega晶片放到麵包板上,然後按照下圖的接線跟已經Upload進能將Arduino當成ISP的板子連接,一樣這張當成ISP的板子要接上電腦,這系列的製作是用這種方法將Bootloader燒進晶片的。


使用此方法要在RTS加一個10uf~100uf的電容與GND串接



上面兩種方法選一種接完線之後,就在Arduino IDE選擇需要的Bootloader版本燒錄吧,建議選擇最新的UNO版本即可!



然後選擇w/Arduino as ISP寫入。



最後完成時會出現完成的訊息,這時就可以開始測試Arduino了!!!



另外如果你沒有Arduino的板子時要怎麼燒進Bootloader呢?一個方法是用AVR的ISP燒錄裝置將.hex檔案燒進ATMega晶片,但這樣一個裝置市面上賣的都超過七八百元,所以官方也有提供用Parallel Port接線DIY的方法,這個方法我有嘗試但是失敗,不過我想可能是我的Parallel Port壞了,因為我的COM Port也一樣有問題,所以沒辦法做太多說明可以直接看這裡:http://www.arduino.cc/en/Hacking/ParallelProgrammer

=============2012/02/07===============

和LCW大大討論AutoReset的結果後去找了文章,有興趣的可以參考官方這篇:http://www.arduino.cc/playground/Learning/AutoResetRetrofit

=============2012/04/15===============

根據同學的實驗確實如果FTDI模組有拉出或是自己拉DTR腳位,接上一個104P的陶瓷電容(沒陶瓷電容會失敗)然後再接上Arduino的Reset腳位就可以Auto Reset成功。

31 則留言:

  1. 你好!

    請問如果要以麵包板來做,燒完Arduino Bootloader之後要如何將

    程式Upload進去?

    回覆刪除
  2. 如果你單純說有燒Arduino Bootloader的Atmega328的晶片要怎麼把寫好的程式燒進去很簡單,首先你一樣就這個電路http://dl.dropbox.com/u/16634624/BreadboardAVR.png 除去官方版上的黃色跟綠色線還有紅色5V跟黑色接地,接著找一個FTDI模組然後把FTDI的5V還有接地插到同樣那個電路的麵包版上(等於取代原本那個官版Arduino供給給麵包版那兩條),接著再"把FTDI的RxD接到Atmega328的TxD"然後"TxD接到Atmega328的RxD",接著上傳程式的時候看到FTDI模組的燈在發光時按一下麵包版的按鈕手動Reset就會成功了(要多試幾次)

    回覆刪除
  3. 感謝你的答覆,還有個問題想請教的是

    如果用IC夾將母板的Atmega328夾出,然後將燒完Bootloader的晶片換進

    母板,Upload程式再移至麵包板上可不可行?

    是否還缺什麼步驟?

    回覆刪除
  4. 可以,但是這樣很麻煩XD

    而且在我會自製這種分離模組之前我有這樣試過,但是有一次拔IC不小心凹斷一隻腳Atmega328就報銷了ORZ

    回覆刪除
  5. hi~你好!

    先感謝你先前的回答XD

    我最近就照上面的方法,將設備插在麵包版,原本想說用IC夾去夾

    Atmega328再Upload程式,如你所說她真的有夠難夾...

    所以就去買了一組 FTDI 回來Upload,但是在傳完Blink的時後

    雖會顯示成功但是Pin13就是不動,腳位也都沒錯..

    方才又回來這裡看到你最後一段話"接著上傳程式的時候看到FTDI

    模組的燈在發光時按一下麵包版的按鈕手動Reset就會成功了(要

    多試幾次)" 試過2次,終於成功!!

    我好奇的是為什麼在傳的過程中需要手動Reset??

    回覆刪除
  6. 照理說你用你買得Arduino板子去UPLOAD程式不用在手動Reset,除非你是想把程式上傳到放在麵包版且燒有Arduino Bootload的ATMega328才要手動Reset。

    回覆刪除
  7. 你好!

    我是將它獨立在麵包版上了,並用FTDI模組跟電腦連結,但是必須在傳的過程

    手動Reset。

    目前想試著做出自動Reset的功能, GCY大大不知道你是否有研究這方面的

    方法可以讓在下參考 感謝!!

    回覆刪除
  8. 之前想研究AutoReset不過一直沒時間,不過你可以看標準板子上多出來的元件(和簡易版相比之下)去著手吧,我也不是電子專門所以這是個人猜測。

    回覆刪除
  9. 你好!
    最近有看到auto reset的教學文章,從FTDI模組的DTR腳位,拉一條線出來 接上104P的陶瓷電容 在接到atmega 328p的 Pin1(reset)這樣就會auto reset了

    (DTR)>>(104p陶瓷電容)>>atmega 328p Pin1

    回覆刪除
  10. 原來如此,可惜我的FTDI是人家黏好只有給我四個腳位的,應該要單買FTDI晶片來自己弄才對。

    回覆刪除
  11. 不好意思~我想請問各位大大們~我用FTDI模組上傳程式時~都會出現這個錯誤(avrdude: stk500_getsync(): not in sync: resp=0x00),也照妳們的方式接電路~但一樣還是不行~麻煩各位大大們回覆我一下~謝謝!!!

    回覆刪除
  12. 不知道是FTDI驅動的問題???因為我的FTDI模組一插上電腦~就自己會去灌驅動了~我連灌都還沒灌就已經可以用了~只是一直出現那個錯誤~在麻煩大大們回答一下~謝謝!!!

    回覆刪除
  13. 如果你線都確定接正確那你可能沒有Reset,要就手動不然就是你的FTDI模組有DTR腳位接到0.1u的陶瓷電容再接到atmega 328p Pin1讓它auto reset,如果還是不行可能就是你的atmega 328p有問題。

    回覆刪除
  14. 可是~我這顆atmega 328p放在uno板子上~就可以上傳程式~但只要一拆下來放在麵包板用FTDI模組上傳程式~就會出現那個錯誤~另外你說的Reset方法(手動與自動)~我都試過了!!一樣還是不行~所以想請教妳們說~妳們的FTDI模組~有灌驅動嗎?還是一接電腦就自動幫你灌好了?那如果是灌別的驅動~可以給我驅動程式嗎?
    麻煩大大們回覆~謝謝!!!

    回覆刪除
  15. 大大們~終於可以了!!!真的是石英震盪器的問題~換成用16MHz的震盪器~就可以燒錄了~我昨天才買FTDI的IC,自己接電路弄~~~昨天跟今天弄了兩天~腦子都快被燒壞了!!!

    回覆刪除
  16. 恭喜!如果要用其他頻率要設定。

    回覆刪除
  17. 謝謝大大喔~如果我有其他問題在詢問您~~~謝謝!!!

    回覆刪除
  18. 請問版主
    如果在燒錄過程中遇到這個問題該怎麼辦
    (我們用的是ATMega8)

    avrdude: stk500_getsync(): not in sync: resp=0x15

    回覆刪除
  19. HI,能說明一下你用哪種方法呢?

    回覆刪除
  20. 嗯 我們是用arduino版子(Arduino Duemilanove ATMega328) 接ATMega8 然後reset腳 接110歐姆的電阻到 5V

    回覆刪除
  21. 你要照這張圖接

    http://dl.dropbox.com/u/16634624/arduinoisp.png

    然後bootloader版本選擇Duemilanove看看

    回覆刪除
  22. 版主你好
    我們是用這種的接法
    http://dl.dropbox.com/u/16634624/BreadboardAVR.png

    然後 Board 那裡是選 Arduino Duemilanove or Nano w/ ATMega328

    但還是會出現那行錯誤耶

    回覆刪除
  23. 你把晶體振盪器換一個看看,不然直接找陶瓷振盪器替換,我以前DIY Arduino有遇過振盪器故障的問題。

    回覆刪除
  24. 謝謝版主的回覆
    嗯 換了也是一樣 真的用不好
    我試試看您貼的兩塊版子的方法好了

    回覆刪除
  25. 用兩塊版子的方法成功了
    http://dl.dropbox.com/u/16634624/arduinoisp.png
    照這樣接如果不行 可以試試在有ISP那塊的 5V跟RESET中間接一個100-110歐姆的電阻

    然後要燒ATMega8 Board好像不能選Arduino Duemilanove ATMega328
    我用下面那篇文章那個就可以了
    http://www.geek-workshop.com/forum.php?mod=viewthread&tid=174

    謝謝版主提供的方法!!

    回覆刪除
  26. 原來如此,我都是用ATmega328P-PU實驗的。

    回覆刪除
  27. 作者已經移除這則留言。

    回覆刪除
  28. 我想問一下燒入Bootloader後d13腳的led會不會閃?

    回覆刪除
  29. 您好 請問一下 2560的晶片是否也是一樣的做法呢?
    我照您的方法做 結果失敗了....
    錯誤代碼avrdude: stk500_getsync(): not in sync: resp=0x00
    com port看過是沒問題的
    我是用arduino mega2560當做ISP
    對我自己做的電路板(上面是2560晶片)做燒錄
    我是將mega板的53腳接我電路板的RESET
    52腳接我電路板的SCK
    51腳接我電路板的MOSI
    50腳接我電路板的MISO
    電路板上的電源也是從mega板上接過去的
    mega板有先燒錄EXAMPLE的ISP範例
    Tools->programmer裡也有選Arduino as ISP
    Tools->Board裡是選Arduino mega2560(我是希望自己做的板子可以兼容Arduino)
    請問步驟是否有誤呢?

    回覆刪除
  30. 請問有辦法將現成的hex檔
    直接燒錄ATMEGA8-16U裡嗎?

    回覆刪除
  31. 您好請教一下, Arduino的控制方法是, 使用本身IDE所轉出來的語言去抓ATmega328 ROM內的Bootloader, 之後再翻譯成ATmega晶片看得懂的二進制機器語言進行對IO的操作, 請問這樣的觀念對嗎?

    回覆刪除