« USB入門 | トップページ | USB応用 »

2007年10月21日 (日)

USB入門

USBCOMIO

最初は日々色々な事を書き綴ろうと始めたブログだが、このブログなんか電子工作ブログになってしまった感がある。結果、その筋のネタがないと書き込むべき記事が無くて、更新する気が起きなくなる。

いかん。

で、昨年からだらだらと続けている"AVRでUSB"であるが、最近
http://hp.vector.co.jp/authors/VA000177/html/FrontPage.html
AVRUSBEasyLoggerというのを知る。

これが凄い!何が凄いかと言うと、内蔵CR発振源のクロックで動作するUSBファームを書き上げている。実際ロースピードのUSBパケット1つを拾うのに必要な精度を以前計算した事があるが、とてもCR発振源では必要精度を満足させる事は出来ない気がする。
実際セラロックを使ってUSBファームを書いて見たが、特定のハードウェアではうまく動作しなかった。大半のマシンでは動作するのが、PCIバスに挿したUSB拡張カードでは不安定で認識にしくじる事がある。やっぱりクリスタルは必須かと思っていたが、そこに、

「内蔵CR発振源!?」

である。早速ソースコードを読んで見る。

「なるほど!やられた。」

物凄い衝撃を受けた。脳天に特大の金たらいが落下したくらいの衝撃!正直妬ましいくらいのアイディア。

簡単に説明すると、私のシステムの場合20MHzのセラロックを発信源に使っている。この場合、ロースピード1.5MHzのパケットを送受信するには、1ビットを13.333・・・クロックのタイミングでサンプリングする必要がある。

Bitsamp1

 

 

 

ただし、AVRで少数を含む数値をカウント出来ないので、3ビットサンプリングする毎に13,13,14クロックでサンプリングすれば、小数部の誤差をカバー出来る。
この方法で、20MHzの発信源を使ったAVRでも1.5MHzで作動するパケットを送受信できるが、1パケット送受信する間サンプリングするタイミングがきちんと拾うビットの遷移期間に収まっている精度が発信源に求められる。セラロックでは非常に微妙だ。

そこにCR発信源である。どう考えても必要精度を満たしていない気がするし、実際満たしていない。で、EasyLoggerでは何をやっているかと言うと、NRZIのビット挿入を省いた8ビット分(つまり1バイト)をサンプリングするために、必要なクロックより少ないクロックでサンプリングするループを組む。必然的にサンプリングタイミングは前方にずれる事になる。
そこで、各ビットをサンプリングする際、ビットの遷移期間の前方境界直後とビットの中央部をサンプリングして、この値が異なればサンプリングタイミングを後ろにずらすという方法で同期を取っている。

Bitsamp2  

 

 

連続するビットが同じ値だと同期のずれを検出出来ないが、データはNRZIで符号化されていて、6ビット以上同じ値が続く事は無く、この方法は有効である。

「凄いわ。このコード」

このコードを読んで一気に発奮!同期補正を行うコードを組み込んで見る。
動作原理はこうだ。8ビット(1バイト)を1つのループで組み、各ビットを14,13,13,14,13,13,14クロックの周期でサンプリングする。これだと1バイトサンプリングする毎に0.333・・・クロック分サンプリングタイミングが後ろにずれる事になる。
そこで、1ビットサンプリングする際にビット中央部と後方境界を比較し同期を補正する。この方法で同期補正のついでに、0.333・・・のクロック誤差も補正する。

Bitsamp3  

 

 

この方法でファームを書いてテスト。

「おおぉ。認識する!」

今まで接続が不安定だったPCとでも、安定して通信できる。
気を良くしたので、一気にWindows側のドライバも書き上げて見る。
出来上がったのがこれ。

Avrusbcomio01 

 

 

 

 

 

  Avrusbcomio02  

 

 

 

 

 

 

 
AVR Tiny2313を使った汎用I/O。WindowsからはCOMポートとして見えるので、シリアル通信を行うアプリケーションからAVR Tiny2313のポートBを操作出来る。
senshuさんから紹介してもらったキットを参考にして、ブレッドボードに挿せるようにして見た。

Avrusbcomio03  

 

 

 

 

 

 

ブレッドボード上で実験。うまく動作しているようだ。
取り掛かってから約1年掛かったが、何とかAVRでUSBデバイスを作る事が出来た。
一応「車輪の再発明」完結。

AVR Tiny2313 USB 汎用 I/O:ダウンロード

|

« USB入門 | トップページ | USB応用 »

コメント

ご無沙汰しております、でんし研のTADです。
EasyLoggerすごいですね、Morosanさんの説明は解り易いです。
私の方はこの所おきらくネタしか書けていませんが・・・。
たまにで良いので面白いものがあったらご紹介願います。

投稿: TAD | 2007年10月23日 (火) 00時29分

TAD師匠お久しぶりです!

でんし研毎月楽しみしております。
エレキジャックも拝見させて頂きました。

Dualライタのおかげで、AVRに入門する事が出来ました。師匠のコードを参考にして、また変なデバイスでAVRISP互換ライタを書いて見たいです。

コメントありがとうございます。
今後とも宜しくお願い致します。

投稿: Morosan | 2007年10月23日 (火) 16時44分

こんにちはirukaです。
ご成功おめでとうございます。

ついに、この世に存在するSOFT USBドライバーは obdev,igor,morosanさん作の3種類になりました。

素晴らしい!

投稿: iruka | 2007年10月26日 (金) 13時43分

irukaさんこんにちは。

irukaさんのサイトの見て、モチベーションが上がりました。おかげで何とか書き上げる事ができました。
私のUSBファームは車輪の再発明で、先人の偉業には及びません。

FrontPageの記事、楽しみにしております。

投稿: Morosan | 2007年10月27日 (土) 21時02分

遅ればせながら、完成おめでとうございます。

こうした実験に最適な実験用のボードを準備中です。

手元に試作ボードがありますので、早速試してみたいと思います。

ブレッドボードに挿せるMorosanさんの手作りボードにも感動です。

投稿: senshu | 2007年10月28日 (日) 23時12分

Senshuさんご無沙汰しております。

また、面白そうなボードを作られている様ですね、楽しみにしています。

コメント有難うございます。

投稿: Morosan | 2007年10月29日 (月) 17時42分

AVRCOMIOの追試を行ってみました。

http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2FCOMIO

↑のURLに簡単な紹介を書きましたので、
時間があればご覧ください。

投稿: senshu | 2007年10月30日 (火) 18時58分

Senshuさん、追試ありがとうございます。

実験風景を見せて頂きました。面白そうな基板ですね。

コネクタを抜くと次からデバイスを認識しないとの事ですが、Comポートを開いたままデバイスの抜き差しとかやって無いでしょうか?

私の所だと、問題無いのですが・・・。

投稿: Morosan | 2007年10月30日 (火) 19時54分

COMポートは閉じた状態で、Bコネクタを抜き挿ししています。

OSはWindows 2000ですが、これが関係しているのでしょうか。
回路を修正するときに、ちょっと不便です。XPで問題ないのなら、
他のPCで試してみたいと思います。

現時点では、コネクタを抜いたとき「取り外しの手続きをせずに
抜いてはいけません」的なメッセージがでます。

何かご存知でしたら、アドバイスをお願いいたします。

それから、試作に使ったWSN179基板は、ws☆NAKさんから、11月初めに
販売再開予定となっています。

丸ピンソケット部分は、一列のピンヘッダを下向きに取り付ければ、
ブレッドボードに差し込めるように設計されていますが、場所を取る
ので、私は写真のようにして使っています。

投稿: senshu | 2007年10月30日 (火) 20時39分

その後、一部、基板の実装を変更しました。

この方がやはりスマートですね。

コネクタ抜き差し時の不具合画面を掲示しましたので、
何かわかりましたら、アドバイスをお願いいたします。

それから、ReadMe.pdf ファイルを読んで、以下の点が
気になりました。

1. 発信 → 発振
2. 氏レベル事 → ???
3. としてで書かれていま。、 → で書かれていますので、
4. ページ番号がありません。

typoだと思いますので、次回の更新時に反映していただければ
幸いです。

投稿: senshu | 2007年10月31日 (水) 09時51分

Senshuさん、検証ありがとうございます。
当方にWin2000の環境が無いので、良くわからないのですが、WinXPでは必要無くてWin2000では応答する必要のある、何らかのPnPリクエストがあるのかもと想像します。
(正解かどうかは分かりませんが)

で、デバッグビルドしたドライバを提供しますので、Senshuさんの環境でカーネルデバッキングが行えないでしょうか?

ReadMeの校正ありがとうございます。

投稿: Morosan | 2007年10月31日 (水) 23時40分

Morosanさん、こんばんは。

デバイスドライバを作成したことがないので、出来るかどうか
不安ですが、詳細を指示していただければ、何とかなると思います。

教材として利用したいので、何とか安定に稼動させたいと思っています。

DDKも昨年の版までは持っていますので、自前で取り組むことも可能な
はずですが、、、。

なお、連絡先は、私のWebサイトに書いてあります。

投稿: senshu | 2007年11月 1日 (木) 00時08分

ご協力感謝します。

必要なものなのですが、ターゲットPC(シリアルポートのあるもの、USB-シリアル不可),モニタ用PC,シリアル用クロスケーブルが必要になります。
それとMicroSoftからダウンロードできるWinDbgが必要です。

用意できますでしょうか?了承頂けるなら、詳細を連絡致します。

投稿: Morosan | 2007年11月 1日 (木) 18時55分

早速のご返事をありがとうございます。

上記のものは準備できます。作業に要する期間は
確約できませんが、出来る限り問題の解決に努力
したいと思います。

よろしくお願いいたします。

投稿: senshu | 2007年11月 1日 (木) 21時29分

OSの違いで不具合が起きるのかを確認してみました。

・WindowsXP…抜き差ししても、ほぼ問題なし
(ハードウェアのためか、時々認識に失敗する)

・Windows2000…抜き差しすると、OS自体が不安定になる。
(認識の問題は抜き差しが出来ないため、判定不能)

ということで、OSによる問題が原因と考えてよさそうです。

何とか改善できれば良いのですが、、、。

投稿: senshu | 2007年11月 2日 (金) 17時45分

はじめまして、kumanと申します。

無学なので内容は理解できないのですが、つい先ほどハンダ付けが終わりました。

senshuさんのご紹介で見せていただき、コピーを作りました。以前のigor(?)さんの物はどこかうまく動かなかったのですが、今回は出力のLEDが正しく表示されています。
素晴らしい物をありがとうございました。どのように使えるかは自信がありませんがぼつぼつ勉強します。

私のコンピュータは5Vで認識しますので対策はしていません。
回路図のGNDに入っているC2はどのような働きなのでしょうか。理解できないので省略しています。

投稿: kuman | 2007年11月 2日 (金) 22時40分

Kumanさんはじめまして。

以前より「AVR試用記」拝見させて頂いております。
C2ですが間違いです、お恥ずかしい。
簡単な回路なので、回路図は最後のドキュメントの作成の段階でパパッと書いた物です。注意を怠りました。本来はパスコンです。

自分で書いた回路図を見て
「あちゃー!」
という感じです。

ご指摘ありがとうございました。

投稿: Morosan | 2007年11月 4日 (日) 09時44分

早速のご返事、ありがとうございました。

ところで、PC-MCU関係のソフトにうといのですが、excelとEasyCommを使ってVBAで書けないものかと試みましたがソフトが認識しないようです。

TeraTermとハイパーターミナル(なぜかエンドレスリピート)ではアスキーコードを送れた(LEDアレイに表示された)のですが、上記の組み合わせではダメのようでした。

ExcelのVBAで扱えるとどこにでもあるので便利かと思うのですが、良い方法はないでしょうか。ご存じでしたらよろしくお願いします。なお、組み立て記をUPしました。

投稿: kuman | 2007年11月 4日 (日) 19時38分

Kumanさん

組み立て記拝見いたしました。
フラットパッケージへのはんだ付け凄いですね。

EasyCommの件ですが、
http://www.activecell.jp/cgi-bin/cbbs3/cbbs3.cgi?mode=one&namber=97&type=96&space=15&no=3
が参考にならないでしょうか。
私の書いたドライバは、サポートしていないリクエストに対しエラーの代わりに"STATUS_NOT_SUPPORTED"を返しています。

ターミナルでのリピートですが、
通常のCOMポートに接続されているデバイスの場合、ターミナルのReadリクエストに対し読み出すべきデータがない場合(デバイスからデータを受信していない等)、ドライバはこのコンテキストをデータが取得出来るまで待たせます(制御を返しません)。
ところが、USBCOMIOの場合Readリクエストに対しすぐにPINBの内容を与え制御を返します。このため、絶えずターミナルはReadを行い、得られたデータを画面に出力します。
PINBは常に読み出し可能なので、読み出すべきデータが存在しないという状況は無い(つまり常にデータを受信している)と私が解釈した結果の実装です。

例えばPINBの読み出し値に(直前の読み出し値に対し)変化が無いならば、データを出力(USBデバイスがホストに向かって)しない(読み出すべきデータが存在しない)という制御も可能で、この場合ファームに少しの手を加える事で実現可能と思います

投稿: Morosan | 2007年11月 5日 (月) 14時44分

不具合が解決しました。

Morosanさんから送っていただいた、デバッグビルドした
ドライバを使い、不具合の原因を追求しました。

その結果、以下のことがわかりました。

1. Windows2000 でコネクタの抜き差し時にハングする。
⇒ LIBUSBのフィルタドライバをアンストールする。
何らかの干渉がある模様。真の解決には時間を要するため、
このドライバを除去した。ただし、libusb-win32ドライバが
あれば、USBaspは動作する。(私にとっては問題なし)

2. Windows XPにおいて、USBCOMIOの認識が不安定
⇒ USBケーブル(1.8m)を90cm程度に短くしたところ、
安定度は格段に向上した(10回程度の抜き差しでは
エラーは起きなくなった。ケーブルを元に戻すと再現
します。ハード面の改良が必要かもしれません。)

当面、利用する上での障害は解消しました。
フェライトビーズを信号線に入れるなどの対応を施して
みたいと思います。

投稿: senshu | 2007年11月 7日 (水) 10時08分

Morosanさんのアドバイスにより、私のところで起きていた
一連の問題が解決しました。

今考えると、混沌としたWindows環境の中で安定したドライバを
開発するのは非常に難しいことを実感しました。

私が利用しているWindowsXP環境において、安定した動作をし
なかったのはハードウエアの構成も影響しているのかも知れま
せん。

USBケーブルを短めなものを使って動作確認することをお勧め
いたします。

20MHzというAVR tiny2313マイコンの最高速度で動作させることが
できるのは素晴らしい工夫です。これらの仕組みを理解し、独自の
使い方を工夫したいと思います。

Morosanさん、どうもありがとうございました。


投稿: senshu | 2007年11月 8日 (木) 06時49分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/180469/16710120

この記事へのトラックバック一覧です: USB入門:

« USB入門 | トップページ | USB応用 »