2012年10月31日 星期三

(前言與簡易教學)Uploading Sketch to Arduino ATmega 2560 via AVRISP mkII

最近在工作上遇到了一些有關於 Arduino  ATmega 2560 的困擾,
本篇先行闡述工作遇到的問題狀況,以及改進問題的方法。


遇到的狀況有:

1.  晶片 FUSE 裡的   SPIEN 鎖死,而 SPIEN 鎖死常見有以下三個狀況
  •  錯誤的 Clock
  •  SPI  port  禁用,使 MCU 進入保護模式,無法再對該設備進行燒錄
  •  Reset  port  禁用

2.  Driver、Firmware、Bootloaer  可安裝,但無法正確使用硬體設備
  •  Driver 方面無論是 Arduino 和 USBasp、 AVRISP  mkII ,這三個硬體的 Driver 安裝後,都無法在 Arduino 2560上正常使用,燒錄程式。
  • Firmware 要針對 8U2、16U2(for R3)的 USB  to  serial 晶片作燒錄,因為 Arduino 2560 有分R3版本,以及早期版本。
  • ATmega 2560本身需要的 Bootloader 也是需要挑選,亦有版本差異。

基於這塊板子是從大陸工廠寄過來的板子,當初在工廠怎麼操作使用,實在不清楚。
遇到上述狀況後,解決順序與方案說明如下:

1.  Arduino  Bootloader  損壞,購買了一個 USBasp($ NT 222 )。
圖片來源:Google

   
     預估更新後應該可以正常使用,未料於 Arduino  IDE 下挑選正確燒錄器與正確韌體後,
     竟然無法燒錄。

     只好改採 USBasp 專用燒錄軟體進行燒錄,在網路上找了四種 USBasp 燒錄用程式,
     Arduino 2560 的 Bootloader 可在 USBasp 專用程式顯示燒錄成功,
     但在 Arduino IDE 依舊無法上載 Sketch。

    
     基於實驗精神,拿起自己的 Arduino Duemilanove 與 Arduino Diecimila,
     皆可正常於 Arduino IDE 燒錄 Bootloader,並上傳Sketch 。
   
     測試了兩天後,我放棄採用 USBasp 燒錄 Arduino 2560 ,
     上網訂了一個 AVRISP mkII,這台自費購買,花了 $NT 1660。
圖片來源:Google
      

改採 AVRISP的理由有二:

     (1)  因為自己平時在家都會玩一些 Arduino 和 AVR 單晶片,買一台高階一些的燒錄器, 
            未來若需要用到就方便多了。

     (2)  網路上大多數的 Bootloader 教學文章都是已 ISP 燒錄器居多,
            因此買一台來加快修正速度。



因此方法 1 的心得是: USBasp  便宜好用,但是僅適合用在 Arduino  328、168 這類板子上,
才能正常使用 Arduino IDE 燒錄 Bootloader 與上傳 Sketch。

=======================================================================

選擇使用 AVRISP mkII 作為我們的程式燒錄器後,所要作的目標為:

所有的 Sketch 都將透過 AVRISP mkII上傳




整體工作步驟為:

安裝 AVRISP mkII 驅動程式  -> 開啟 Arduino IDE  ->  設置燒錄設定  ->
燒錄 Bootloader  ->  開啟範例程式  ->  燒錄範例程式





2.  由於 AVRISP  mkII 是比 USBasp 專業很多的東西,因此有很多細節要更小心使用。
     使用這台的好處是最後燒錄USB晶片韌體、燒錄 bootloader、燒錄 sketch 都有成功且順利。

     使用 AVRISP  mkII 前,要先安裝 mkII 專用的驅動程式,但請先依照下列步驟:
  • 電腦連接USB插上 mkII,接著會跳出要求安裝驅動程式畫面,選擇由其他地方選擇驅動程式

  • 挑選 C:\ arduino-1.0.1\hardware\tools\avr\utils\libusb\bin


          請注意:
                         這個驅動程式是由你下載解壓縮後的 arduino 軟體資料夾內夾帶的,
                         筆者在此所解壓縮的位址在 C:\ ,因此請以自己的解壓縮位置去搜尋
                         arduino 資料夾


                     << mkII的驅動安裝完成後,請先不要移除與電腦的USB連接 >>


  • 將 Arduino  2560 用USB接上電腦,並AVRISP  mkII 用附贈的 10pin 線用轉接頭轉為 6 pin 後,插入Arduino 2560上的 ICSP pin ( MISO腳位在最右上角)

圖片來源:Google

                         圖中紅色框框處為 ICSP 腳位,綠色圓圈處為 ICSP的 MISO 腳位。
                        無論是透過 USBasp,還是 AVRISP mkII,都是經由這個腳位下載 Bootloader。
                        稍候我們所要上載的 Sketch 也是經由這個 ICSP 腳位。


  • 打開 Arduino  IDE,在 Tools -> Board 選擇 Arduino  Mega  2560

  • 接著在 Tools -> Programmer 選擇 AVRISP mkII

  • 最後點選  Tools -> Burn Bootloader,等待燒錄完成即可

Bootloader  燒錄完成後,請先不要將 AVRISP  mkII拔除,
燒錄範例程式中最簡單的 Blink 是否正常即可。



燒錄範例程式:

開啟範例程式




請選擇 File -> Upload Using Programmer


燒錄過程中 RX、TX的燈並不會閃爍,是因為經由 ICSP 腳位燒錄並未通過 USB 通訊晶片,因此 RX、TX不會閃爍,請別誤以為損壞了,上傳進度請以 IDE 狀態視窗顯示的資訊為準。


正常燒錄成功的話,應該可以看到 LED 不斷閃爍,到這裡恭喜你已經完成:

  • 將 AVRISP 正確安裝驅動程式,並可以在 Arduino IDE 中正常使用
  • 使用 AVRISP 燒錄更換 Bootloader
  • 使用 AVRISP 上傳 Sketch 至 Arduino


======================================================================

因為這篇只是前言,並把利用 Arduino  IDE  燒錄 Bootloader  這個比較簡單的方法寫出來,
因此有其他比較多的細節部份,後續有時間會慢慢寫後續的續篇。

燒錄 Bootloader 當然不只有用 Arduino  IDE 可以作到,AVR  studio 這個官方提供的編輯環境也作的到,而且調整細節的選項部份更多元,但避免搞混,加上為了讓各位以最短的時間解決問題,我先提供了最容易的作法。


這邊要探討幾件事情:

1.   為什麼下載程式不用 USB 直接上傳 Sketch 到 Arduino 呢?

      因為我手邊這片 Arduino  2560 只有在更新 Bootloader 後的第一次上傳 Sketch 可以成功,
      第二次就會在上傳時卡住,然後就毫無反應。因此改採 AVRISP  mkII 的方式上傳。

2.   用 AVRISP  mkII 上傳有什麼好處嗎?

      用 AVRISP  mkII 上傳有幾個好處:

  • 當程式透過 USB 上傳至 AVR 晶片後,在執行撰寫的程式動作之前,需要透過 Bootloader 將要執行動作的腳位、記憶體初始化等引導工作。 若需要完整利用到 AVR 晶片全部的記憶體空間,可以把 Bootloader 去掉,利用 AVRISP mkII 上傳 Sketch,完整利用了全部空間。而原本的初始化動作就變成 AVRISP  mkII 的工作了。
  • 燒錄速度因為不需要在等待 AVR 晶片上的 Bootloader,因此燒錄速度也較快。


我手上這片 Arduino  2560  無法用 USB 下載程式的問題,我現階段也不想多花時間探討細節,畢竟這塊板子裝上要控制的物件後,基本上就不會再需要拆下、更換程式,因此就採用 mkII 的燒錄方案來解決這一切吧!



之後還會有兩篇有關使用 『 USBasp 安裝,並於Arduino Atmega 168 與 328 上傳 Sketch 』 ,
 和  『 AVRISP  mkII  與  AVR Studio  於 Arduino 燒錄設定  』  ,希望下週前可以寫的出來。


有問題的朋友,歡迎留言討論,感謝!

3 則留言:

  1. 您好 請教一下
    我利用Arduino開發了一個電路 現在自己將電路洗出來了
    但是我在燒錄方面遇到了問題 我利用Arduino mega板當做ISP
    將mega板的53腳接我電路的RESET
    52腳接我電路的SCK
    51腳接我的電路MOSI
    50腳接我的電路MISO
    電路的電源是從mega板上接過去的
    然後利用Arduion IDE進行燒錄Bootloader 但是失敗了
    請問是否有哪個步驟做錯了呢? 如果改用AVRISP mkll是否會迎刃而解?
    P.S.Arduino mege有先燒錄EXAMPLE裡的ISP程式 Tools->programmer也有選arduino as ISP

    回覆刪除
  2. 感謝你的分享~釐清了一些晶片被鎖死的觀念. 我也是使用usb isp 搭配 progisp 鎖死了我的 arduino nano v3.0 .目前正在找尋解鎖方式. 試過了 uno板模擬isp 重燒bootloader 也無法讓被鎖板 產生連接回應.使用progisp 產生 chip enable program error ....

    回覆刪除
  3. 請問arduino mega 2560需要驅動程式嗎?

    回覆刪除