<   2009年 12月 ( 15 )   > この月の画像一覧

 

PICでUSBだも14(Bluetooth初期化)

PIC24FJ64GB002でUSBホストの実験追記

Bluetoothデバイスの初期化がとりあえずできた
デバイス名とClass of Deviceを送信して、ScanEnableを発行した所
Windowsからデバイスとして認識しているようだ

これから上位のプロトコルを実装しなければ何の役にも立たない
はぁ~
USBプロトコルの記述が間違っているのか、Bluetoothプロトコルの記述が間違っているかが
難所になりそう

とりあえず写真添付
a0147557_17121027.jpg

Bletoothデバイスを接続したところ

a0147557_17123517.jpg

Windowsで接続機器として認識された所(デバイス名は設定どおりになっている)
[PR]

  by komoremi | 2009-12-30 17:14 | PIC-USBホスト

PICでUSBだも13(usb_host_generic考察2)

PIC24FJ64GB002を使ったPICでUSBホストの実験追記

やっとUSBデバイスからのレスポンスが正常に返ってきた
長かった~
USBのプロトコルを全然理解しないまま始めたおかげで、二週間かかってしまったorz
まだUSBプロトコルの理解不足が多々あります
ここまで試行錯誤して行っていたUSBデバイスはBluetoothのデバイスです
BluetoothのUSBデバイスが近所のPCショップで980円で売っていたので
思わず二個購入してしまったのが、この難関の入り口でした
購入したBluetoothデバイスはこれ
a0147557_47835.jpg


HCIコマンドを打てども打てども、帰ってくるレスポンスは0x0Fなり~~

結局、コントロール転送のSETUP部分にデータ長を入力していなかったのが原因
STALLしまくりで、泣きが入っていました

とりあえず、HCIコマンドリセットを受け付けるようになりました

Bluetoothのプロトコルは全然理解していないので、まだまだ先は長い。。。。
[PR]

  by komoremi | 2009-12-29 04:10 | PIC-USBホスト

PICでUSBだも12(usb_host_generic考察1)

うーん
色々とUSBのプロトコル勉強しています
232Cがユーザ任せな通信手段に対して、USBは様々な決まりごとがあって、
その理由が、「そういうものなのか、、、」と思えれば習得も早いのだろうけれど、
「なんでそうなるんだ??」と考えるとなかなか前進しません
全ての学習にいえる事なんでしょうけれど、諦めずに進めばそのうち道は開けると信じるしかない

その信条が途中で折れてしまうと、挫折となるんだろう
そんな事は重々承知のつもりだけれど、折れそう。。。

てな具合でPIC24FJ64GB002を使ったUSBホストの実験途中経過報告

Microchipのusb_host_genericサンプルプログラムで手元にあるUSBデバイスの
デバイス情報を取得してみました
コントロール転送で取得している構造体をprintf関数で出力した結果です
このUSBデバイスの情報をみて、何のデバイスを扱おうか分かる人がいたら師匠と呼ばせてください

**USB_ENDPOINT0_Address = 00
TransferType = Control
EndpointSynchronizationType = No Synchronization
EndpointUsageType = Implicit feedback Data endpoint
MaxPacketSize =0040
**USB_InterfaceNumber =01
**USB_DriverTable =01
**USB_InterfaceSettings =05
**USB_EndpointAddress =83
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0031
**USB_EndpointAddress =03
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0031
**USB_InterfaceSettings =04
**USB_EndpointAddress =83
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0021
**USB_EndpointAddress =03
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0021
**USB_InterfaceSettings =03
**USB_EndpointAddress =83
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0019
**USB_EndpointAddress =03
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0019
**USB_InterfaceSettings =02
**USB_EndpointAddress =83
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0011
**USB_EndpointAddress =03
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0011
**USB_InterfaceSettings =01
**USB_EndpointAddress =83
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0009
**USB_EndpointAddress =03
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0009
**USB_InterfaceSettings =00
**USB_EndpointAddress =83
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0000
**USB_EndpointAddress =03
** EndpointTransferType = Isochronous
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0000
**USB_InterfaceNumber =00
**USB_DriverTable =01
**USB_InterfaceSettings =00
**USB_EndpointAddress =82
** EndpointTransferType = Bulk
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0040
**USB_EndpointAddress =02
** EndpointTransferType = Bulk
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0040
**USB_EndpointAddress =81
** EndpointTransferType = Interrupt
** EndpointSynchronizationType = No Synchronization
** EndpointUsageType = Data endpoint
** MaxPacketSize =0010

[PR]

  by komoremi | 2009-12-27 22:08 | PIC-USBホスト

PICでUSBだも11(usb_host_generic実験2)

PIC24FJ64GB002を使ったUSBホストusb_host_generic実験2
ここ数日、本を読んだりしてUSBプロトコルの入り口を勉強中

usb_host_genericの関数を利用して色々なデータ値を標準出力(printf)で吐き出している
なるほど~と思うものもあれば、サッパリ検討がつかないものまである

その中で、あれ?と思ったコードを訂正
コンパイラはC30を使用で、コンパイラがおかしいのかソースコードが
おかしいのかはよく分からないが、感覚的に間違っていると思う
様は、共有体のBYTEコードを16bit移動しようとしているのだ
案の定、Class定義でusb_host_genericを動かそうとしてもうまくいかない場合がある
ワーニングが出てコンパイラを通ってしまうので、悩む人がいる事だろう
訂正箇所は、usb_host.h の中の // Section: TPL Initializers

元は、
#define INIT_CL_SC_P(c,s,p) {((c)|((s)<<8)|((p)<<16))}
で、
#define INIT_CL_SC_P(c,s,p) {(((DWORD)c)|(((DWORD)s)<<8)|(((DWORD)p)<<16))}
こうしてキャスト演算子をつけた

その後、Class定義のものでも正常にデバイスアドレスが振り分けられるようになった
MicrochipのAN1141(USB Embedded Host Stack Programmer’s Guide FIGURE 9:)
の説明でも #define INIT_CL_SC_P(c,s,p) {((c)|((s)<<8)|((p)<<16))} なってる

これで躓く人、、、いないか、、、
[PR]

  by komoremi | 2009-12-18 01:31 | PIC-USBホスト

PICでUSBだも10(usb_host_generic実験)

PIC24FJ64GB002を利用したUSBホスト実験の続き
usb_host_generic(汎用コード?)を使って、手元にあるUSBデバイスを繋げてみる

使ったMicrochipサンプルプログラムは、”USB Host - MCHPUSB - Generic Driver Demo”
に収録の物

USB-SD変換器を接続した場合、DEBUG_MODEを有効にしてシリアル出力を眺めてみた
接続する機器のVIDとPIDをWindowsのSnoopyProを利用してゲット
VIDは14CD PIDは8123
このVIDとPIDをサンプルプログラムのそれらしい箇所に記入

その他、サンプルプログラムは多々の周辺IOが繋がっているので、
そこら辺りのプログラムを全削除
USB-SD変換器を繋ぐとデバック内容がUART2で出力される(オリジナルの出力も含まれる)

System....Initialize OK
HOST: Initializing DETACHED state.
USB_INIT - USB_IDLE
>HOST: Starting settling delay.
HOST: Resetting the device.
HOST: Reset complete.
HOST: Reset complete.
HOST: Getting Device Descriptor size.
HOST: GET_DEVICE_DESCRIPTOR_SIZE_COMPLETE.
HOST: Getting device descriptor.
HOST: Validating VID and PID.
HOST: Device validated by VID/PID
HOST: Setting device address.
HOST: Getting Config Descriptor size.
HOST: Getting Config Descriptor.
HOST: Parse Descriptor success
HOST: Determine OTG capability.
HOST: ...No OTG.
HOST: Set configuration.
HOST: Initializing client drivers...
HOST: Using device client driver.
USBHostGenericInit!!
GEN: USB Generic Client Initalized:
flags=0x0000 address=0001 VID=0x14CD PID=0x8123
Device Attach!!
Device Adress = 0001


今度は、USB-SD変換器以外の物を接続してみた

System....Initialize OK
HOST: Initializing DETACHED state.
USB_INIT - USB_IDLE
>HOST: Starting settling delay.
HOST: Resetting the device.
HOST: Reset complete.
HOST: Reset complete.
HOST: Getting Device Descriptor size.
HOST: GET_DEVICE_DESCRIPTOR_SIZE_COMPLETE.
HOST: Getting device descriptor.
HOST: Validating VID and PID.
HOST: Device not yet validated
HOST: Setting device address.
HOST: Getting Config Descriptor size.
HOST: Getting Config Descriptor.
HOST: Client driver NOT found.
HOST: Client driver NOT found.
HOST: Client driver NOT found.
HOST: No supported interfaces.
HOST: Holding.


なるほど、、VIDとPIDが一致しないとデバイスドライバが見つからないとか出る
これで、USBのプロトコルを理解してプログラムを書けば、PICでUSBホスト機能が動くみたいだ
と、ここまで簡単に書いたが、ここに来るまでは長い道のりがあったです
[PR]

  by komoremi | 2009-12-15 03:31 | PIC-USBホスト

PICでUSBだも9(USB-SD変換書込実験)

近所のPCショップでUSB接続のSDメモリリーダを購入した(500円也)
これでやる実験は、PICのUSBホスト機能でUSB-SDメモリ変換が可能か?

結果) 可能

考察) SDカード直接叩いた方が良いだろ

いやまてよ、、、SDメモリ対応と明記しロゴを商品に表示するには
SDメモリ団体の認可が必要なはず
で、このUSB-SDメモリ変換器にSDメモリ対応と明記されていれば
このシステム自体はSDメモリ対応と明記できるわけだ!!

で早速書き込み速度の実験
10KHzのAD値(20Kbyte/sec)で頭打ち也

a0147557_18525513.jpg

[PR]

  by komoremi | 2009-12-11 18:54 | PIC-USBホスト

ロータリーエンコーダの信号変換

CPLDを利用して、ロータリーエンコーダの信号変換器を作った
つかったCPLDはザイリンクスのXC9572(たまたま手元在庫あり)

ロータリーエンコーダーのA相とB相を検出して2逓倍or4逓倍(選択可)の
CCWとCWを出力する機能
また、出力パルス幅は5usec or 15usecを選択可
出力信号はオープンコレクタ(2SC1815) 入力電源は9~24V(7805)で組み込んだ

16MHz水晶と74HCU04でクロック源をつくり同期信号をCPLDに取り込む
そのクロックで同期して出力するようにVHDLで回路をつくった

完成後、動作確認しているときにACサーボノイズで誤動作(信号無でONと認識してしまう)した為、
入力用レベル変換(電源電圧→5V)トランジスタのベース抵抗前に1000pFのコンデンサを挿入
その後誤動作は確認されず
オシロで信号波形見た所、ノイズ除去を確認

とりあえずロータリエンコーダ信号変換器の完成
心配なのは24V電源の場合7805が熱くなる点、ヒートシンクで熱対策?しているのでOKとしよう

a0147557_1393171.jpg

[PR]

  by komoremi | 2009-12-10 01:40 | 電子交錯

PICでUSBだも8(USBメモリ書込速度実験4編)

PICでUSBメモリに書き込む速度の実験(マイクロチップのファイルシステム)
バイナリで33KHz擬似AD値(AD取込で値を+1していく)を書き込んだ
512byte毎に書き込む処理

C#でバイナリファイルをテキストファイルへ変換するプログラムを作成
値をグラフ化
a0147557_0262755.gif

33KHzAD値バイナリ書込み
階段状になってしまう


a0147557_027065.gif

20KHzAD値バイナリ書込み
階段状になっていないが、サンプリング数30000付近で値が飛んでしまう

その後、15Khzや10Khzや5Khzで実験を行ったが、サンプリング数30000付近で
値が飛んでしまう現象を確認

サンプリング数を2000000個で確認すると、書込みが間に合わないのは30000辺りのみと分かった
但し、33Khzや20Khzや15Khzでは値が飛んでしまう状況が他の箇所でも数箇所確認された

10Khzの状態では上記減少はサンプリング30000付近以外では確認されていない

この状況はマイクロチップ社のライブラリに問題があるというよりも、USBメモリ自体に
なにか問題があるか、私がUSBホストプロトコルを理解していないせいであろうか、、、
機会があったら別のUSBメモリで試してみようと思う
とりあえず、このシステムを利用してデータを保存する内容が一秒間に最大500個程度なので
問題ないだろうと思う
[PR]

  by komoremi | 2009-12-08 00:39 | PIC-USBホスト

PICでUSBだも7(USBメモリ書込速度実験3編)

24FJ64GB002でUSBメモリを書き込むテストの追記

バイナリで書き込めるかの確認(AD取込速度33KHz)
mainルーチンで書き込むプログラムを作成
バイナリデータで擬似アナログ値を書き込めているようだ
ここでやばそうな問題発生
アナログ値のバッファを640word以上にするとコンパイルが通らない
リングバッファで書き込み処理を行っているので512wordで処理が間に合わなければ
どうせ間に合わないので一先ずよしとしよう

メモリ不足で先行き不安、、、、
a0147557_2442556.gif

(↑USBメモリにバイナリで書き込んだものをバイナリエディタで開いたところ)
[PR]

  by komoremi | 2009-12-07 02:46 | PIC-USBホスト

PICでUSBだも6(USBメモリ書込速度実験2編)

USBメモリにデータを書き込む命令

     FSfwrite(myData,1,510,myFile);

の前後にLEDを点灯、消灯させて
命令の実行時間を測定した(LEDデバック万歳である)
510byteデータを書き込む処理時間は、10.2msecなり
この測定結果を元にUSBメモリに書き込む限界速度byte/secは
1000÷10.2*510 = 50Kbyte/sec

但し、上記処理は33KHzでタイマー割込みとAD変換割り込みを行っている状態
割込処理へ飛んだり戻ったりする処理が33KHzで発生している状態での測定結果

こういった処理がUSBメモリへの書込み処理を遅らせている可能性もあると認識している

アスキーコードではなくバイナリで書き込めば間に合うのか?と思ったが
上記測定結果から考えると、16bitバイナリデータだと 25KHz/secでのアナログデータの取込が
限界になる計算になる

これは明日にでも実験してみよう

a0147557_15224878.gif

[PR]

  by komoremi | 2009-12-06 15:25 | PIC-USBホスト

SEM SKIN - DESIGN by SEM EXE