2007年03月30日

Windows で テストプログラムを動かす

MinGW/MSYS で avrdude をビルドできたので、USB910用のテストプログラムを移植することにしました。

もともと簡単なものなので、移植するのは次の2点だけです。

1)シリアルポートの制御
open/close/read/write を使うことにして、ファイルディスクリプタを使ってシリアルポートの設定をする 関数を別に用意することにします。ファイルディスクリプタからハンドルへの変換は、_get_osfhandle が使えました。
シリアルポート設定自体は、avrdude を参考に作りました。あと、open のオプションに O_BINARY が必要でした。

2)usleep の作成
WIN32API には、ms 単位の Sleep があるので、単位を変換して usleep を作ることにしました。

あと、性能を測るために、double dtime() という関数を作りました。Linux だと gettimeofday を使えばよいわけですが、WIN32API だと TimeGetTime() 。この関数を使うには、リンカオプションで -lwinmm が必要でした。

MinGW でも getopt が使えるようなので、ついでにオプションの処理を整理。

テスト1

AVR-CDC 性能測定に使った、テストプログラムを使って長時間エラーなしに使えるかやってみました。百万回ほど通信しましたが OK でした。





変な形ですが、何回やってもこうなります。ドライバの作りと カーネルのイベントの処理の特性だと思っていますが、ひょっとしたら USBのコントローラとかハードウェアの違いでこうなるのかも知れません。

もっと I/O サイズを大きくしたらどうなるか興味が出てきました。別途テストしてみたいと思います。

テスト2

RC発振器のキャリブレーションで使ったプログラムが動くか確認。このプログラムは、I2Cで通信しています。I2Cの通信では、BUSY のときは、−2 を返して通信できない仕様にしているので、タイミングも関係あります。もとのテストプログラムがいいかげんだったので、結構ハマリました。−2が返ってきたときはリトライするコードを入れることで(って仕様どおりにしただけなんですが)一応ちゃんと動くようになりました。

最新版は、
usb910-0.4.tar.gzusb910-0.4.zipです。MinGW/MSYS でビルドする場合、tar.gz の方を使ってください。

注意点 ... テストプログラムは自由につかっても良いですが、-Wall すると山のように Warning が出ます。その程度のものですので、あまり信用しないように。

まだ問題はあるかも知れませんが、とりあえずは Windows でも USB910 を使えるようにしました。よかったら USB910 で遊んでみてください。
posted by すz at 03:09| Comment(0) | TrackBack(0) | USB910B

2007年03月28日

Windows で avrdude

USB910 向けに高速化した Windows 用 avrdude を作ってみることにしました。

ビルド環境は、MinGW/MSYS を使うことにします。

linux向けに作ったパッチをあてて configure したら (一行だけ修正が必要でしたが)ビルドできてしまいました。uisp と違ってこういうところはいいですね。(作る側が楽)。

さて本当に動くのか確認。avrdude.exe と avrdude.conf を同じディレクトリに置いて動かしてみます。

D:\>avrdude -F -p t861 -c avr910 -P COM4 -U flash:w:usb910a.hex
Found programmer: Id = "USB910A"; type = S
Software Version = 2.4; Hardware Version = 2.4
Programmer supports auto addr increment.

Programmer supports the following devices:
Device code: 0x20 = ATtiny84

avrdude: warning: selected device is not supported by programmer: t861
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e930d
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "usb910a.hex"
avrdude: input file usb910a.hex auto detected as Intel Hex
avrdude: writing flash (6946 bytes):

Writing | ################################################## | 100% 14.05s

avrdude: 6976 bytes of flash written
avrdude: verifying flash memory against usb910a.hex:
avrdude: load data flash data from input file usb910a.hex:
avrdude: input file usb910a.hex auto detected as Intel Hex
avrdude: input file usb910a.hex contains 6946 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 5.28s

avrdude: verifying ...
avrdude: 6946 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done. Thank you.


...なんか動いてしまいました。違うのは性能だけ。


書き込み ベリファイ
Windows 高速化なし   15.58s 7.47s
Windows 高速化版 14.05s 5.28s
Linux 高速化なし 30.38s 13.90s
Linux 高速化版 6.58s 3.49s


Windows はなにもしなくてもソコソコ早いかわりに、チューニングがほとんど効かない。Linux は、なにもしないとすごく遅いけど、チューニングすると何倍も早くなる結果でした。-- OS の性質がもろ出ているようで面白いですね。

ビルドしたものを avrdude-usb910.zipとして置いておきます。(必要ない人も多いと思いますが、GPL なのでソースもまるごと入れました。)
もし、USB910を Windows で使いたい人がいれば使ってみてください。
追記1:
MinGW/MSYS はビルド環境です。この avrdude.exe を動かすだけならインストールする必要はありません。
追記2:
これをビルドした環境も実は古かったので、最新版 MinGW-5.1.3/MSYS-1.0.10 を試してみました。なぜか libhid 関係で undefine のエラーが出て make でエラーになりました。 ser_avrdoper.c で #undef HAVE_LIBHID を入れると ビルドできました。参考まで。
追記3:
WinAVR を使っていれば、それに添付されている avrdude にパスが通っています。混同しないように avrdude-910 とか rename して、WinAVR/bin に置くのが良さそうです。
posted by すz at 19:01| Comment(0) | TrackBack(0) | USB910B

avrdude-1.5.3 を使ってみた

uisp を修正しながら使い続けているので、avrdude も実は使ったことありません。前に USB910は windowsでは使えないなんて書きましたが、windows も対応している avrdude で使えるか(Linuxですが)試してみることにしました。

-F オプションに加えて -u オプションが必要でした。

# avrdude -F -u -p t861 -c avr910 -P /dev/ttyACM0 -U flash:w:usb910a.hex
Found programmer: Id = "USB910A"; type = S
Software Version = 2.4; Hardware Version = 2.4
Programmer supports auto addr increment.

Programmer supports the following devices:
Device code: 0x20 = ATtiny84

avrdude: warning: selected device is not supported by programmer: t861
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e930d
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "usb910a.hex"
avrdude: input file usb910a.hex auto detected as Intel Hex
avrdude: writing flash (6946 bytes):

Writing | ################################################## | 100% 30.38s

avrdude: 6976 bytes of flash written
avrdude: verifying flash memory against usb910a.hex:
avrdude: load data flash data from input file usb910a.hex:
avrdude: input file usb910a.hex auto detected as Intel Hex
avrdude: input file usb910a.hex contains 6946 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 13.90s

avrdude: verifying ...
avrdude: 6946 bytes of flash verified

avrdude done. Thank you.


...一応は動くようです。ちょっと気になるのが、"Device code: 0x20 = ATtiny84" というところ、avrdude.conf をみたら、あちこちに、"Try the AT90S2313 devcode" なんて書いて 0x20 に無理やりしています。ATtiny84 はたまたま最後に定義されたものみたいです。

さて、書き込み時間が 30.38秒 ベリファイ時間は、13.90秒のようです。これは uisp もほぼ同じで予想通りです。... ということで uisp でやったように 高速化できるかやってみました。

結果は、書き込み時間が 6.58秒 で4.61倍高速化、ベリファイ時間は、3.49秒で 3.98 倍高速になりました。

ところで、ヒューズビットはどうやってアクセスするのだろう? ...どうやってもできません。コードを見ると ... usbasp.c とかは read_byte メソッドに avr_read_byte_default を使っているのに、avr910.c は 使っていない。これだと avrdude.conf に何を書こうが無理ですね。

というわけでちょっと直したら使えるようになりました。

# avrdude -F -p t861 -c avr910 -P /dev/ttyACM0 -t
Found programmer: Id = "USB910A"; type = S
Software Version = 2.4; Hardware Version = 2.4
Programmer supports auto addr increment.

Programmer supports the following devices:
Device code: 0x20 = ATtiny84

avrdude: warning: selected device is not supported by programmer: t861
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e930d
avrdude> dump lfuse
0000 62 |b
avrdude> q

avrdude: safemode: Fuses OK

avrdude done. Thank you.

これで -u オプションも不要になりました。

例によって 改造部分のパッチ avrdude-5.3.1-usb910.patch,avrdude-5.3.1-avr910d.patchと、おまけでソースRPM avrdude-5.3.1-suz2.src.rpm、さらにおまけで 使っている uisp の ソースRPM uisp-20040311-1suz4.src.rpmを置いておきます。
posted by すz at 00:08| Comment(0) | TrackBack(0) | USB910B

2007年03月27日

AVR910プロトコルとデバイスコード

AVR910では、t コマンドでサポートされているデバイスの一覧を返し、T コマンドでデバイスを選択するという仕様になっています。そして、定義されているデバイスは、AT90S2313とか ATtiny26 とか ATmega8 ぐらいまでで、新しいデバイスは定義されていません。

このデバイス一覧にないものはサポートできないと思われるかも知れません。が、新しいデバイスに対応できる仕組みは用意されていて、いくつかの書き込みソフトはそれに対応しています。

仕組みその1 -- T コマンドで 0 を指定する。
uisp の場合 -dpart=auto と指定することでこの動作になります。
avrdude の場合 -F を指定することで warning は出ますがこの動作になります。


仕組みその2 -- . コマンド(ニューユニバーサルコマンド)
4バイトのデータを送り、最後の1バイトを読み込みリターンするコマンドで、すべてのISPコマンドを実行できる拡張です。avrdude や uisp では (AVR910で定義されていない)上位ヒューズバイトの書き込みなどはこのコマンドを使って実装しています。


それなら デバイスの一覧なんて必要ないんじゃないか?と思われるかも知れません。それはほぼ正しいです。

デバイスコードの役割は、2つあります。

役割1:シリアルプログラミングモードに入る方法の指定
AT90S1200だけ 特別扱いしているようです。他のはシリアルプログラミング許可命令で 第3バイト目が 0x53 かどうか確認していますが、AT90S1200 は確認なしです。

役割2:遅延の時間指定
ページモードを持っていないデバイスでは、1バイト書き込む毎に遅延をいれていたりします。


これらの処理は、はっきり言って新しいデバイスでは関係なさそうです。0 が指定できなくて、なにか指定しなければならない場合 0x20 -- AT90S2313でも指定しておけば良いのではないかと思います。(というより、AVR910そのものを使う場合は、0 より 0x20 が良いかも知れません。)。ライタソフトは、普通 デバイスコードより、シグネチャーで制御すると思います。( 少なくとも avrdude, uisp はそうなっています。)

USB910はどうしているか?

USB910では、新しいデバイス専用です。AT90S1200 をはじめとして、ページモードを持たないもの(AT90S8515、AT90S8535、AT90S4433 ) は、はなから切捨てています。デバイスリストは、互換性の点から 0x20 のみ返しています。T コマンドでなにがきても動作には関係ありません。
ページ書き込みの時間は 一律 10ms 取っています。これ以上の時間が必要なデバイスはわずかなので対応していません。もし ATmega163 とか該当するものを使いたい場合ソースコードの twd_xx を修正してビルドしなおす必要があります。

というわけで、AVR910は新しいデバイスに対応できないというのは、誤解だと思います。(といってもあまりに古いのはダメです。すくなくとも . コマンドに対応している必要があります。)
posted by すz at 05:32| Comment(0) | TrackBack(0) | USB910B

2007年03月08日

Windowsで使ってみた

私が開発に使っているのは、Linux です。ライタソフトも長い間 uisp を使ってきて私にはそれで十分だったりするので、Windows の開発環境は使っていません。いまさらですが、Windows で使えるのかどうか試してみました。

準備 COMドライバーの設定

オリジナルのAVR-CDCに含まれている avrcdc.inf をどこかに置いて、置いたディレクトリを指定すれば、COM4 として認識されるようになりました。

テスト1 ハイパーターミナルでの確認

ハイパーターミナルを使って確認してみます。COM4 を指定して新しい接続を作り、画面を開きます。ボーレートに何を指定しても関係ありませんが、57600 bps を指定してみました。S を入力して USB910A と出力されてきました。ちゃんと通信できるようです。

テスト2 AVR Studio 4 で試してみる

AVRProg を使って、試してみました。結果は NG。まったく認識しません。どうも Software をチェックしているようです。USB910 では、S コマンドで USB910A または USB910B を返すようにしていましたが、"AVR ISP" (空白必要)に変更したところ、認識するようになりました。ただ、AVR910 プロトコルは、使い勝手が悪いですね。Stk500 プロトコルのほうがツールも使い勝手がよさそうな感じです。

結論

USB910 は そのままでは Windows では使えません。使えるようにしても 使い勝手が悪い上に遅い(7KB で30秒)です。Windows で使うプログラマを作るなら Stk500 プロトコルの AVR-Doperかそのサブセットが良さそうですので、こちらをお勧めします。
こう書いちゃうと USB910はダメダメなものに見えてしまいますね。ターゲットとI2Cで通信するとかそういう機能を使ってはじめて役に立つものなので、まあしょうがないですね。ライターソフトはスクリプトでも作れるはずなので、なにか考えてみようかと思います。
posted by すz at 21:09| Comment(0) | TrackBack(0) | USB910B

2007年02月28日

USB910B の回路図

USB910B の回路図を以下に示します。

見てもらうとわかると思いますが、いくつかの抵抗とコンデンサを1:1でつないだだけという感じでビギナーでも作れるレベルだと思います。ちなみにISPコネクタ配列はオリジナルです。一列 5pin にしたいので、あえて Atmel 標準を採用していません。



この回路は、3.3V 〜 5V で利用できます。5V で利用する場合は、3.6V のツエナーダイオードが必要です。3.3V-3.6V の場合は、必要ありません。


電源回路については、下に示すように 3.3V のレギュレータを使いスイッチで 5V と 3.3V を切替えるようにするのがお勧めです。



3.3V のレギュレータを使わずに済ませたい場合、下に示すように、5V から ダイオードを2段にして 電圧を落としても OK です。



注意) この回路は、USB の規格からだいぶ外れています。ほとんどでハブで認識できると思いますが、ひょっとすると認識できないハブがあるかも知れません。

おやくそく)この回路図は無保証です。この通り作っても動作することを保証するものではありません。自己責任 でお願いします。高価なPC を壊してしまう可能性もあります。リスクを減らすために電源付きの外付けハブを通して使用することをお勧めします。

プログラムについて

公開準備中です。一部に GPL のソフトを利用していますので ライセンスはGPLになります。なお、Linux 2.4.30 (+ uisp) でしか動作確認をしていません。Windows その他で使えるはずですが、ひょっとしたら動作、しないかも知れません。
posted by すz at 21:58| Comment(0) | TrackBack(0) | USB910B

USB910B とは

AVR の自作書き込み器です。

USB シリアルとして接続できる avr910 互換プロトコルの ISPプログラマで、拡張機能として、I2C マスタ通信機能+αを組み込んであります。

I2C デバイス用プログラムも作成していますので、ホストで プログラミングすることで、ISP を接続したまま各種のデバッグができます。

さらに、USB 接続なので、電源も供給でき、電流測定もできます。ついでに、チップ内蔵の温度計を読み取ることができます。

これだけの機能を 14pin の ATtiny44 だけで実現しています。回路も簡単なので、作成も容易です。

問題はまだ ATtiny44 の入手先が限られるということ。ATtiny44 の温度計はぜんぜん信用できないということ。電流計も なんだかイマイチです。

実は、上位版として USB910A (Advance) というのを既に作っていて、サブセットの機能を ATtiny44 で実現しているので、USB910B (Basic) と名づけています。

このカテゴリでは、USB910B の機能だけを使った AVR の実験や電子工作、それに、USB910B をベースにして作った なにか別のものの紹介をしたいと思います。
posted by すz at 18:57| Comment(0) | TrackBack(0) | USB910B