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なので間違えやすいです。
    http://www.obdev.at/Images/vusb/circuit-zoomed.gif
  • ↑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を入れるという方法もあります。

AVRUSB_Tips

HIDasp高速化 -- 実験記録


dream.cgi?id=HIDasp&name=a.gif