2007年06月14日

USB910のJTAG拡張案

デザインウェーブマガジン 2007年7月号 (2480円)には、付録に 250K ゲート相当 のFPGA Spartan-3E XC3S250E 基板が付いて来る。いままで、FPGA の付録は買ってきたが、実際になにかを作ったり動かしたりしたことはなかった。今度こそなにか動かしたいものだと思う。
FPGA のプログラミングはともかくとして、その前に USB910 を拡張して JTAG ケーブル 機能をつけてみたい。

USB の JTAG 関係で 参考になるものはないかと思い、sourceforge を JTAG で 検索すると ... xilprg というものが見付かった。
xilprg is a Xilinx FPGA/PROM/CPLD JTAG programmer tool for Win32/Linux.
Supports Parallel III cable, Digilent USB. cblsrv is a Open-Source CableServer for Xilinx Impact.

だそうだ。Digilent の
JTAG-USB
を サポートしていて、コンフィグレーションできるだけではなく、CableServer を使うと Xilinx のツールである iMPACT から直接書き込みできるようになるらしい。

というわけで、TAG-USB がどのようなプロトコルで通信しているか興味をもった。それは、xilprg の コードを見ればわかるわけだ。
前置きが長くなってしまったが、この JTAG-USB のプロトコルを紹介。

この JTAG-USB は、バルク転送で パケットをやりとりする。パケットの形式は、フラグ 4bit/コマンド 4bit , サイズ 16bit , データ (61 バイト)で、パケット全体が 64 バイトになるようになっている。 サイズの 16bit は、ビッグエンディアン で HI - LO の順。データ転送の場合、サイズには bit 数を入れる。データ転送でない場合は、バイトのようだ。

送信パケットのコマンドは、6 種類で 、受信パケットのコマンドは 1種類(0x06 固定)。送信パケットは、16 個まで連続して送ることができる。

送信パケット詳細

コマンド NULL (0x00)
サイズ 0
データ 0 バイト

受信パケット要求のコマンド。このコマンドを発行
したときだけ、受信パケットが送られてくる。

コマンド ENABLE (0x01)
サイズ 1
データ 1 バイト
0 : DISABLE
1 : ENABLE

初期化と終了コマンド

コマンド SET (0x02)
サイズ 1
データ 1 バイト
ビットマップになっていて bit の意味は以下のとおり
1 : TDI を HI
2 : TMS を HI
4 : TCK を HI

コマンド PUT_TDI_BITS (0x03)
フラグ RECIEVE(0x40) , TMS_HIGH(0x20)
サイズ bit数
データ (bit数 + 7)/8

TDI にビット列を送り込む。バイト内の並び順は
    LSB first
フラグには、受信データを用意する要求(?) の
RECIEVE と TMS の状態をセットする TMS_HIGH がある。
RECIEVE フラグを立て、コマンド NULL で要求して
はじめて、受信できる。

コマンド PUT_TMS_TDI_BITS (0x04)
フラグ RECIEVE(0x40)
サイズ bit数
データ (bit数 + 3)/4
PUT_TDI_BITS より高機能で、TMS の状態も 1bit
書き込み毎に設定する。(データの並び順は、TDI TMS
.... で 総bit数は、サイズで指定した bit数x2)

データには、TDI の状態 と TMS の状態が含まれる。

コマンド GET_TDO_BITS (0x05)
フラグ TDI_HIGH(0x10) , TMS_HIGH(0x20)
サイズ bit数
データ 0
TDI/TMS の状態を設定して TDO を読み取る。
受信するためのコマンドで、RECIEVE フラグは必要ない
が、コマンド NULL で要求してはじめて、受信できる。

こういうプロトコルなら、USBの遅延を隠蔽できるので、かなりのスループットが実際に出ると思う。また、JTAG だけでなく (標準的な)SPI にも使える。
よく考えられていると思うので、参考にして、USB910 の拡張をしようと思う。
コマンドは 数字('0' 〜 '5') を使いパケットは可変長にする。bit 数の 最大は 64 バイト分(512bit)かもうすこし大きめ。bitmap は USIを使う場合も考えて、MSB first。
こうやって USB910 を拡張して、xilprg を digilent 版ベースで改造すれば、iMPACT で使えるものになるはずだ。

それは良いのだが ... Digilent のものは、専用の USB インターフェイスがあるので、高速だ。それに対して、USB910 は 最大でも 80kbps ぐらいしか出ない。FPGA のコンフィグレーションとかは、それでがまんするしかないのだが、JTAG のバウンダリスキャン を使ってバスの状態を設定して、バスの上の FLASH ROM を書き換える用途などでは遅くて使えない。

たとえば、bit 数が 512 ほどあって、1 バイトのデータを書くのに
3 回 512 bit 送らなければならないとすれば、80kbps 出たとしても FLASH の書き込みは、52 バイト/sec になってしまう。FLASH が 4MBでも 22 時間もかかってしまう。

もうひとひねり必要だ。... 更新するデータだけを送り、複数の JTAG 転送をしてくれるような機能がないと使えない。そしてメモリもあまりない。
この部分は、まだどうしたら良いか思い付いていない。

なんだか USB910で無理やり機能をつけているからこうなってしまう気もする。AVRでの電子工作にこだわったとしても、ATmega88 と、FT245RL USBパラレル変換モジュールを組み合わせれば高速なものが作れると思うし、AT90USB162(pdf) なら、デジキーで購入可能で自由に高速なものを作れそうだ。そもそも、実用的かつ安価なものを求めるなら、Digilent の
JTAG-USB
を買うのも良いわけだ。

それでも、USB910(と AVR-CDC) にこだわりたい、USB910はいつも傍らにあるし、プログラムを作るだけでよいのだ。(ただし、Spartan-3E のJTAG は、2.5V なので、レベル変換は必要)。このブログのネタにもなるし、工夫の余地があって楽しくもある。


とはいえ、ATtiny861/ATtiny44 はまだどこでも入手できるチップではないので、いまは他の人に使ってもらうという立場ではない。
付録基板を USB から使いたい and/or I2CSND を使いたいという人のために、なにか考えようかと思う。
今のところFT245RL USBパラレル変換モジュール+ATtiny2313 を使って、USB910から I2C と JTAG拡張だけ抜き出したものが良さそうだと思っている。秋月で全部そろうし、USB910よりずっとJTAG の性能が良さそうだ。プロトコルをあわせておいて、xilprgの改造もする。あと、AVRDUDE とか UISP も改造すれば、AVR910の機能がなくともライタとして使えるはず。もしくは、ATmega88向けに USB910+JTAG拡張機能を BUILD できるようにするか... I2CSND 向けに シングルエンド ADC 機能と周波数カウンタ機能は移植したいところだ。


おわりに

デザインウェーブマガジン 付録の話題は、ネタふりにだけ使ってしまった。まぁ、実際なにか作りたいとは思う。だけれども、FPGA ならではのもので、あまり複雑な外付け回路を必要とせず、なにかの役に立つという条件を付けるとあまり作れるものがない。最近 I2CSND を作っているので、思いついたのだが、256〜384オペレータの FM音源で USBかMIDIインターフェイスを持っていてΣΔで DA変換(ウィキベディアの説明)してサウンドを出力する..とかはどうだろう。...といってもそこまでのものは、設計できる実力はない。設計する能力さえあれば、Spartan-3E XC3S250E はハード的にこれぐらいは可能だと思う。18bit 乗算器とブロックメモリが 12 個もあるし、PicoBlaze 12 個乗せてそれぞれ 32 オペレータ担当させれば、意外と簡単に作れるのかも知れない。が、なにしろ未経験なのでよくわからない。
posted by すz at 00:31| Comment(0) | TrackBack(0) | 日記

2007年04月06日

AVR-CDCの性能(2)

今回は、通信に使うコマンドを変えて send:recv の比率が 1:2 または 2:1になるようにして、I/O サイズによってどれぐらい性能が変わるのかを測定してみました。

I/OサイズとTAT


I/Oサイズとスループット


これをみると、すくなくともこの条件では Windows の方が圧倒的に早い。スループットで、2-3倍もあります。

I/Oサイズを大きくしていけば性能が上がっていく、レイテンシ(遅延)を隠すことができるので当然といえば当然ですが、実は他にレイテンシを隠す方法があります。



それは、ソフトウェアパイプライニングという手法で、一般にはCPUのチューニングに使われているものです。send と recv をずらすことで、レイテンシを隠すやりかたです。
さて、これを使うと性能がどうなるか見てみることにします。

I/OサイズとTAT (Linux)


I/Oサイズとスループット(Linux)


これは Linux の場合。TAT が短くなっています。スループットでみるとI/Oサイズが小さくてもピーク性能が出るようになりました。

I/OサイズとTAT (Windows)


I/Oサイズとスループット(Windows)


Windows の場合も 同じような効果はあるようです。

このパイプライングのコードを avrdude で試してみました。早くなったかというと ... Windows では全然変わらず。Linux では、Read(ベリファイ)は早くなったものの、Write は逆に遅くなってしまいました。

こういったことをいろいろやっていたのは、Windows で avrdude が遅いのをなんとかしようとしたためです。残念ながら、なかなか思うようにいかない結果になってしまいました。

追記

タイミングを変えてみようと思い、ISP書き込みのクロック周波数を上げてみたところ、Windows で (ISP書き込みの時間短縮以上に)高速化できることがわかりました。Windows は、↑のテストのようにすぐさまレスポンスを返す場合は早いけれども、ちょっとレスポンスに時間がかかる場合はかえって遅くなってしまう特性なのかも知れません。Linux では、なにやっても書き込み時間はこれ以上早くならない感じですが、読み込みは、まだ高速化できるようです。
パイプライニングの効果も確認できています。


書き込み ベリファイ
Windows 高速化版(100kHz) 14.05s 5.28s
Windows 高速化版(200kHz) 9.31s 3.25s
Windows パイプライニング(200kHz) 9.72s 3.19s
Linux 高速化版(100kHz) 6.58s 3.49s
Linux 高速化版(200kHz) 6.85s 2.40s
Linux パイプライニング(200kHz) 6.54s 1.81s
posted by すz at 01:44| Comment(2) | TrackBack(0) | 日記

2007年03月23日

AVR-CDCの性能

Low Speed とはいえ 1.5Mbps なんだから転送のオーバヘッドなんて気にしなくて良い ... なんて思っていませんか? それは大きな間違いです。

Low Speed では 1 パケットで最大 8 バイトしか送受信できないので、プロトコルのオーバヘッドの方が大きいのです。AVRusb.ZIPに含まれているAVR309補足を読むと、8 バイトで だいたい 2000 CPUクロックのようです。1byte = 10bit として bps 換算してみると、だいたい 480k bps になります。理論的な上限はだいたい 1/3 になる計算です。

さて、USB910 では、コマンドを送ってリプライを受け取る..というハンドシェークをしています。こういう使い方をする場合、遅延がものすごく大きくて、上の理論値など関係ないようなレベルの性能になってしまいます。

というわけで、いったいどれぐらいの実効性能が出るのか調べてみました。OS は Linux を使い、3 バイトのコマンドを送って Nバイト受信するテストと Nバイトのコマンド+データを送って 1バイト受信するテストをしています。



このグラフは、送信-受信の時間です。もう何バイト転送しようがあんまり関係ないという感じです。



こちらは、送受信のスループットを bps に換算したもの。こういう使い方だと1.5Mbps の1/50 出れば良いほうですね。

AVR910プロトコルと性能

AVR910プロトコルでは、Flash などの書き込みは、1 バイトづつ行います。コマンド+データの 2バイトを送信して、1バイトの結果を受け取るのです。そうすると...上のグラフで 5000 bps のレンジを使っていることになります。計算すると 1KBの書き込みデータを送るのに 4秒かかることになります。実際の書き込み時間は、7KBで30秒弱だったので、ほとんど転送時間が占めていることになります。

AVR910プロトコルは、バッファリングしないことが前提なのでこれを守る限り書き込み時間は早くなりません。ですが、たとえば 8バイト分のデータを一度で書いて、8バイト分の結果を一度に読み込むようにしたら... だいたい 25000 bpsのレンジになり 5倍近く高速化されることになります。もし、ページサイズ分のコマンドを連続して送って結果を一度で読み込むようなことができれば、さらに数倍になりそうです。できるかどうかわかりませんが、一度試してみようと思います。
追記:試してみました。

usb910a のコード 6918バイトの書き込み時間・読み込み時間
(uisp 使用 , コマンド起動時間を含む)

書き込み
uisp オリジナル: 29.129秒
ページ(64バイト)単位書き込み版: 5.729 秒
uisp パラレルポートライタ: 4.763 秒(参考値)

読み込み(ベリファイ)
uisp オリジナル: 13.939秒
64バイト単位読み込み版: 3.551 秒
uisp パラレルポートライタ: 4.212 秒(参考値)



コマンド実行時間で5.08 倍になりました。このうち 1.09秒は書き込み待ちで転送時間は 6.0 倍ぐらい?。-- さらに数倍というのは期待しすぎたようです。が、パラレルポートライタにだいぶ近い値。これ以上転送時間をチューニングしても全体の性能はあまりあがらなさそうです。

読み込みはもともと転送量が少ない(コマンド送信+2バイト受信)し書き込み待ちもないので書き込みよりは高速でした。でも十分遅いので、64バイト単位で読み込むようにしたら 3.9 倍に高速化されました。

でも、転送量を元に計算すると 1948 byte/sec -- たいした性能ではありません。ISP の最高クロックを 100 kHz にしているので、ISPの処理の上限が -- 3125 byte/sec。こっちの方がネックかも知れません。
posted by すz at 22:26| Comment(0) | TrackBack(0) | 日記

2007年03月20日

AVR Studio 4 + WINAVR を使ってみた

前にも書きましたが、私の開発環境は Linux です。しかも実は古い。いまだに gcc-3.4 を使っています。AVR Studio + WINAVR を使っているひとが圧倒的に多いと思いますので、AVR Wikiの情報をもとに いまさらながら Windows で build してみることにしました。

tar.gz のファイルを全部コンバートして、Project を作って、Makefile を修正して... 結構面倒ですね。

それだけでなく、typeB のバイナリが4158バイトになって4KBに収まらないという大問題が...

オブジェクトのサイズを比べると、小さくなっていたり大きくなっていたり... avr-libc で使っている部分も 32バイトほど大きくなっているようです。usb910conf.h を修正して機能を削れば小さくはできるんですが、あまり削りたくない。... でどうしたか。usbdrv.c のオブジェクトだけがかなり大きくなっているので、gcc-3.4 で作ったアセンブラファイルを持ってきて置き換えたら、なんとか 4094 バイトとぎりぎり収まるようになりました。

こういうことをするのは手間なので、これから zip 版も作ろうと思います。

というわけで、最新版は、usb910-0.3.tar.gzusb910-0.3.zipです。
最新版には、aps ファイルも入れておきます。上で説明したワザを使ってbuild するときは、typeBx.aps を使ってください。あと、RC発振器のキャリブレーションで使ったコードもサンプルとして添付しました。(こっちはASIS)
posted by すz at 23:57| Comment(0) | TrackBack(0) | 日記

作ってみようと思っている装置

いまのところ単なるアイディアメモ

(1)UNIX もどき USB Key
実はUSB910では、オリジナルのAVR-CDCに手を入れて getc/putc でプログラミングできるようにしていて、USB シリアル装置を手軽に作れるようにしている。で、なにか便利(そう)なものを作ってみようと考えていて思いついたもの。
この装置をUSBにつないでターミナルソフトを立ち上げ、ENTER を入力するとlogin: なんて出る。本当に login できて、いくつかのコマンドが使える。使えるコマンドは、ls と cat ファイル名と cat > ファイル名。あと rm ファイル名 は必要か。なんに使えるかというと、(他の)パスワードとか忘れそうだけれども秘密にしたいものの覚書。ファイルデータは、1件 1KB 以内で、32件までにして、I2C ROM に入れる。I2C ROM だけ抜かれたりしたときの対策に暗号化が必要で、暗号化のキーは本体のEEPROMに覚えさせてロックビットで保護する。最大の問題はコードのサイズ。 4KB に入れるのは無理そうだが、8KB には収めたい。装置単体でのパスワードの変更は無理だろう。で、どうするかというと、データをいったん全部吸い出して、あらためて パスワードと暗号化キーデータを生成して、EEPROM に書き込みデータを書き戻す...そういうホストプログラムがあれば問題ない。

(2)USB アイキャッチャー
LinkStationとか玄箱とかを愛用しているのだが、単体ではほとんど何も出力できないし、入力できない。ちょっとした情報でよいので入出力できるデバイスをつけたい。LCDキャラクタ/グラフィックディスプレイとかももちろん良いのだが、もっと小さくて目立つものにしたい。8x8 のドットマトリックスLEDを使ってボタンも2つほどつけて SW-55 のケースに収めることを目標にする。
AVRは、ATmega48 が良いんじゃないかと思う。ホストからコントロールするので、表示はどうにでもなりそう。
USB LCDキャラクタディスプレイを作るならLCD2USBがお勧め。プロトコルをこれにあわせたいとは思っているのですが、どうなるかはまだわかりません。

(3)I2C 高機能電源
PWM で降圧型DC/DC コンバータを作り、定電圧と定電流の機能を持たせてホストから機能設定とか電圧/電流をモニタできるようにする。できれば、NiMHの充電器として使えるようにしたいし、逆に充電したNiMHから昇圧できる機能もつけたい。コイルは共用できるはずでスイッチには Pch+NchのMOS FET を使う。AVR は 手持ちのATtiny26L..でできるとうれしい。なにを選択するにせよ、昇圧時は、自己消費が大きいとあまりうれしくないので、そのあたり工夫してみたい。

(4)I2C で制御する音を出すなにか
電子工作のテーマとして音を出すものを作るのは楽しい。I2Cドライバも作ったので、ATtiny45 (かひょっとすると 85) を複数個つかって音を出すなにかを作ってみたい。プログラム次第で簡単なものから高度なものまで作れると思うが、バーチャルアナログシンセなんてものにもトライしたい。外部クロック入力にして正確な音程を目指すのも良いが、RC発振器をキャリブレーションして使うというのも味があってよいかも知れない。電源ノイズが載るのだけは避けたいので、電源だけは専用の レギューレータをつけてやりたい。
posted by すz at 00:14| Comment(2) | TrackBack(0) | 日記

2007年03月16日

ケースと基板について

USB910を作るときコンパクトなケースに入れたいと思いました。最初に選択したのは、タカチ SW-55S です。秋月のC基板(ガラスエポキシ 片面/両面)を 1/2 弱 (33mm x 47mm) に切ったものを愛用しているのですが、このケースに、 それがちょうど入ります。

これは、TypeB 試作1号機ですが、フタに2箇所ネジ止めしています。こうすると配線が保護されるので、触って線が外れたり動かなくなるおそれが(ほとんど)なくなります。高さも 20mm (内寸は13mm) あって、USB B コネクタがぎりぎり収まります。


これは、TypeA 試作1号機なんですが、コネクタを横につけてしまい、ケースがちゃんと止まらないことに後で気づきました。あと無理に押し込んだので、改造とかがやりにくくなってしまいました。

もっと大きな基板でゆったり作った方が良さそうですが、タカチ SWシリーズには 20mm高 のものがなく収まりが悪そうで困っていました。で...千石で見つけたのがテイシンの TB-55シリーズ。現在テイシンのホームページには載っていませんが、20mm高で具合がよさそうです。中でも良さそうなのが、TB-55B(80x50) と TB-56B (95x65) 。TB-55Bのほうは、C 基板を 2mm ぐらい削れば入りそうです。基板を削りたくなけば、TB-56B が良さそう。TB-56B なら秋月で250円で売っているブレッドボードを乗せて試作ベースにするのも良さそう。

さて、基板を削ったり切るのに何を使っているか ... 前は三角のダイヤモンドやすりを使っていたのですが、とっても面倒でした。ホーザンのPCBカッターなんてのもあることは知っていますが、ちと高いうえ場所をとりそう。少しパワーのあるリュータに切断砥石をつけるというのも良いのですが、端を削るならともかく、基板中央を切るのは本体がじゃまで難しいです。あと回転数が高くて粉塵がけっこう出ます。
なにか良いものはないかと思って探して見つかったのが、電動飛行機用のギアダウンユニット -- OK模型 ギヤボックス GBX400 。プロペラ側に 3mm のネジが切ってあるので、ダイソーの 切断砥石とかダイヤモンドカッターをつけることができます。これを使って楽に基板を切ることができるようになりました。


(注意: 試すのは個人の責任でお願いします。試す場合には、メガネと防塵(or花粉症向けフィルター入り)マスクを付けることを強くお勧めします。手袋をする場合、軍手はまきこまれるおそれがあるので避けて、皮か厚手のビニール手袋にしましょう。)
posted by すz at 23:39| Comment(0) | TrackBack(0) | 日記

2007年03月14日

大失敗

i2c rom (at24c256) を使ってキャプチャーするものを作ってみましたが、
うまくいかないのでデータシートをよーく読んでみたら、64バイトのページを書き込む毎に、10ms も待たなければならないことに気が付きました。たとえば 64 バイトの書き込みで、400kbps だとすれば、転送時間はだいたい 1.5ms 。転送時間より書き込み待ちのほうがはるかに長くて、これを加えると 64 バイトで 11.5 ms と桁がかわってしまう。そうなると.. 8bit でデータをとっても 5.5K sps ぐらいでしかロギングできない。しかも 64バイト毎に 待ちが発生するので、バッファは 128B ぐらいはもたないとダメそう。
せっかく作ったので、とりあえず完成はさせたいとは思いますが、だいぶやる気が失せてしまったので、ペースが落ちそう。シリアル ROM だと配線量が少ないので、手軽に作れて良いと思ったんだけど...かなり甘かった。
代替案としては、M25P40 pdfを使うのが良さそうとも思うのだけれども、デジキーで買えるもののチップの入手性がいまいちだし。いっそのこと、AT91SAM7S にしちゃえば、32KのRAMと 533kSPS の ADC と USBデバイスが1チップに内蔵されていて便利そうなんだけども、それはAVRでないし。
posted by すz at 01:02| Comment(0) | TrackBack(0) | 日記

2007年03月07日

Tiny系BootLoader のアイディア

Google Code Searchで、ATTiny2313_bootloaderというものを見つけた。これを見ていて考えついたもの。
とりあえずターゲットは8KBのATtiny861とする。普通にプログラムを作りリンク(ld)のオプションに、-Ttext 0x1000 -Tdata 0x800160 とつけると何が起きるか... というと プログラム全体が 4KB のところに移動して、データのアドレスも 256B 後ろにずれる。スタックはメモリの最後を使うようになっているので、前半分は一切使わないようなものになる。もちろん割り込みベクタのアドレスも 後ろにずれるので、できたプログラムを書き込んだだけでは動かない。それは当然だが、たとえば ベクターの部分をコピーして 0 番地から書き込めばどうか。ベクターは rjmp が入っているので、単純なコピーではだめでアドレスも + 0x1000 しておく必要がある。そうするとそのプログラムはちゃんと動くはず。さて、アプリケーションプログラムをATtiny461としてプログラムする。そうすると 4KB以内のプログラムメモリ、(スタックも含めて)256B以内のRAMを使うようにリンクされる。これでお互いにまったく干渉しない2つのプログラムを突っ込めるようになったわけだ。
このままでは、後ろ半分にあるシステムプログラムには制御がわたらない。どうやって制御を渡すか。ひとつは、アプリケーションプログラムが、後ろのシステムプログラムをcallする。0x1000番地にベクタがあって、最初のものは初期化関数へのrjmpになっていることは判っているわけだから、0x1000 番地に jmp すればよい。いったんシステムプログラムに制御がわたれば、アプリケーション側のベクターを書き換えてしまえばよい。そういうやりかたがひとつ。システムプログラムでは、ベクターの領域はいくつかしか使わないのでそのうちのひとつをシステムコール関数へのrjmpにしてしまう。システムコール関数の第一引数を機能番号ということにしておいて、機能番号 0 を 最初のシステムプログラムの呼び出しということにしても良い。こちらの方法ならいくつか機能をいれることができる。また、このrjmp に細工をしてスタックも変更するようにしておけば、アプリケーションのリソース(スタック)を使わずに機能を実行できて都合が良いかも知れない。
いずれにしてもアプリケーションがシステムプログラムをコールしなければならないのは自由度が低いというデメリットがある。システムプログラム側がブートローダー機能をもっていれば、アプリケーションを書き込むときにベクターを最初からフックするようにできるのでアプリケーション側はシステムプログラムの存在を無視して作成することも可能になる。
さて、USBに対応したブートローダーというものを考えてみる。USBの機能を使うためには、INT0 (もしくはINT1)は、ブートローダが占有する必要がある。応答時間の制限という問題があり、アプリケーション側でUSBのコードを入れるのは不可能。また、USBのコードは2.6KB程度あり二重に持つのはコードの無駄。システムコール関数の機能の中にUSBの機能も入れるのが妥当ということになる。アプリケーションがUSB機能を使いたければ、enable する指示を出せばよいし、使いたくなければなにもしなければ良い。ただし、INT0とINT1はアプリケーションでは使えないという制限はつく。
さて、いつブートローダ機能を enalbe にするか。これが問題。アプリケーションが call してくれれば良いが、まったく動かないアプリケーションを作ってしまうこともあり得る。ブートローダenableのpinをひとつアサインしてボタンかなにかをつけ、それを押しながらUSBに挿すといったやりかたがないとマズそう。となると、Port はUSB機能の2pin を加えて 計3 pin ブートローダ側が占有することになる。それ以外ではアプリケーションがなにか明示的に機能をcallする。指示のひとつとして、WDTタイムアウトで ブートローダ機能 enable というのも良いかも知れない。ブートローダ機能の中にRAMの読みだし機能があれば、デバッグにも役に立ちそうだ。
こういうものはいったいどれぐらいのメモリを消費するのか?もともとアプリケーションでUSB機能を使うのならば、USB機能を移動しただけだからメモリを消費するとはいえない。ブートローダ機能だけならば、だいたい1.5KB ぐらいで済みそう。

...ということを考えていて、いつかUSB910A で USBブートローダ機能を実装してみたいと思っています。ただ、ブートローダenableのpinをどうするかというのが問題。いまのところ、VCC 電圧読み取り用のpin と兼用にしようかと...
posted by すz at 05:54| Comment(0) | TrackBack(0) | 日記

チップ初期化器のアイディア

AT90S1200用 内部RC発振回路有効化ボードの製作というのを参考にして、高電圧パラレル/シリアルプログラミングで、チップを初期状態にするものが作れないか。
これを使うケースは、RESET pin まで使いたいとか、ヒューズビット の設定を間違えたとかで、あんまり使用頻度は高くなさそうなので、チップはもっとも安い ATtiny2313 を使いたいし、電源も 5V 単一電源にしたい。
+12V 昇圧の部分は PWM で適当に昇圧して、TL431で+12V までに制限をかければフィードバックもいらず回路が簡単になる。インダクタは、秋月で扱っている マイクロインダクタ LAL02 47uH 専用ということにして、PWM の周波数と Duty を決めうち(250kHz , On-Duty 20%)にすることにすれば、再現性はかなり高くて、電圧が上がりすぎるとかの問題もおきにくいはず。具体的には、次の回路で十分ではないか。


書き込みについては、パラレルとシリアルの両方を試して、正しいシグネチャを返してくるほうでプログラムすることにしてシリアル・パラレル両方とも対応する。
で、問題はピンの数、かなり厳しい。信号線14と VCC, PWM, +12V出力で17pin になってしまう。+12V 出力をあきらめて、PWM スタート = +12出力ということにすれば 1 pin 減らせるが、立ち上がりの時間に条件があるかもしれないので無理かも知れない(大丈夫だと思うが自信なし)。プログラム中インジケータは PWM を流用することにする。+12V 出力制御がなければ +12V までの電圧がかかってしまうが VCCがOffなら問題ないだろう。OK のインジケータは、信号線のどれかを使うことにする。書き込みできれば HI-Z になっているはずなので問題ない。エラーの場合は PWM で点滅させればよいかも知れない。チップを初期状態にするだけなので、電源いれたら自動スタートでよくボタン類も一切なしにしてしまえば、一応 16(or 17) pin で作れることになる。
もし、ATtiny2313 で作れないとなると、ATmega48 が次の候補。ただし、そこまでいくと、ピンもメモリもあまるので、USB で接続して、まともなパラレルプログラマにしたいなんて考え出すことになる。結局作るのが面倒になってしまいそう。

... というのを作ってみたいとは思っているのですが、あんまり必要性がないので、アイディアのみで終わるかも。

Tiny2313 専用ですが、Tiny2313リセッターというのがあるようです。同じ チップを使って亀の子にするのは手軽でよさそう。

この昇圧回路、電流はほとんど流せません。2-3 mA ってとこみたいです。高電圧プログラミングには、それで十分みたいですが他の目的には使えないでしょう。ちなみに、20% Duty 固定なら、8MHz クロックで、6:30とかすればよいので、どのAVRでも問題ないはず。
posted by すz at 04:09| Comment(0) | TrackBack(0) | 日記

鶏と卵

AVR でUSBプログラマを作っても、それ自体にプログラムを書き込むために別のプログラマが必要になってしまいます。プログラマがないとプログラマが作れない... 鶏と卵の関係ではありませんが、困ったことです。

ここでは、ものすごく簡単にできるプログラマを紹介しておきます。

なひたふさんのNAXJPのページで紹介されている ダウンロードケーブル
がオリジナルです。このケーブルのGND以外の信号線に 150Ωぐらいの抵抗をいれれば、3.3V電源でも 5V電源でも使えます。DSUB25 pin オスコネクタは、秋月で50円で買えますし、ケーブルには、カモンの USB-05USB-08を使うのが便利です。シールドされているので、80cm の USB-08 でも問題なく書き込みできます。抵抗は1/4Wタイプの大きめのものを使い。ケーブルと半田付けしたあと熱収縮チューブで絶縁+強化しておきます。信号名は、TDO = MISO,TCK = SCK, TDI = MOSI, TMS = RESET と読み替えます。



このケーブルを xilinx JTAGケーブルとして使えばOK。uisp を愛用していますが、これだと -dprog=xil と指定します。

このケーブルは1つあると便利なのですが、パラレルポートを使うので PCによっては使えないかも知れません。また、なんらかのミスでパラレルポートを壊してしまうかも知れません。パラレルポートはあんまり使わないので壊してもあまり困らないかも知れませんが、このケーブル自体が使えなくなってしまいます。だからやっぱりUSBのプログラマが便利なのです。

AVR の世界では、パラレルポートのピンの割り当てが違うSTK200ケーブルというのがあるようですね。ChaNさんのAVR ライタ作品集にある Stk200の簡易版のほうが良いかもしれません。


追記 avrdude で使うには

オプションに、-c xil をつけます。


# avrdude -p t861 -c xil -t
avrdude: AVR device initialized and ready to accept instructions

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

avrdude: Device signature = 0x1e930d
avrdude> q
avrdude: safemode: Fuses OK

avrdude done. Thank you.
posted by すz at 02:16| Comment(0) | TrackBack(0) | 日記

2007年03月05日

ソースコード公開

ソースコード usb910-0.5.tar.gzusb910-0.5.zipを置きました。

ついでに作った装置の写真を載せときます。

TypeA 試作1号機

秋月C基板を1/2 にして タカチSW-55 に入れようとコンパクトに作ってみたのですが ... ちゃんとケースに入れるのは失敗。それはそれとして、結構いろいろな実験に使えて重宝しています。

TypeB 試作1号機

Tiny44 を使ってみたかったので、機能を省いてコンパクトにしたものを作りました。タカチSW-55 にもきっちり入ってなかなか外観は良いのですが...実験ではTypeA ばかり使うので、まだあまり出番がありません。

実験ボードその1

I2C ROM(左下) の読み書き、8pin AVR (Tiny13,45V) (左上) と Tiny44 (右)の書き込み用のボードです。TypeA を使うと、RC発振器 のキャリブレーション、ADC のキャリブレーションもできます。

実験ボードその2

こちらは、Tiny26/Tiny861 の書き込み、各種キャリブレーション用ボード。それだけでなくて、+12V 昇圧回路と 8pinAVR, Tiny44 の 高電圧シリアルプログラミングの実験ができるようにしています。
posted by すz at 16:36| Comment(0) | TrackBack(0) | 日記

2007年03月01日

USB910のパーツについて

入手が難しいパーツやお勧めのパーツについてのコメント

ATtiny44-20PC , ATtiny861-20PC デジキーで取り扱い開始
ATtiny861はずっと買えるようになるのを待っていたのです。買ったら早速使いたくなってUSB910Aという形になりました。それに対してATtiny44 はおまけ的存在。小さいだけがメリットかも知れません。

QIコネクタ、QI片端圧着済ワイヤー 共立
ISPケーブルを作るのによさそうです。1x5 も 2x3 もあります。圧着は面倒なので、QI片端圧着済ワイヤーも一緒に買うと良いと思います。

カモン USB-05 千石で 231円
カモン USB-08 千石で 263円
両端に QIコネクタ1P x 5がついたシールドケーブルが2本セットになっています。ISPケーブルを作るのに便利。半分に切って中のコードを抜けば、QIコネクタつきケーブルが 16本も得られます。

3.6V ツエナーダイオード 千石でHZ4A−2が10本210円、100本630円。デジキーで 1N5227B が10個95円、共立で 0.5W 15円
低電圧のツエナーダイオードは千石が扱っているのを知らずデジキーでチップタイプを買ってしまいました。

超小型スライドスイッチ IS-1250 秋月で 4 個100円
とても便利です。お勧め

片面ガラスエポキシ・ユニバーサル基板Cタイプ 秋月で60円
スルーホールユニバーサル基板より作りやすいかも。

3端子レギュレータTA48M033F 秋月でコンデンサをセットして100円
定番だと思います。

12MHz 水晶 秋月では、10個500円。
10個もいらないならデジキーでついでに買うという手がありますが、電子工作するなら10個ぐらい買っておいたほうが良いと思います。

ピンソケット(1×14)秋月で50円
基板取付用USBコネクタ(Bタイプ)秋月で50円
在庫切れのこともあるようです。買えるときにいくつか買っておくと良いかも

抵抗 1Ω 1/6W 秋月で 100個100円
 
電流測定用で、1/6Wなら400mA まで。これぐらいがちょうどよさそう。電流測定の精度はあまり期待できないので、5% ぐらいで十分。10uF のチップ積層セラミックコンデンサをパラにつなぐと cutoff 16kHz のLPF になるので、ノイズ対策によさそう。


実験で使うかも知れず特殊かも知れないパーツ

TL431 秋月で10個100円 基準電圧キャリブレーション用
チップ積層セラミックコンデンサ 10 μF [3216] 6.3 V 秋月で10個100円 基準電圧キャリブレーション用
TL431は、10uF ぐらいをつけないと発振する場合があります。3216サイズなら手配線しやすいので入手しておきましょう。

電流測定用に必要になりました。

チップ積層セラミックコンデンサ 4.7 μF [3216] 25V 秋月で20個100円 12V昇圧回路実験用
16V 耐圧では不安なので、25V 耐圧のこれを買っておくと良いと思います。

マイクロインダクタ 47μH 秋月で10個100円 12V昇圧回路実験用
実験では、高電圧シリアルプログラミングのテストで使ってみました。あまり電圧が高くなるとコンデンサがやばいので、これぐらいからテストするのが良いと思います。ものは、LAL02NA470K max 70mA / 5.8 Ω

LHLZ06NB 100μH 0.57A とか 47μH 0.82A とか。千石で10個270円 
旧製品のLHL06NBと同じ大きさで3倍近い電流が流せる。安いしコンパクトなのでお勧め。実験でも使ってみるつもり。

I2CROM AT24C256(2.7〜5.5V) 秋月で 160円 
I2Cマスタのテストでまず使いました。あと、波形をキャプチャーする一時メモリに使う予定です。


SI91841DT-285 秋月で売っている2.85Vチップレギュレータ。中途半端な電圧ですが、150mA Ultra Low-Noise LDO Regulator だそうです。PWMで音を鳴らしたり、可変の基準電圧を作ってみたりしたいのですが、PWM は電源電圧の変動にもろに影響されるので、こういうので電源供給したらどうかと考えています。
posted by すz at 06:57| Comment(0) | TrackBack(0) | 日記

USB910Aの設計とデザイン

USB910A は、ソフトウェアには詳しいがハードウェアはあまり知らない ... そういう人が電子工作の世界に入るときに敷居が低くなるようにできないかということを考えて設計しています。(それはなぜかということは、また別の機会に書こうと思います。)

敷居を低くするには、したいこと以外のことはお手軽にできること...これが重要です。そういう意味で、USBで書き込みができて電源も供給できるプログラマがまず必要だろうと思います。 そういう装置が安く簡単に作れるということも大事です。このような理由で、AVR だけでUSB シリアルデバイスになるファームウェア AVR-CDCをベースにして、プログラマを作ることにしました。有名なAVRプログラマのプロトコルには、Stk500とAVR910そして、ブートローダ向けのAVR109の3つがあります。その中で最も簡単なAVR910互換にしました。その代償としてやや書き込みが遅くなってしまいました。AVR109互換の拡張をすれば数倍の高速化が可能なのはわかっているので今後改良していきたいと思います。

ちなみに高機能なプログラマ機能だけが必要ならば、製品を買うのが手っ取り早いです。Atmel が出している AVR Dragon が低価格で機能も高くお勧めです。AVR-Dragon は、オプティマイズ/ITプラザでも扱っているようです。自分で作ってみたいなら AVR Doperも良さそうです。

2007/5/24: AVR Doper のサブセット版の基板が つれづれ日記のゆきの研究室から出ました。→ AVR-Doperの小型基板製作。書き込み済み ATmega8 も分けてくれるので、これから AVR を始めたいひとにお勧め。
一方、 AVR Dragon は、電源部分が煙を出して壊れるロットもあるようです。情報収集をした上で購入するかどうか決めたほうが良さそうです。

2007/7/5: ゆきの研究室で USBaspが発表されています。キットになって出るようなので、これから AVR を始めたいひとにお勧め。avrdude-GUIもあり、AVR Studio 4 から直接使えます。あと、#173 COM-SPI ブリッジ AVRライタもお勧めです。こちらは、シリアルポートが必要ですが、USB-シリアル ケーブルでの接続でも 問題ないので、ノートPCでも使えるはず。


さて、プログラミングできて、電源も用意できた後は何が必要か..というと(作ろうとする装置はもちろん必要ですがそれを別にすると)デバッグ手段です。デバッグでは、ホストとお手軽に通信できることが重要です。LED を光らせるのも良いですが、それで得られる情報には限りがあります。そこから進んでいくとやはり大量のデータを見る手段がほしくなります。お手軽にするには、ISP ケーブルをつないだままプログラムを動かせばホストと通信できる必要がありそうです。

それが可能な通信手段は、ターゲットを AVR Tiny シリーズということにすれば、SPI と I2C に絞られます。一見 SPI が良さそうに思えますが、3 本だけで通信するのは実は面倒です。ISP や JTAG 、SDカードといったものは、SPI を採用していますが、信号線は4 本です。SPI はビット列を送るものなので、同期のために もうひとつ信号線が必要なのです。
それに対し I2C は、2 本の線で データのかたまり -- パケットを送受信できます。ということで、I2C でホストと通信する手段を提供することにしました。デバイス側のプログラムも提供しないと実際には通信できませんから、テンプレートを元にしてプログラムをかけば、したいことを簡単にできるような、I2C スレーブドライバの提供も合わせて検討することにします。

さて、それをさらに進めるとどういうものがあると良いでしょう?オシロスコープとかロジックアナライザなんていう以前に動作中にテスタを当てるのが実に面倒です。多くの ADC 入力があってそれらをターゲットに配線してしまえればどうでしょう。いったん配線してしまえば、あとはホストの操作だけで電圧を読み取れるとお手軽ではないでしょうか? そう考えて できるだけ多くの(といっても4本ですが)ADC 入力を提供することにしました。そのうち1つは、周波数も読み取れます。PWMを使って周波数を変更することで状態をホストで読み取るなんてワザも可能です。

さらに進むと、オシロスコープとは言わないまでも 波形が見たくなります。
USB910A は、メモリが少ないので波形を見るレベルにはできませんが、オプションで、波形をキャプチャーするデバイスを装着することを検討しています。

AVR の ADC で キャプチャーしたデータをI2C ROMに一時格納するものを予定しています。あまり性能は高くありませんが、ローコストかつ簡単に作れて音声領域ぐらいの波形は見れるようにしたいと思います。I2C はバスなので、こういうデバイスを追加できるという利点があります。


こうやって設計した USB910A を 実際に使った実験を ぼちぼち紹介していきたいと思います。

予告

電圧と温度を変えて、OSCCAL の値を変化させると どのようにクロックの周波数が変わるかの実験の紹介を予定しています。



こんなグラフも書けています。温度が10℃変わったときの違いより、電圧が 3.3V か 5V かの違いの方が大きいなんてことも分かります。


次に 温度計のテスト。Tiny45 や Tiny44 の温度計は信用できないなんてこと
をデータで見せたいと思います。第三は、昇圧DC/DC コンバータの試作と
高電圧シリアルプログラミングの実験。.... あとはまだやっていませんが、
内部基準電圧のキャリブレーション、DCブラシモータの回転数制御の実験とそれに必要なオプションキャプチャーユニットの製作を予定しています。USB910A/B のソフトの公開が先ですが。
posted by すz at 04:12| Comment(0) | TrackBack(0) | 日記

2007年02月28日

ブログはじめました。

AVR というワンチップマイコンを中心にした電子工作やらプログラミングやらの話題を書きたいと思いブログを立ち上げました。

日記 というカテゴリは、雑多な電子工作についての話題。
USB910A,USB910B というカテゴリは、同名の自作ツールを使った電子工作についての話題で、ある程度 まとまったものを載せていこうと思います。
posted by すz at 18:49| Comment(0) | TrackBack(0) | 日記