N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
<< AquesTalk2 エラー:1002 | main | [AVR Studio 5] "Empty AVR GCC Project" が無い!! >>
簡単!ATmega328Pにブートローダを書きこむ
ブートローダが書き込まれていないATmega328PにArduinoのブートローダを書き込む簡単な方法です。

用意するもの
  1. Arduino Uno
  2. ブレッドボード
  3. ATmega328P
  4. ArduinoIDE
  5. 書き込み用のスケッチ(後述)

作業
ブレッドボードとArduino Unoを配線します。

(画像はarduino.ccより)

書き込み用のスケッチをUnoに書く
スケッチは、下記からダウンロードして、Unoにアップロードします。
ちなみに、これを書いた人はUnoのブートローダを作成された方のようです。

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1295516707
の 最初の記事内にあるリンク optifix.zip

スケッチのビルドやアップロード方法は基本事項なので省略。
OptifixスケッチのUpload直後に、Serial Monitor(ArduinoIDEの tool>serial monitor)を起動すると、以下のように表示され、これでブートローダが書きこまれました。
ね、簡単でしょ!
※ブートローダを書き込んだ後は外部クロック設定になりますので、2度目からは書き込めません!
OptiFix Bootstrap programmer.
2011 by Bill Westfield (WestfW)

Starting Program Mode [OK]

Reading signature:950F
Searching for image...
  Found "optiboot_atmega328.hex" for atmega328
  Start address at 7E00
  Total bytes read: 508

Setting fuses for programming
  Lock: 3F FFE000  Low: FF FFA000  High: DE FFA800  Ext: 5 FFA400

Programming bootloader: 512 bytes at 0x3F00
  Commit Page: 3F00:3F00
  Commit Page: 3F40:3F40
  Commit Page: 3F80:3F80
  Commit Page: 3FC0:3FC0

Restoring normal fuses
  Lock: F FFE000

Type 'G' or hit RESET for next chip


ブートローダのバージョン
UnoのATmega328PにはOptibootと呼ばれる512バイト以下の小さなブートローダが入っています。
今回の方法で書き込んだブートローダ(以下、Optifix)と、Arduino Uno(R2)のものと比較したところ、微妙に異なっています。Optifixのほうが新しいようです(2011/09)。
Unoのブートローダは、28672byte以上の大きなスケッチを書こうとすると、次のエラーが出てたのですが、Optifixではちゃんと書き込めるようになっています。


 avrdude: stk500_paged_write(): (a) protocol error, expect=0x14, resp=0x64
 avrdude: failed to write flash memory, rc=-4
 avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

フューズの違い
フューズの設定はUnoとOptifixでは微妙に違います。EESAVEだけですので、EEPROM使う人はちょっと気をつけてください。

 Uno:     Low:FF HI:D6 Ext:FD
 Optifix: Low:FF HI:DE Ext:FD

あとがき
この簡単な方法を見つけるのに、相当な時間と結局 AVRISPも購入することになるなど、かなり苦労しました。もっとも躓いたところが、クロック関連です。ATmega328Pは工場出荷時には、内臓の 8MHz(内部でさらに分周)のオシレータを使うように初期設定されていますが、ブートローダを書く途中で失敗すると、フューズの設定が外部クロックに変わってしまい、それ以降、ターゲットのATmegaが動かなくなってしまいます。これは、今回の方法でブートローダの書き込みもできなくなることを意味します。
Arduino IDEのBurn Bootloader コマンドで途中失敗した場合も、フューズの値が書き換わってしまったので要注意です。
ブートローダの上書きや、ほかの方法を試してみて失敗してる場合などは、面倒がらずに、最初からターゲットにも8MHzや16MHzの水晶発振子やセラミック発振子をつけておくと良いですね。うまくいかないときは、まずはコレからです。

参考にしたサイト

Using an Arduino as an AVR ISP (In-System Programmer)
http://arduino.cc/en/Tutorial/ArduinoISP

Arduino を AVR  プログラマ(ISP: In-System Programmer)として使う
http://n.mtng.org/ele/arduino/ArduinoISP.html



| その他 | 18:17 | - | - |
PROFILE
CATEGORIES
SELECTED ENTRIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
音声符号化
音声符号化 (JUGEMレビュー »)
守谷 健弘
CODECの本ですが、音声合成でも実用的なテクニックが満載