安定動作するAVRライターを作った
相変わらず忙しいです。明日は休出です。今日は1日減ってしまった三連休を少しでも満喫するために、AVRプログラマなんぞ作ってみました。
原理はELM の ChaN 先生作の回路(COMポート制御のISPアダプタ)そのものなのですが、私の環境(HPの大型ノート)では頻繁に verify に失敗する問題があったため、試行錯誤の上、信号線の使い方を変えて対処しました。
線がのたうち回ってあちこちクロスしているのは試行錯誤の名残りです。また、なぜか反転出力のICを使ってますが、これも試行錯誤の過程でやりやすい石を使っていたのを最後まで引きずってしまっただけで、深い意味はありません。(反転バッファを直列につなげば非反転出力が得られるので、色々実験するのには楽なのです。)
あと、AVRのリセットを駆動してるかどうかを表すLEDをつけていますが、これも本質ではありません。(トグル式押しボタンで中にLEDが仕込んである物を使いました。)
改変のポイントはシリアル信号線とISP端子の対応です。私の環境では、元の回路のように DTR(4) -> RESET#(5) & TxD(3) -> MOSI(4) とつなぐと、確率的にデータをとりこぼしたりするようで、モデルIDやFuseの読み込み程度なら大抵成功するのですが、それなりのサイズのプログラムをROMに書き込んでVerifyすると、かなりの確率で失敗してしまいます。
ブレッドボードでいろいろとつなぎ変えて試してみたところ、前述の線のつなぎ方を逆にすれば安定して読み書きできるようでしたので、それを採用したのが上記の回路というわけです。TxDをリセットの駆動に使うってのも気持ち悪い話ですが、avrdude 付属の avrdude.conf にデフォルトで入っている設定の中にもこういう使い方をしている例がいくつもありましたので、まぁ、大丈夫だろう、と。
このプログラマを使うには ~/.avrduderc を以下のような内容で作成したうえで、avrdude を使って書き込みます。
programmer id = "over80isp"; desc = "serial port banging, reset=txd sck=!rts mosi=!dtr miso=!cts"; type = serbb; reset = 3; sck = ~7; mosi = ~4; miso = ~8; ; default_programmer = "over80isp"; default_serial = "/dev/ttyS0"; default_parallel = "/dev/ttyS0";
デフォルトの指定もつけているので、avrdude の引数でポートやプログラマの指定をする必要はありません。(default_parallel の設定が奇妙に見えるかもしれませんが、デフォルトポートがなぜかこちらの設定が使われるようなので、対症療法的に設定しています。逆に、default_serialは無意味。なんでだろ?)
ちなみに、私は普段、ブレッドボードで遊ぶ程度なので、ユニバーサル基盤に回路を組んでケースに納めた作品は、これが始めてです。タッパーに収まった回路を見ると、すごいホビー電子工作臭がして良いものですねw
で、明日からはこれを使って、AVRマイコンで動くおもちゃの製作なんぞやってみようかと思います。(が、時間がとれるかなぁ……。 来週海外出張に飛ばされるかもしれないんで、厳しいかも。)