HIDasp情報
From:HIDasp
このページは瓶詰堂さんが2007.3月に公開されたオリジナル版HIDaspに関する情報です
瓶詰堂さんのHPへのリンク のほうを見てください。
瓶詰堂さんのHPは最新版のHIDaspに変わっていますので、
下の情報はもう当てはまらなくなっております。
HIDaspとは?
- USB経由でAVRに書き込むライターの一種。
- ATtiny2313で作れるUSBライターはこれしか無かったので、とりあえず作る。
- 自分が作った奴は、ここのWikiの左上に画像を貼り付けてあります。
質疑応答
Q1:HIDaspが動かん。
- パソコンに挿すと、不明なUSB機器になる。
- 動かんのじゃあ!
A1:USBのD+、D−はどこに繋ぎましたか?
- D+は PB1とPD2(==INT0)の両方に接続する必要があります。
- D−は PB0に繋ぎ、1.5kΩでプルアップする必要があります。
- AVRUSBのページを見るとD+,D−はPD2,PD3なので間違えやすいです。
- ↑D+、D−の接続は上の回路と違うので注意しましょう。
Q2:HIDaspは遅い?
- 2K書き込むのにVerify含めて10秒以上待たされるぞ!
A2:avrspx の-dオプションを与えましょう。
C:> avrspx -ph -d3 main.hex
とか、します。自分はavrspxのソースを書き換えたので、-phと-d3は不要になりました。
- これで2秒くらいに短縮されます。
Q3:なんでHIDaspなの?
A3:なにかとUSBのほうが手軽だからです。
- 実はChaNさんのシリアルライタの方が高速なんですが、
- 5V電源を別に用意しないといけないのが面倒です。
- それに、最近のインテル3シリーズのマザーではレガシーポートが消滅しつつありますので。
- 今のところATtiny2313で作れるUSBライターがこれしか無かったというのもあります。
- USBtoシリアルのケーブルでシリアルライタを使うという手もありますが、やはり5Vをどうするかという点があります。
- しかし、シリアルコンソールとして使えないという問題もありまして、今は微妙なところですねー。
- ChaNさんのFT232+シリアルというのが良さそうですが、配線が微細なので不器用な向きにはつらいですね。
Q4:HIDaspのAVR側ソースをビルドするとでかくなるんですけど・・・
A4:たしかに2Kに入りませんね。ちょっと待ってください。
- WinAVRのバージョンを最新でなく、2つくらい前に戻すとオリジナル版と同じHEXが作れるようです。
- GCC4ベースでなく、GCC3ベースのほうがAVRにとっては吉なのかもしれませんね。
- それでも、2Kから僅か12バイトしかお釣りが来ませんが・・・。
Q5:AVR側のコードサイズはもっと縮まんかのー?
A5:方法はあります。
- 全部アセンブラで書く ---そんなアホな!。
- crt.Sに相当する部分を最適化する。
- WinAVRのライブラリソースにcrt1.Sが含まれています。
- これは、実際のATtiny2313のものと微妙に違ってるんですが
- それを改造して、小さなcrt.Sを作ります。
https://raw.github.com/iruka-/ATMEL_AVR/master/web/upload/crt_S.zip - リンクするときは gccのオプションに -nostdlib を追加して、標準のcrt.oがリンクされないようにしておきます。
改造方法は
- まず、割り込みテーブルを削る。
- initとint0以外は使ってないのでばっさりと。
- 次に、dataのコピーとbssのクリアを最適化する。
- ATtinyのSRAMは128バイトで、アドレス上位が常に0なので
- 上位も含めてポインタ比較する必要はありません。
- dataの直後にbssが来るというのが事前に分かっているので、bssクリア前にポインタセットアップするのをサボります。dataのポインタのお古をそのまま使います。
- dataのコピーとbssのクリアは、while()なループになっているのを do { } while()型にランクダウン。
- これは、ループ末の条件比較へダイブしているrjmpをコメントアウトするという意味です。
- 実際にこれをやると、data,bssどちらかが0バイトのときにバグるので、そこは適切に対処です。
- あとは、固定データをPRGMEMではなくEEPROM上に移すとか。
- アクセスルーチンが余分にいりますけどね。
Q6:実際にAVRに書き込むと、時々AVRデバイスを認識しない。
A6:リセット直後に書いていませんか?
- どうやらリセットして20mSしか待っていないようですが。
- avrspxのソースをいじって、長くしてみます。
- どうですか?
Q7:これ作る前にどうやってATtiny2313に書き込むのだ。
A7:ChaNさんのシリアルライターを作ったのじゃ!
- http://elm-chan.org/works/avrx/report.html
- 上記リンクの COMポート用ISPアダプタ回路図 というやつです。
- 74HCが無かったので、手持ちの適当な74LS86(XORゲートだが片方をGNDにして単なるバッファ化)で動かしました。
- TTLの入力抵抗は10k〜20kくらいに下げます。
- 本当はCOMポートが±10Vくらい振れるので逆流防止ダイオード入れたほうが良いけれど入れてません。
- TTL電源の5Vが必要ですが、これはシリアルから確保できないので書き込みターゲットから借用してます。(書き込みターゲット=USBライタ)
- ChaNさんの回路ではバッファの3ステートオープンスイッチがありますがLS86では無理なので省略です。
- ここだけの話、
HIDaspよりシリアルライターの方が書き込み速いし安定してるんだよねー。- 制作直後はいくつかの点で不安定でしたが、今は安定しています。誤解を招く表現をしてしまいました。
Q8:なんで5Vに整流用ダイオード2個挟んで減圧するの?
A8:USBの1.5kΩのプルアップ抵抗は3.3V(〜3.6V)に繋ぐ必要があります。(5Vでは高すぎ)
- それと、D+、D−ラインの受電側差動アンプのレベル範囲が0.8V〜2.5Vに設定されているので、5Vフルスィングするとエラーの原因になります。
- 整流用ダイオードの代わりに3.3V〜3.6Vの減圧レギュレータを使用してもOKです。
- レギュレータを使用する場合は発振防止コンデンサを必ず入れましょう。
- さらに負荷側にも47μF以上の電解コンを入れておきます。
- そうしないと発振してしまい、出力をテスターで計ると4V以上になり、壊したかと錯覚します。
- どうしてもAVRを5Vで駆動したい場合はD+、D−に3.6VくらいのツェナーDiを入れるという方法もあります。
HIDasp高速化 -- 実験記録