N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
Atmel純正コマンドライン型の書き込みツール atprogram.exe の紹介

AVRマイコンの書き込みツールとしては、Atmel Studioといった統合プログラムを使えばよいのすが、大量に書き込む場合は、GUIよりコマンドラインのほうが便利です。バッチプログラムでも使えますしね。

今まで、STK500.exe(これもAtmel純正)を使っていたのですが、昨今のAtmel Studioには含まれていないし、自分の環境で最近なぜか使えなくなった("could not connect to AVRISP mkII on USB"というエラーでAVRISP mkIIが認識されない)ため、他の方法を探すことになりました。
他にも有名どころでavrdudeもありますが、今回はAtmel Studioに付属している純正のツールatprogram.exeを紹介します。

■atprogram.exeとは
AVRマイコンなどのAtmel製マイコンに書き込むためのコマンドラインプログラムです。もちろん、実際に書き込むにはAVRISP mkIIなどの書き込み器(ハードウェア)も必要です。

以下の機能があります。必要十分な機能は揃ってます。

  • .bin .hex .elfファイルの書き込み
  • 内蔵flashの読みこみ, 書き込み, 消去
  • フューズ、ロックビット、セキュリティビット、ユーザーページ、ユーザーシグネチャの書き込み
  • 接続している書き込み器の一覧出力
  • 書き込み器とのインターフェースの選択やクロックの設定


■インストール
Atmel Studioをインストールすれば、含まれています。
AtmelStudio7.0の標準的なインストールでは、次のところにありました。

C:¥Program Files (x86)¥Atmel¥Studio¥7.0¥atbackend¥atprogram.exe


■使用方法
例えば、Arduino Unoでも使われているatmega328pに書き込む場合、次のようにします。

>atprogram -t avrispmk2 -i ISP -d atmega328p program -f hoge.hex


フューズやロックビットを書き込むときは

>atprogram -t avrispmk2 -i ISP -d atmega328p write -fs --values FFD7FF write -lb --values FC

ちなみに、フューズはLow,High,Exの順です(atmega328pの場合)。
次のように複数のコマンドを並べて一括処理することもできます。

>atprogram -t avrispmk2 -i ISP -d atmega328p program -f hoge.hex program -ee -f hoge_eeprom.hex write -fs --values FFD7FF write -lb --values FC


より詳しい使い方は、コマンドのヘルプを参照します。コマンドの一覧は次で表示されます。ちなみに、atprogramのマニュアルを探したのですが、見つかりませんでした。

>atprogram -?


これはすべてのコマンドではなく、より詳しく知るにはhelpコマンドを使います。
例えば、書き込みのコマンド詳細は次で表示されます。

>atprogram help write


以上、atprogram.exeを簡単に紹介しました。avrdudeなどに比べてまだ知名度の低いツールですが、純正のツールは安心感がありますね。
 

■ 追記 (2017/4)
昨年、AVRのプログラマ(書込み器) AVRISPmk2が販売終了になってしまいました。頑健で信頼でき、もちろん純正なのでAtmelStudioとも相性がよかったので残念です。

 

今後は、Atmel純正としてデバッガ機能も付いた Atmel-ICE というものが後継になるのでしょうが、価格は数倍になりました。
もし、書込みだけで良いという場合には、 Pololu USB AVR Programmer v2 がお勧めです。

 

これを atprogram.exe で使用する場合には、コマンドラインオプションの -t avrispmk2 の部分を

-t stk500 -c com5 のように変更するだけで使用できます("com5" の部分は、デバイスマネージャー等で該当のCOMポート番号を調べて適宜指定)。
ターゲットの電圧測定など、AVRISPmk2にあった機能も揃ってます。

| 電子工作 | 09:03 | - | - |
AVR Studio5.0 には stk500.exe が入っていない!
 AVRチップのプログラム(Flashを焼く意)にstk500.exe を使おうとしたら、どこにも見つからない。どうやらAVR Studio5.0 には stk500.exe が入っていないようだ。

入手先:
http://www.atmel.no/beta_ware/AVRCommandLineTools/AVRCommandLineTools.zip

展開後、AVRCommandLineTools.exe を実行してインストール。
デフォルトインストールでは、
C:¥Program Files¥Atmel¥AVR Tools¥Stk500
にstk500.exeが入っているはず。

ただし、このままstk500.exeを実行すると、libelfdwarfparser.dll が無いと怒られたので、隣のフォルダ(Stk600)から当該DLLをコピーして、一件落着。



| その他 | 00:08 | - | - |
簡単!ATmega328Pにブートローダを書きこむ
ブートローダが書き込まれていないATmega328PにArduinoのブートローダを書き込む簡単な方法です。
(追記 2015/03/16 第2弾を書きました http://blog-yama.a-quest.com/?eid=970164 )

用意するもの
  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
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
Arduino Uno
Arduino Uno (JUGEMレビュー »)

AquesTalk pico LSIの評価ボードとして最適
RECOMMEND
Raspberry Pi Model B+ (Plus)
Raspberry Pi Model B+ (Plus) (JUGEMレビュー »)

これと AquesTalk pi で簡単にテキスト音声合成!
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND