2011年5月30日 星期一

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

(1) (2) 前面兩篇中,我們介紹了 ArduinoISP 而且使用 ArduinoISP 燒錄 bootloader。這次要介紹的是用 ArduinoISP 來燒錄 Arduino 程式(Arduino Sketch)。這種做法是直接把 Arduino Sketch 燒錄到板子上,沒有用到 bootloader,這讓你得以使用 ATmega 晶片全部的程式空間(program space)。所以,原本 ATmega328 的 32 KB 之中有 2 KB 被 bootloader 拿去使用,現在你將可以完整使用這 32 KB 的空間而不再是 30 KB,ATmega168 將是 16 KB 而不再是 14 KB,而 ATmega8 則是 8 KB 而不再是 7 KB。另外,當板子重啟電源時,原本會有 bootloader 的開機延遲 (約 6 至 8 秒),這問題現在也一併避掉了。

使用 ArduinoISP 燒錄 Arduino Sketch

1) 首先,先關掉 Arduino IDE

2) 編輯 Arduino 的 preferences.txt

preferences.txt 可以在這個資料夾中找到:

  • Mac: /Users/<USERNAME>/Library/Arduino/preferences.txt
  • Windows: C:\Documents and Settings\<USERNAME>\Application Data\Arduino\preferences.txt
  • Linux: ~/.arduino/preferences.txt

把 upload.using=bootloader 這行改成 upload.using=arduinoisp

你也可以用其它 ISP,例如 AVR ISP, AVRISP mkII, USBtinyISP 或 Parallel Programmer,這些 ISP 的識別名稱可以在 hardware/programmer.txt 中找到,例如 avrispmkii。

如果只是某張特定的板子需要用 ISP,那麼你可以編輯 hardware\boards.txt,把 <BOARDNAME>.upload.using=<ISPNAME> 這行加到 boards.txt 中。

3) 照底下的接線圖把 ArduinoISP 跟 Target Board 連接起來。記得要供電給 Target Board。

4) 接著按照正常的程序,選擇所用的 Arduino 板子,然後按工具列的 Upload 鈕或選單的『File > Upload to I/O board』把 Arduino Sketch 上傳到板子上。

image

回到正常的 USB/serial 上傳模式

當你不再使用 ISP 燒錄程式時,記得要切換回正常的 USB/serial 上傳模式。你必須把 preferences.txt 的 upload.using 參數還原為 bootloader:

upload.using=bootloader

或是從 boards.txt 中把 <BOARDNAME>.upload.using=<ISPNAME> 這行刪除掉。

記得還得把 bootloader 給燒回 Arduino 板子上。

延伸閱讀

6 意見:

提到...

http://wirejungle.wordpress.com/2010/08/16/programming-arduino-with-arduino/
這篇文章說要燒bootloader才會設定熔絲捏。
是您有另外的方法設熔絲呢?
3.If this is the first time you program the target chip, upload the Arduino bootloader. This will make sure the fuses are set properly
( 如果這是你第一次燒錄目標晶片,燒錄Arduino bootloader。這將確保正確設置熔絲)

coopermaa 提到...

那篇的意思是說,全新的晶片建議先燒一次 bootloader,這樣 Fuses 設定才會正確。我之前不是拿全新的晶片燒錄,是用原本有 Arduino bootloader 的晶片,所以可能因此沒有遇到狀況。不過,未必一定要燒錄 bootloader,用 avrdude 去設定 fuse 也是可以的。

提到...

請問把Lock Bit燒成0F是什麼意思呢?
(鎖住晶片?可以不燒嗎?)
ATMega8的Fuse是這樣設嗎?
hFuse=CA, iFuse= DF, eFuse=(空白)
Fuse燒錯可以重燒嗎?
Lock Bit可以重燒嗎?
怎麼樣才會把晶片燒磚呢?
謝謝您!

coopermaa 提到...

Lock bit 是用來設定 Flash, EEPROM 和 Bootloader section 的防寫保護
1 的話是不防寫,0 是防寫

0F 是設定 Flash, EEPROM 和 Bootloader section 哪些部份不防寫,這要查 datasheet Memory Programming 那章

我懶得看 datasheet,都是直接參考 boards.txt。Atmega8 的 fuse 這樣應該是對的。

可以的,Fuses 和 Lock Bit 燒錯可以重燒。
把晶片燒壞?ㄟ...這招我沒學過,不過我想主要是電的問題吧,如果給太大的電壓可能就會把它燒壞

Sven Wang 提到...

Cooper好,
不好意思...我想請問幾個很笨的問題@@

1.為什麼你的圖示裡面arduinoISP的板子上都沒有晶片呢?
有特別的涵意嗎?

2.參考USBasp那篇文章後, 發現我們可以使用ArduinoISP燒錄sketch, 也可以使用USBasp燒錄sketch, 而兩者接線基本上一模一樣, 也都是接收電腦過來的USB訊號, 這兩種方式的主要差別在哪呢? 應該說哪種方式會相較好用? 為什麼當初會跑出來這兩種須達成同樣目標的方式呢?

請Cooper解惑~~謝謝~~


謝謝~~~

coopermaa 提到...

Hi,

為什麼你的圖示裡面arduinoISP的板子上都沒有晶片呢?
=> 因為當時我想強調要把晶片放到 target board 上,所以才特別在 target board 放畫晶片... arduinoISP 其實就是一塊標準的 arduino 板子,上面還是有晶片的。不好意思讓你誤會了。

ArduinoISP 是 USB to Serial 的方式燒錄,也就是說程式是透過 COM port 來燒錄的。而 USBasp 的話則是會變成一個特殊的 USB 裝置....

ㄟ...也對,兩者都是走 USB,而且接線也一樣,對使用者來說好像也沒什麼差...

不過,這兩種方式的主要差別,應該是在通訊上面
一個是走 COM Port 通訊 (USB CDC 裝置),對 PC 端跟 Arduino 端而言,資料都是從 Serial Port (或稱 COM Port) 收送

而 USBasp 則是純粹用 USB Protocol
所以 PC 端還要裝專用的 driver 跟用專屬的程式來燒錄
而 MCU 端則要處理低階的 USB 通訊

我的感覺是 USBasp 速度比較快