Top Page Index About Link Mail Form

3.3V対応 AVRライタ(USBasp)の製作

→USBasp小型基板製作

2005.10.15
2005.11.21 追記
2006.3.2 回路図変更
2006.4.6 回路図・パッチ変更
2007.6.5 ファームウェアとパッチ追加


驚愕

 ある日、うちのアパートに仕事関係のお客様が来られました。その方は ChaNさんが考案された COMポート制御ISPアダプタを作って持って来たのですが、これが早い! 6KBくらいのプログラムを書き込むのに1〜2秒程度しかかからない。最初、信じられませんでした。というのも、わたしが作ったライタで書き込むと 100秒はかかるからです。その差約100倍! 今までのは何だったんだ……。orz

失敗

失敗作の USBライタ

 というわけで早速、ChaNさん考案のライタを作ってみることにしました。I/Fは USBの方が便利なので、ChaNさんの回路に FT232BMを組み合わせて製作。制御ソフトも avrspを Linuxに移植してやってみました。早くなるかなー、と思ったのですが、なんか変。動作はしているのですが、1秒間に1、2バイト程度のスピードでしか書けない。ネットを検索してみたところ、AVR Wikiの FAQに USBシリアル変換アダプタ + avrspだとむちゃくちゃ遅くなるとありました。これは Linuxでも同じようです。せっかく作ったのに……。orz

 2006.4.6 追記。avrdude-5.1で avrsp指定ができるようになったので、レガシーポートなら Linuxでも ChaNさんの COMポート制御ISPアダプタが使えます。AVR-Wikiの AVRFAQ → avrdude-5.x情報 2006-1-25 を参照して avrdude.conf に avrsp の設定を追加して下さい。

USBasp

USBasp改

 そんなわけで今度は USBaspを作ってみました。FT232BM等の USBシリアル変換チップ + ChaNさんの汎用 SPIブリッジでもよかったのですが、USBaspの方が部品が少なくて済むのでそちらを試してみました。これは、USB専用のチップを使わず、ATmega8だけで直接 USB信号を扱うというもので、技術的にも大変興味があるものです。

 →回路図 (2006.4.6 抵抗追加・USBラインの抵抗値変更・電源チェック)
 ※USBコネクタの 2ピンと 3ピンの所に 3.6Vのツェナーダイオードを追加した方がいいです。

 USBaspはターゲット回路の電圧は 5V専用です。しかし、74LVC245でレベル変換してやれば 3.3〜5Vで動作できるはずです。ファームウェアが公開されているのでちょっと見てみたところ、少々いじるだけで 74LVC245の G(ゲート)をコントロールしてターゲット回路への接続/切り離しを自動的にできるようになります。そうすると、つなぎっぱなしでもプログラムの書き込みとテスト動作確認ができてとても便利です。

 →usbasp.2005-11-14版 isp.c patch
 →main.hex 改造後の HEXファイル

 上のパッチは 74LVC245のコントロールをするためのものです。とは言ってもあまりたいしたことはしてません。SPSR = (1 << SPI2X); をコメントアウトしていますが、これにより、書き込み速度が半分になる反面、1MHzのクロックでも書き込めるようになるようです。新品の ATmega8を書き込む場合でもディップスイッチをいちいち切り替えなくて済むのでそうしています。速度が半分とはいえ、以前と比べたら雲泥の差ですのでそうしましたが、速度重視の方はコメントアウトを元に戻すといいでしょう。

ケースに入れた USBasp
 ケース(タカチ SW-55S)に入れました。

 2007.6.5 追記。2006-12-29版のファームウェアとパッチ追加しました。SPI2Xのコメントアウトはやめました。
 →usbasp.2006-12-29版 isp.c patch
 →usbasp.2006-12.29版 Intel Hexファイル

書き込みソフト

 2007.6.5 追記。avrdude-5.3.1以降はパッチ不要です。

 Linux版の AVRDUDEに USBaspパッチを当てて使います。その前に、libusbが必要ですのでインストールしておきます。libusb-0.1.10a.tar.gz などをダウンロードして解凍したら普通に ./configure; make; sudo make install でインストールできると思います。

 2005.10.16 追記。
 Turbolinux 10 Desktopには最初から libusbが入っているようです。

 次に、AVRDUDEのソースをダウンロード・解凍し、パッチを当てます。USBaspのドキュメントには CVS版にパッチを当てろとありますが、ちゃんとパッチが当たらなかったので avrdude-5.0に手動でパッチを当てました。(注:2005-11.14版では avrdude-5.0に普通にパッチが当たります。)

$ tar zxvf avrdude-5.0.tar.gz
$ cd avrdude-5.0
$ cp ../usbasp.2005-07-03/software/usbasp.* .
$ patch < ../usbasp.2005-07-03/software/avrdude_usbasp.2005-04-21.patch

 ここでパッチ当てでエラーになります。(注:2005-11.14版では成功するのでこれ以下の作業は不要です。)しかし、エラーの内容を見ると手作業で直しても問題なさそうなので、エラーが起きた所はエディタで修正します。Makefile.am は 101行あたりに次の2行を挿入します。

	usbasp.c \
	usbasp.h \

 lexer.lの 173行あたりに以下を挿入します。

usbasp           { yylval=NULL; return K_USBASP; }

 あとは configure; make; sudo make install でいいと思います。なお、ひょっとすると autoconf と automakeの最新版を要求されるかもしれません。

AVRDUDEの使い方

 製作した USBaspを Linux機の USBにつなぎます。この際、Linuxは未知のデバイスが接続された状態になりますが、そのままで結構です。

 HEXファイルの書き込みは

$ avrdude -c usbasp -p m8 -U flash:w:hoge.hex:a

となります。-p m8 はデバイスの指定です。-U flash:w:hoge.hex:a はプログラムエリアに hoge.hex を書き込む指定です。最後の a はファイルフォーマットの指定で、auto を意味します。ヒューズビットの書き込みは

$ avrdude -c usbasp -p m8 -U hfuse:w:0xc9:m -U lfuse:w:0x9f:m

などとします。

 参考:→AVRdudeの使い方

 MP3プレーヤーのファームウェア書き込み(ATmega8, 約5.5KB)が約2秒、ベリファイも含めて 10秒以内で作業終了します。早くて快適。更に、ATmega88 などの新しいデバイスにも対応しています。