USB接続プログラムライタの試作
***************************************************************************************************
このページの内容は「プログラムライタ と ライティングソフト」にまとめました。
したがって、やがて廃止しますのでそちらをご覧ください。リンクいただいている
場合はリンクをそちらに変えていただくと幸甚です。
***************************************************************************************************
1は新しいデバイスに対応していません、2,3,4はどれも良いものだと思います。筆者はChaNさんの
ソフトが扱いやすいので好きです。半田付けに自信があれば3が良いと思います。AVRDUDEのコマンドライン入力を苦にしなければ4もいいでしょう。
これさえあればノートも安心です。
以下の文の中で、「早い・遅い」がありますが製作当初のもので、その後の改良や調整によって最終的には2,3,4の
いずれも遜色はないと思います。(05.05.31)
1 FTDI-FT8U232BMにAVR910を結合したもの 04.08.02
2 FTDI-FT8U232BMにChaNさんのSPIを結合したもの 05.05.19 05.05.11
3 ChaNさんの USB-SPIブリッジの製作 05.05.17 発振子を9.216MHzセラロックに変更しました。06.01.05
4 USBaspの制作 --mega8一つのライタ-- 05.05.23 AVRdudeの使い方を追加しました。05.05.28
5 avrspx.exeのレポート 06.05.08 USBaspが生き返りました
1 FTDI-FT8U232BMにAVR910を結合したもの
Windowsが2000やXPになって、プリンタポートが自由に使えなくなりました。また、D-sub9ピンのシリアル端子が付いていないコンピュータが
多くなって、USBでなければ使えない場合があります。USBのライタが作れないものかとWebページを検索していましたら、いい報告に出会い
ました。Nagnagさんhttp://www.nagnag.jp/main.htmlの電子工作のページの 「簡単USBデバイスの作成」です。簡単な回路で、USBからシリア
ル(RS232C)と同じ信号が得られそうです。なお具合の良いことに信号の論理が反転している上に TTLレベルになっているので、マイコンAVR
に直接繋ぐことができそうです。この種のICは入手しにくいようですが、共立電子にありました(900円) ので試作しました。
Nagnagさんの回路をapplication note910の90S1200に接続しただけです。Nagnagさんの回路の-RTSと-CTSを 短絡し、TXD端子を90S1200の
PD0(RXD)に、RXD端子を90S1200のPD1(TXD)に接続します。信号線はクロスしています。
FTDIのFT8U232BMは約7mm正方形のチップの四方に8本ずつ32本の足がついたものです。端子のピッチは0.8mmです。半田付けには一時ギブ アップ
しそうになりました。いろいろ試した末、0.26mmのポリウレタン線UEWをあらかじめ半田付けしたものを基板に結合しました。 虫眼鏡で一本ごと
にチェックしました。5,6回やり直してやっと成功した線もあります。作ってみたかったからチャレンジしましたが、 アダプターを買った方が
良いかもしれません
デバイスドライバはFTDI(http://www.ftdichip.com/FTWinDriver.htm)のCurrent Version = 1.00.2148 を使いました。
ターゲットへの書き込みはapplication note910と全く同じ方法でokです。ポートはcom4になりましたが、AVRstudioが自動で設定してくれます。
配線がかなり複雑になりますので、チェックは十分行ってください。私も苦労しました。
後日、ファームウエアを変更して90S2313を使っています。TEMPLEさんのソフトで多くのデバイスに対応しています。
(05.07.19) しばらく使っていなかったので解体しました。ChaNさんのライタが便利なのと、TEMPLEさんのソフトでさえ最近のデバイスに対応できていないためです。
また、AVRstudioを使わなくなったのも一つの理由です。1年余り前は、ChaNさんのソフトがWIN2k/XPに対応していなかったことと、使っていたのが90S2313だけだった
ので、このライタをAVR910改(TEMPLEさんのソフト)とともに使っていました。。
2 FTDI-FT8U232BMにChaNさんのSPIを結合したもの
まえおき: Chanさんの書き込みソフト avrsp.exe はすばらしいプログラムです。特にこの1年の改良はすばらしく、Win2k/XPで使えるようになっただけではなく
USBにも対応できるようになりました。多くの方の要望に応えられて、USB書き込みのソフトとハードを完成された氏には感謝の気持ちでいっぱいです。レガシーポート
のないコンピュータが増える中で、最新のデバイスにも対応しているライタの制作例はなかったと思うのですが、これで安心してUSBを使えることと思います。
オリジナルはCP2101を使われていますが、手持ちのFTDI232BMでもできないかと実験したところ成功しましたのでここに報告します。なお、
JUN猫さんがここよりも先に
報告されてます。
左半分は、かなり以前に作ったUSB-TTLレベル変換基板です。今までRTSとCTSをショートしてPCのハイパーターミナルでMCUと交信するのに使っていたものです。
ChanさんのCP2101の回路と比べて、DTRを取り出せば使えるのではないかと思い実験しました。
回路図:次のとおりです。
左の変換基板に、右側のChanさんのSPI部分をつなぎました。実験と言うことで、手元にないものは省略して(保護用ダイオード、リセットICなど)、その上に
手持ち部品を使いましたので抵抗やコンデンサの値も変わっています。(25pなどはウン十年前に亜土電子の通販で購入したものです。)
私の場合は上記の1でFTDI232BMのデバイスドライバが組み込まれていますが、そうでない場合はFTDIからドライバをDLする必要があるでしょう。
もちろん、書き込みソフトavrspとファームウエアはChanさんのものです。『汎用SPIブリッジの製作』
が本家本元です。
COMポート直接に比べれば速度が落ちますが実用には十分だと思います(まだ測定はしていませんが)。
最初に実験したときは、2313に4MHzのセラミックを使ったのですが、もちろん動きませんでした。ふぁじぃさんから、ボーレートの調整が必要なことを教わり、
手持ちの水晶で実験しましたがうまく働きませんでした。指示どおりの3.6864MHzの水晶を購入して、再度実験したところうまく動きました。このクロックでは
ボーレイトの誤差が0%になるので、それが原因なのでしょうか。他の水晶で2%以下の設定をしても成功しませんでした。
おまけ:USBのコネクタにB型を使わず、コードを切って使っています。他の用途もあって、机上に延長コードを置いているのでA型の方が便利なのと、100円ストア
で売っているために手に入りやすいからです。
追記:05.05.19 デバイスドライバのプロパティで、Port Settings → Advanced Settings → latency timer をデフォルトの16msから1msに変更し、avrsp.exe
を R0.35a に更新すると極めて速くなります。感覚的にはCOMポート直接と同じくらいです。ストレスなしに書き込みできそうです。重ねてChaNさんに感謝!
(05.07.09)FTDI変換部と2313SPI部を一つにまとめて作り直しました。抵抗も1/6W型にしたことと0.1μFに積層セラミックのチップ型を使ったために小さく
まとまりました。今回から宗旨替えしてリード線をコネクタに替えました。いくつか作っている間にひもが保管時の邪魔になるからです。(共用の方が
便利?)
ただし、このコネクタはジャンクのヒンヘッダ(ボックスコネクタ)を鋸で切って使いますから、安価ではあるのですが見栄えはもう一つです。デジットで一袋買ったら
沢山入っていました。基板上に余裕がありましたので、4つのLEDを付けました。USBの電源、ターゲットからの電源、送信状態、受信状態を表示しています。
送受信のLEDははじめて付けてみたのですが、通信の時間が短いのであまり目立ちません。
UART用のコネクタもつけました。RTSとCTSは短絡して、TXDとRXDだけによる通信ができるようにしています。別項のTiny2313からPCのExcelにデータを送るときに使え
ました。 なお、2313のファームウエアは組み立て途中に臨時の半田付けをして書き込んでいます。変更が必要になればまた、半田します。
TQFPの半田付けにこんなことをしてみました。
フリーで半田をすると楽なのですが、あとで穴を通しにくいものです。不要になった基板を切って前もって
穴の位置で線を直角に曲げて置きました。ピンセットで誘導してすべての穴に通してからそろりそろりと深く挿入していきます。
一つの穴を2本の線がとおるので、ピン番号の若い方はリードを短くして識別できるようにしました。できあがりは少しきれいになったようです。
3 ChaNさんの USB-SPIブリッジの制作
CP2102を入手しましたので、ChaNさんの USB-SPI bridge(AVRライタ制作集 汎用SPIブリッジの制作)
を作りました。届いたICが想像以上に小さいので「できるかな?」と不安はあったのですがチャレンジしました。結果はgoodです。上に書いたFTDIのブリッジより
遙かに高速になりました。詳しい測定はしていませんが、FTDIで18秒かかった書き込みが3秒で終わりました(980バイト)。十分実用になります。COMポートのない
コンピュータには朗報でしょう。おそらく、現在自作できるものの中では最高のものと思います。リクエストに応えられてハードウエア・F/W・avrsp.exeのソフトウエア
を作られたChaNさんに感謝します。
IC周りの写真
いつもの事ですが、手持ちにない部品は省略したり、変更したりしますので、オリジナルの回路とは少し変わっています。ターゲットの電源も5Vだけを考えています。
回路図を引用するのは適切でないかもしれませんが、変更点が多すぎますので参考までに実験に使った回路をここに置きます。
制作されるときは必ずオリジナルを見てください。
2313は上記2でTinyでも置き換えることができることを確認しましたので、Tinyにしました。DIPではありませんから、F/W書き込み用のISPピンを用意しました。
CP2102をUSBにつなぐと(WinXPで)新しいデバイスのドライバをインストールする画面が出ますが、適当なドライバがなく、インストールに失敗した旨の表示となりました。
ドライバはどうなっているのかデータシートを見ると「キットに付属」の記述しか発見できず、トラ技2005年1月号の記事にも「キットにある」としか書かれていません。
途方に暮れて、何度かUSBに挿したり抜いたりしていると「使用できるようになりました」と変わりました。理由はわかりません。とにかく認識されました。
(06.05.17 最近のwindows(XP)にドライバがあるようです。アップデートしてあれば素直にインストールするようです。下記のドライバが使われています。
追記はここまで。)
あとはターゲットにつないで、avrsp.exe を実行するだけです。私の場合は、2313の電源はターゲットから取っています。 avrsp.exe で -pb4 のオプションでターゲット
プログラムのread/writeができました。上に書いたように高速です。自作できて、USBで使えて、殆どのデバイスに対応しているライタはこれしかないのではないかと
思います。千数百円で制作できるでしょう。
常用するときは avrsp.ini ファイルに -pbn (nはポート番号)と書いて、pathが通っているところ、例えばC:\WINDOWS\system32フォルダに
置くとよいでしょう。
私は、c:\にフォルダaを置き、この中に avrsp.exe, fuse.txt, avrsp.iniを置いて、aのショートカットをデスクトップに置いています。aのショートカットをクリック
すると画面端に小さくaフォルダのファイルが表示されるようにします。ここからavrspをDOS窓にD&Dしています。fuse.txtがあるのでfuseの詳細も見えます。avrsp.iniを
読んでくれるのでデフォルトの変更ができます。また、ここにあるからiniファイルの変更も簡単です。ただし、system32と重複するとsystem32にあるiniが優先されます。
avrsp.iniファイルの設定:ファイルの設定については英文で書かれていますが、覚え書きを記しておきます。
@コマンドはファイルの第一行目先頭から書きます。-pb4 -d5 を指定するなら、1行目先頭から-pb4(改行) 2行目先頭から-d5(改行) 3行目(空白行)とします。
Aこのファイルに書いてあっても、コマンドラインに同じコマンドがあれば、コマンドラインに書いたものが優先されます。
Bコマンドは空白行またはEOFで終わります。コメントがあれば空白行の次の行から書き始めるとよいでしょう。
失敗談:今度こそは丁寧に、少しはきれいに仕上げたいと念じつつ半田付けを始めました。幾多の困難を乗り越え(大袈裟?)、0.5mmピッチに半田付けをしました。そして、
2313がSOPなのでISPで書き込もうとしたところ、ライタが動いてくれません。電源電流を見ると2.5mA程流れています。多すぎます。仕方なくポートB側の結線をすべてはずして
改めてISPの配線だけしました。MOSI,MISO,CLK,RSTです。書き込みができました。そこでヒューズもクリスタル発振に変更しました。電源電流は30mA程になっています。
多すぎます。わかりません。そのままにして、USBにつないでみました。今度はPCが認識しません。なぜだろう...としばらくは解決策が見つかりません。日が変わって、
CP2102の端子配置のメモ用紙を眺めていると、「top、bottom?」と気がつきました。MLPの現物は上からは端子が見えないので、bottomと思いこんでいたのです。
(真空管はbottom
しか書かない)。 データシートを確認すると間違いなくTOPです。壊れてないかなと心配でしたが、電圧をかけたところは偶然にもほとんどNCのようですからそのまま使う
ことにしました。でも、苦労してつけた半田がすべて使えません。はずすのは簡単、1分もあれば完了です。改めて挑戦しました。CP2102の回路図の左半分だけを配線したところでUSBに
つないでみました。PCが認識しました。後になって、未知な回路を組むときはわかっているところで中断して動作チェックをすることが大事だと思い出しました。
2313との接続部をはんだ付けし直して、完成です。付けたりはずしたりで、当初の目的はいずれやら、またまた不細工な仕上がりになりました。なお、電源電流は
クリスタル発振で3mA程度になりましたから、こんなものだと思います。
追記:05.05.19 avrsp.exe がR0.35a に更新されました。2倍くらいに速くなった感じです。COMポート直接と感覚的に変わりません。ストレスなく実行できます。COMポートは
あるのですが、書き込みスイッチの切り替えが要らないこのライタを常用にしようかとも思います。(謝)
追記:05.05.22 3.3Vの電源を作りました。このライタに使ったTiny2313は10MHzまでならVcc2.7Vが保証されていますから当然ですが正常に書き込みができました。90S2313-10
でも3.3Vで動くという報告がありますが4V規格ですから保証外動作と言うことになるのでしょう。
自明の事ですが、このページのライタはいずれもAVRマイクロコントローラを使っていますから、これにファームウエアを書き込むAVR用のライタが必要になります。
ライタを作るためにライタが必要だという何ともややこしいことになります。用意できる方はいいのですが、USBしかなくて用意できない方はご相談下さい。
追記:06.01.05 作り直して、発振子を水晶からセラロック9.216MHzに変えてみました。書き込みスイッチも通常は使わないので省略しました。
(小さくなりました)
ファームウエアはクロックだけを3.6864MHzから9.216MHzに変更して再アセンブルしたものを使っています。
cp 2102の部分が力学的に弱そうなので臨時のカバーをかけています。
cp 2102の電源はUSBバスから、Tiny2313の電源はターゲットから取りますが、それぞれの接続がわかるように赤色チップ発光ダイオードを付けました。
また、信号回路のダイオードは東芝の1SS319(ショットキダイオードに変わっています。
4 USBaspの制作 --mega8一つのライタ-- 05.05.23
USB専用のICを使わず、Atmega8一つでUSBのデコードとAVRの読み書きをする回路が公表されています。USBasp
といいます。
特別な部品を使っていなくて、部品の数が少ないので作ってみることにしました。簡単に作ることができ、なかなか高速に書き込めます。ソフトウエアもすべて用意されていて
1回のDLですべてokです。最終的にはavrdudeを使う事になりますがそれに慣れれば快適に作業できます。
まずWebページへ行ってファイルをダウンロードします。usbasp.2005-04-21.tar.gz
(最新版は、usbasp.2005-07-03.tar.gz になっています。051007)
圧縮ファイルですから、解凍して適当な場所に置きます。c:\usbasp フォルダなどはどうでしょうか。あとで、
\usbasp.2005-04-21\bin\win-avrdudeフォルダの2つのファイルを直に入れておくと書き込み時に便利かと思います。
大きな画像
回路図は原文がやや見にくいこととコネクタが10ピン(ここでは6ピン)なので、書き換えてあります。上の写真では2つのLEDはつけていま
せん。
原文にあるように、このライタは5V専用です。上記3つのライタでは書き込みをコントロールしているAVRの電源はターゲットから供給される形でしたが、USBでかつAVRの
入力がUSBそのものですからバスパワーで使う事にしています。したがってターゲットとVccはつながっていません。発振子は水晶を使うべきでしょう。セラミックレゾネータ
では安定が悪いと思います。以前にIgorUSBを作りましたがセラミックレゾネータでは殆ど通信できませんでした。2台目を作りましたので、ファームウエアを書き込むピン
はリードを付けて書き込み時だけ半田付けしました。ファームの書き換えはあまりないと思いますので必要なときはまた半田付けします。
TQFPの半田付けはなかなかうまくなりませんが、CP2102の0.5mmピッチの後ではかなり楽な感じです。この頃はブリッジになることもずいぶん少なくなりました。
USBのBコネクタをつけずに100円コードを切って使うときは緑色がD+で、白色がD-です。
配線が終われば、目視点検をします。間違いがないと思えば、Vcc-GND間が短絡してい
ないことをテスタで確認して、5V電源をつなぎすでにあるライタを使ってファームウエアを書き込みます。
ファームウエアを確認したら、USBにつなぎます。「新しいハードウエアが見つかりました」、「新しいハードウエアの検索ウィザードの開始」と始まったでしょうか。
もしそうならなかったら配線の不具合があります。心を静めて目視点検をしましょう。という私も翌日になって誤配線を発見することもあります。「間違いがないと
思っているところに間違いがある」つもりで頑張りましょう。さて、インストールウィザードが始まれば、ファイルの場所として解凍したファイルのドライバフォルダを
指定します。成功すれば、マイコンピュータのプロパティ→ハードウエア→デバイスマネージャを開けると(そして+をクリックすると)次の画面が出るでしょう。
書き込み:実際の書き込みは次のようにします。
@avrdude.exeとavrdude.confファイルが C:\usbasp\フォルダにあり、書き込むhexファイルが C:\data\prg1\prg1.hexであったとします。
AC:\usbasp\フォルダを開いて小さくしておきます。2つのファイルが見えているはずです。
BC:\data\prg1\フォルダを開いて小さくしておきます。prg1.hexファイルが見えているはずです。
Cコマンドプロンプトの黒い窓を用意します。
D黒い窓の中に 1 Aからavrdude.exeをDDします。 2 -c usbasp と書きます。 3 -p 2313 と書きます。 4 -U flash:w:"と書いてprg1.hexをDDします。続けて
":i と入力します。
次の様になるでしょう。
C:\WINDOWS\Ssystem32>C:\usbasp\avrdude.exe -c usbasp -p 2313 -U flash:w:"C:\data\prg1\prg1.hex":i
ここでenterキーを押せば書き込みが始まります。 -cオプションはライタにusbaspを使うことを指示し、-pオプションはターゲットデバイスが90S2313であることを、
-Uオプションは、flashメモリにw書き込み(rなら読み出し)、そしてファイル名をダブルクォートで囲みます。最後のiはintel hex formatデータであることを伝えます。
実際にプログラムを開発しながら書き込み、テストランするときはバッチファイルで実行しようと思います。できるまでに何回書かなければならないか
わからないからです。
新しいデバイスも殆ど登録されていて使いやすいハードとソフトだと思います。mega48に980バイトのプログラムを書き込むときに1秒強でしたから、ストレスなく
使える状態です。
追記:ターゲットのクロックが遅いとき(<1.5MHz)は、ポートPC2をジャンパでGNDに落とすようになっています。ATmega8のデフォルト1MHzでは、説明にある
とおり
デバイスを読んでくれませんでした。エラー表示が出ます。signatureは0x000000を返します。エラー表示がわかりにくいのでよく読まないといけません。ジャンパを
onにすると正常に読んでくれます。ただし、プログラムを読み出すと約500バイトで35秒かかりました。mega8、mega48、tiny2313、tiny26はデフォルトではこの操作が
必要になります。ジャンパピンではなく、スイッチが必要でしょう。(それにしても時間がかかりすぎます。)
読み出しだけで、書き込みはしていませんが同じように長時間かかると思います。
追記2: 遅いクロックは何かとめんどうが多いようです。1.5MHz以下のクロックを使うことはまれだろうと考え直して、2作目は大袈裟なスイッチをやめて
ジャンパーピンにしました(スマートになった)。クロックが早ければジャンパーピンを低速にして置いても使えるかな、と思います。Tiny2313 4MHzで約600バイトの
読み出しが10秒で、書き込みはベリファイ込みで7秒強でした。05.06.12
AVRdudeの使い方: 05.05.28
AVRasp付属のAVRdeduの使い方を確認するために、Tiny2313のBポートにLEDを接続し(Hで点灯)、10MHzのセラミックレゾネータを付けたものを用意しました。
AVRdude.exeとavrdude.confの2つのファイルはC:\USBaspフォルダに置いてあります。この前提でお読み下さい。
@プログラマとデバイスを指定して認識を確認します。コマンドプロンプトの黒い窓を用意して、AVRdude.exeをDDした後、次のようにタイプします。空白に注意を。
C:\WINDOWS\system32>C:\USBasp\AVRdude.exe -c usbasp -p t2313
ここで -c オプションはプログラマの指定です。usbaspを常に指定します。 -p オプションはデバイスの指定で、t2313はTiny2313の略号です。(-p以下を書かないで
実行すると使用可能なデバイスと略号の一覧が表示されます。)
実行すると次の結果が得られました。
読みとられてsignatureが返されています。
Aヒューズバイトを読みとります。 このときはインタラクティブモードにするのがよいようです。 -t オプションで入ります。
新しいプロンプトに ? を入力すると、使えるオプションが表示されます(略)。
そのうちの lfuse hfuse efuse 続けてをdumpします。
これでヒューズバイトが読みとれました。ChaNさんのavrspに比べて操作に手間がかかります。
インタラクティブモードは quit で終了します。
Bプログラムを書き込みます。上に書いたように -U オプションで、-U flash:w:"c:\data\led8.hex":a とします。flashはプログラムメモリ、wは書き込み、
最後のaは
hexのファイルタイプを自動判別することを示します。書き込みファイルは、「:」が含まれているときはダブルクオートで囲む必要があるようです。hexファイルは
フォルダ
C:\dataに置いています。ダブルクオートで挟まれたファイルパスとファイル名はDDで持ってきます。
書き込みが終了してプログラムが走り出します。なお、このときはTiny2313はデフォルトのクロック0.5MHzですから、lowクロック用にハードウエアを設定しておきます。
Cヒューズを変更します。Tiny2313のクロックはデフォルトで0.5MHzです。このときのヒューズLは 0b01100010=0x62 です。これを 0xe2 にすれば内蔵RC4MHzに、
0x8fに変更すればセラミックレゾネータ(>8MHz)になります。 内蔵RC4MHzにするときは、
# avrdudu.exe -c usbasp -p t2313 -u -U lfuse:w:0xe2:m
と書きます(プロンプトなどは省略しています)。 このとき、-u オプション(小文字の方)が重要です。-uでセーフモードを抜け出します。だからヒューズが
変えられることになるそうです。なお、ファイルタイプの「m」はimmediate mode だそうです。ファイルを用意せず直接書き込めるので便利です。
lfuseと同様にhfuse、efuseが変更できます。
Dhexファイルを読み出します。ファイルに書き出すときは -U flash:r:"パス・ファイル名":i を使います。
もちろん -c -p は必要です。読み出した.hexファイルは当然、書き込みに使えます。
見ればよいだけなら、インタラクティブモード(-t)にして、dump flash ・・・・なのですが、一部しか表示されません。
Usage: dump <memtype> <addr> <len> ですから、dump flash 0 1000 と書きますとはじめから1000バイトが表示されます。
Eその他EEPROMの書き込み読み出しがあります。使ったことがないのですが、「flash」のところを「eeprom」に置き換えるといいようです。
ヒューズの読み出しと変更、プログラムの書き込みと読み出し、これらができたらプログラマとして実用になります。
WinAVR20040720版にはC:\WinAVR\doc\avrdudeがありましたが、20050214版にはないようです。この説明がいいと思いますので、
ここに置きます。(これを見ようとすると、
インストールが必要で、いま使っているものが書き換えられてしまう。ちょっと取り出すわけにはいかない。)
AVRdudeの使い方について日本語で解説されて
いるページを見つけられませんでしたので、自分のメモを兼ねて書いてみました。その他の情報がありましたら、ご連絡をお願いします。
付属のAVRdudeは次のデバイスに対応しているようです。
90S1200 | MEGA103 | TINY12 | 90CAN128 |
90S2313 | MEGA128 | TINY13 | |
90S2333 | MEGA16 | TINY15 | |
90S2343 | MEGA161 | TINY26 | |
90S4414 | MEGA162 | TINY2313 | |
90S4433 | MEGA163 | ||
90S4434 | MEGA169 | ||
90S8515 | MEGA32 | ||
90S8535 | MEGA64 | ||
MEGA8 | |||
MEGA8515 | |||
MEGA8535 | |||
MEGA48 | |||
MEGA88 |