タッチ・マウスが動いた [タッチ・スイッチ]
(2014.02.27)
タッチ・マウスに”金属板を使った操作”と”4個のタッチ・スイッチを使った操作”の両方を組み込みました。デフォールトは”金属板を使った操作”で操作ボタンを押している間、”4個のタッチ・スイッチを使った操作”に切り替わります。
”金属板を使った操作”で細かい操作を行う必要が無くなり、”タッチ・スイッチを使った操作”で素早く移動する必要も無くなって、それぞれの機能がシンプル(加減速操作が不要)になりました。
さらに、想定していなかった効果も見つかりました。実はタッチ・スイッチを使った操作をテストしようとして、操作ボタンを押し忘れてタップしました。すると、タップする度にすこしマウス・カーソルが動くので、操作ボタンを押していないことに気付きませんでした。しかし、組み込んだ動作(シングル・タップなら1pixel、ダブル・タップなら5pixel移動)とはどこか違います。
???
『何だこれは・・・』
『あっ、操作ボタンを押してない』
『それなのにタップするとカーソルが動くわけ?』
『そうか、金属板を短時間だけ小さく動かしたのと同じ効果があるんだ!』
タッチ・スイッチを使った操作に切り替えないでも、指でタップすると『微妙な操作(小さな移動)が可能』という新しい機能を発見しました。
もしかして、”4個のタッチ・スイッチを使った操作”は不要だったのか?
orz
タッチ・マウスに”金属板を使った操作”と”4個のタッチ・スイッチを使った操作”の両方を組み込みました。デフォールトは”金属板を使った操作”で操作ボタンを押している間、”4個のタッチ・スイッチを使った操作”に切り替わります。
”金属板を使った操作”で細かい操作を行う必要が無くなり、”タッチ・スイッチを使った操作”で素早く移動する必要も無くなって、それぞれの機能がシンプル(加減速操作が不要)になりました。
さらに、想定していなかった効果も見つかりました。実はタッチ・スイッチを使った操作をテストしようとして、操作ボタンを押し忘れてタップしました。すると、タップする度にすこしマウス・カーソルが動くので、操作ボタンを押していないことに気付きませんでした。しかし、組み込んだ動作(シングル・タップなら1pixel、ダブル・タップなら5pixel移動)とはどこか違います。
???
『何だこれは・・・』
『あっ、操作ボタンを押してない』
『それなのにタップするとカーソルが動くわけ?』
『そうか、金属板を短時間だけ小さく動かしたのと同じ効果があるんだ!』
タッチ・スイッチを使った操作に切り替えないでも、指でタップすると『微妙な操作(小さな移動)が可能』という新しい機能を発見しました。
もしかして、”4個のタッチ・スイッチを使った操作”は不要だったのか?
orz
|
|
|
タッチ・マウスで再度の設計変更を決意した [タッチ・スイッチ]
(2014.02.24)
タッチ・マウスの開発がこれほど大変だとは思いもしませんでした。
当初の構想は、”プリント基板上に設けたタッチ・スイッチ電極とグランド電極間の接合容量を金属板で制御してマウス・カーソルを操作しよう”というものでした。概ね動いたのですが微妙な操作(例えばタイトルバー右上にある3つのボタンの上にマウス・カーソルを置く等)が難しく、足で操作するフット・マウスには出来そうもありません。
そこで方針を変え、4個のタッチ・スイッチで4方向の移動速度を制御することにしました。シングル・タップ、ダブル・タップ、シングル・タップ&オン等各種タッチ・スイッチ操作を組み込み、想定通りにマウス・ポインタを操作出来るようになりました。金属板のときは難しかった、細かい位置合わせもスムーズに行うことができます。しかし、その引き換えにマウス・カーソルをグルグル回す(金属板を使っていたときは簡単だった)操作が出来なくなりました。
それほど大きな問題とは思っていなかったのですが、使っている内にだんだん不満がつのってきて、マウスとして使い続ける気が失せてしまいました。
結局、どちらか一方だけでは駄目で、”金属板を使った操作と4個のタッチ・スイッチを使った操作の両方必要”ということに気付きました。
今度こそ、上手く行くと良いなぁ~
---------------------------------
HID(ヒューマン・インターフェース・デバイス)の開発は機能設計だけでなく、使い心地とか使っていて楽しいかどうかとか、そういう所の組み込みに難しさがあるように思いました。
---------------------------------
タッチ・マウスの開発がこれほど大変だとは思いもしませんでした。
当初の構想は、”プリント基板上に設けたタッチ・スイッチ電極とグランド電極間の接合容量を金属板で制御してマウス・カーソルを操作しよう”というものでした。概ね動いたのですが微妙な操作(例えばタイトルバー右上にある3つのボタンの上にマウス・カーソルを置く等)が難しく、足で操作するフット・マウスには出来そうもありません。
そこで方針を変え、4個のタッチ・スイッチで4方向の移動速度を制御することにしました。シングル・タップ、ダブル・タップ、シングル・タップ&オン等各種タッチ・スイッチ操作を組み込み、想定通りにマウス・ポインタを操作出来るようになりました。金属板のときは難しかった、細かい位置合わせもスムーズに行うことができます。しかし、その引き換えにマウス・カーソルをグルグル回す(金属板を使っていたときは簡単だった)操作が出来なくなりました。
それほど大きな問題とは思っていなかったのですが、使っている内にだんだん不満がつのってきて、マウスとして使い続ける気が失せてしまいました。
結局、どちらか一方だけでは駄目で、”金属板を使った操作と4個のタッチ・スイッチを使った操作の両方必要”ということに気付きました。
今度こそ、上手く行くと良いなぁ~
---------------------------------
HID(ヒューマン・インターフェース・デバイス)の開発は機能設計だけでなく、使い心地とか使っていて楽しいかどうかとか、そういう所の組み込みに難しさがあるように思いました。
---------------------------------
|
|
|
I2Cの通信ケーブル長を変えて実験してみた [タッチ・スイッチ]
(2014.02.06)
フット・マウスはUSBとI2C(スタンダード・モード)でRaspberry Piと接続する計画です。”装置間の通信には適さない”と言われるI2Cですが、フット・マウスに使えるかどうか試してみることにしました。
Raspberry Piとフット・マウスの間にブレッド・ボードを挟み、ケーブル長を50cm刻みに変えて10000回の通信を行い、通信エラーの発生件数をカウントしました。
ケーブル長 エラー件数
50cm 1回
100cm 2回
150cm 3回
ケーブル長に比例して、見事にエラー件数が増えています。たった1回テストしただけなので、”ケーブル長に比例してエラー件数が増える”と結論付けるのは早計ですが、『通信ケーブルを150cmまで伸ばしても、エラー・コレクションに配慮すれば十分使える』という感触が得られました。
フット・マウスはUSBとI2C(スタンダード・モード)でRaspberry Piと接続する計画です。”装置間の通信には適さない”と言われるI2Cですが、フット・マウスに使えるかどうか試してみることにしました。
Raspberry Piとフット・マウスの間にブレッド・ボードを挟み、ケーブル長を50cm刻みに変えて10000回の通信を行い、通信エラーの発生件数をカウントしました。
ケーブル長 エラー件数
50cm 1回
100cm 2回
150cm 3回
ケーブル長に比例して、見事にエラー件数が増えています。たった1回テストしただけなので、”ケーブル長に比例してエラー件数が増える”と結論付けるのは早計ですが、『通信ケーブルを150cmまで伸ばしても、エラー・コレクションに配慮すれば十分使える』という感触が得られました。
|
|
|
フット・マウスの構想が揺らぎだした [タッチ・スイッチ]
(2014.02.04)
フット・マウス基板4枚を組み合わせて、フット・マウスを組み立てました。基板のサイズ以外タッチ・マウスと殆ど変わらないので、タッチ・マウス用のプログラムがそのまま使えます。
基板4枚を組み合わせたフット・マウス
電極が大きくなった分、CTMUの充電時間を50%ほど大きくして、ほぼ同様の計測結果(2000カウント~8000カウント)が得られました。すんなり動いてしまい、開発はこれで終了する筈だったのですが操作感が気になり出しました。USBマウスとして”使える”レベルではありますが、使っていて楽しくありません。10cmのステンレス板も邪魔くさい感じです。
う~ん、困った。どうしよう?
取り合えず動くのだから、これはこれで良いとして、別の方法を試してみるか?
(<==とってもお気楽!こんなんで良いんだろうか?)
フット・マウス基板4枚を組み合わせて、フット・マウスを組み立てました。基板のサイズ以外タッチ・マウスと殆ど変わらないので、タッチ・マウス用のプログラムがそのまま使えます。
基板4枚を組み合わせたフット・マウス
電極が大きくなった分、CTMUの充電時間を50%ほど大きくして、ほぼ同様の計測結果(2000カウント~8000カウント)が得られました。すんなり動いてしまい、開発はこれで終了する筈だったのですが操作感が気になり出しました。USBマウスとして”使える”レベルではありますが、使っていて楽しくありません。10cmのステンレス板も邪魔くさい感じです。
う~ん、困った。どうしよう?
取り合えず動くのだから、これはこれで良いとして、別の方法を試してみるか?
(<==とってもお気楽!こんなんで良いんだろうか?)
|
|
|
USBマウスのレポート・ディスクリプタで悩む [タッチ・スイッチ]
(2014.01.29)
タッチ・スイッチ基板にUSBマウス機能を組み込もうとして、一つ判らないことが出てきました。Micrichip社のサンプル・プログラム(Device-HID-Mouse)はマウス・ポインタを操作するだけで、マウス・ボタンのON/OFFは行っていません。そもそも、Device-HID-Mouseにマウス・ボタン機能が組み込まれているのかどうかも判りません。orz
WEB検索を掛けて”HID-Mouse”に関する、情報を集めました。
<仕様書>
http://www.usb.org/developers/devclass_docs/HID1_11.pdf
<CQ出版 書籍抜粋?>
http://www.cqpub.co.jp/hanbai/books/33/33381/33381.pdf
<後閑さんの資料>
http://www.picfun.com/picclub/dai12/usbtech.pdf
<人と電子の工房さん>
http://esyokunin.dee.cc/30xSub_USB_Siyou/331_Siyou1_HidKb/331_Siyou1_HidKb.html
<きむ茶工房ガレージハウスさん>
http://www.geocities.jp/zattouka/GarageHouse/micon/USB/USB6.htm
”レポート・ディスクリプタ”が鍵を握っていることは判ったのですが、USB_DESCRIPTOR.Cの記述を見ても、その意味が掴めません。orz
で、ついにこの資料を見つけました。
<ルネサスエレクトロニクス>
http://documentation.renesas.com/doc/products/mpumcu/apn/rjj05b1417_m16cap.pdf
少し異なる部分もある(WHEEL機能が追加されている)のですがレポート・ディスクリプタの記述は殆ど一緒で、一つ一つの説明を読んでようやく理解することが出来ました。
Device-HID-Mouseのレポート・プロトコル・フォーマットは(多分)こんな感じです。
先頭バイトの下位3bitがマウス・ボタン
タッチ・スイッチ基板にUSBマウス機能を組み込もうとして、一つ判らないことが出てきました。Micrichip社のサンプル・プログラム(Device-HID-Mouse)はマウス・ポインタを操作するだけで、マウス・ボタンのON/OFFは行っていません。そもそも、Device-HID-Mouseにマウス・ボタン機能が組み込まれているのかどうかも判りません。orz
WEB検索を掛けて”HID-Mouse”に関する、情報を集めました。
<仕様書>
http://www.usb.org/developers/devclass_docs/HID1_11.pdf
<CQ出版 書籍抜粋?>
http://www.cqpub.co.jp/hanbai/books/33/33381/33381.pdf
<後閑さんの資料>
http://www.picfun.com/picclub/dai12/usbtech.pdf
<人と電子の工房さん>
http://esyokunin.dee.cc/30xSub_USB_Siyou/331_Siyou1_HidKb/331_Siyou1_HidKb.html
<きむ茶工房ガレージハウスさん>
http://www.geocities.jp/zattouka/GarageHouse/micon/USB/USB6.htm
”レポート・ディスクリプタ”が鍵を握っていることは判ったのですが、USB_DESCRIPTOR.Cの記述を見ても、その意味が掴めません。orz
//Class specific descriptor - HID mouse ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={ {0x05, 0x01, /* Usage Page (Generic Desktop) */ 0x09, 0x02, /* Usage (Mouse) */ 0xA1, 0x01, /* Collection (Application) */ 0x09, 0x01, /* Usage (Pointer) */ 0xA1, 0x00, /* Collection (Physical) */ 0x05, 0x09, /* Usage Page (Buttons) */ 以下省略
で、ついにこの資料を見つけました。
<ルネサスエレクトロニクス>
http://documentation.renesas.com/doc/products/mpumcu/apn/rjj05b1417_m16cap.pdf
少し異なる部分もある(WHEEL機能が追加されている)のですがレポート・ディスクリプタの記述は殆ど一緒で、一つ一つの説明を読んでようやく理解することが出来ました。
Device-HID-Mouseのレポート・プロトコル・フォーマットは(多分)こんな感じです。
先頭バイトの下位3bitがマウス・ボタン
|
|
|
タッチ・マウス・プログラムの不具合原因が見つかった [タッチ・スイッチ]
(2014.01.12)
タッチ・マウス・プログラムにUSBインターフェース機能(Device-HID-Mouse相当)を組み込んだのですが、マウスの動きがギクシャクして、正しく動作していないことが判りました。
”CTMUの計測結果を0にするとマウスがくるくる回りだす”ことを手がかりに、USBインターフェース機能に影響を与えている処理を絞り込んで行き、以下の処理にたどり着きました。
CTMUの計測結果を0にするとaverageDataが0になってctmu_log関数が呼び出されなくなります。そのctmu_log関数の呼び出しをやめると、CTMUの計測結果を0にしなくても不具合は出なくなるのです。どうやら不具合の本丸を見つけたようです。
そして・・・
UINT16 ctmu_log0[MAX_LOG_COUNT+2] @0x200;
UINT16 ctmu_log1[MAX_LOG_COUNT+2] @0x268;
UINT16 ctmu_log2[MAX_LOG_COUNT+2] @0x300;
UINT16 ctmu_log3[MAX_LOG_COUNT+2] @0x368;
UINT16 ctmu_log4[MAX_LOG_COUNT+2] @0x400; <== これ!
UINT16 ctmu_log5[MAX_LOG_COUNT+2] @0x468;
UINT16 ctmu_log6[MAX_LOG_COUNT+2] @0x600;
UINT16 ctmu_log7[MAX_LOG_COUNT+2] @0x668;
”Buffer Descriptor Table”を0x400にアサインしたときにctmu_log4とctmu_log5のアドレスを移す必要が有る事を失念していたのです。
0x400にアサインした”Buffer Descriptor Table”に何回も振り回されましたが、ようやく(本当にようやく!)タッチ・マウス・プログラムにUSBインターフェース機能を組み込むことが出来ました。
ヤレヤレ
------------------------------------
XC8のリンカがwarningで教えてくれれば、こんな苦労はしなくて済むのに・・・
ブツブツ
------------------------------------
タッチ・マウス・プログラムにUSBインターフェース機能(Device-HID-Mouse相当)を組み込んだのですが、マウスの動きがギクシャクして、正しく動作していないことが判りました。
”CTMUの計測結果を0にするとマウスがくるくる回りだす”ことを手がかりに、USBインターフェース機能に影響を与えている処理を絞り込んで行き、以下の処理にたどり着きました。
if( averageData != 0 ) { ctmu_average[num] = averageData; ctmu_log( num ); <== ここをコメント・アウトすれば不具合は無くなる update_ctmu_average = FLAG_ON; }
CTMUの計測結果を0にするとaverageDataが0になってctmu_log関数が呼び出されなくなります。そのctmu_log関数の呼び出しをやめると、CTMUの計測結果を0にしなくても不具合は出なくなるのです。どうやら不具合の本丸を見つけたようです。
そして・・・
UINT16 ctmu_log0[MAX_LOG_COUNT+2] @0x200;
UINT16 ctmu_log1[MAX_LOG_COUNT+2] @0x268;
UINT16 ctmu_log2[MAX_LOG_COUNT+2] @0x300;
UINT16 ctmu_log3[MAX_LOG_COUNT+2] @0x368;
UINT16 ctmu_log4[MAX_LOG_COUNT+2] @0x400; <== これ!
UINT16 ctmu_log5[MAX_LOG_COUNT+2] @0x468;
UINT16 ctmu_log6[MAX_LOG_COUNT+2] @0x600;
UINT16 ctmu_log7[MAX_LOG_COUNT+2] @0x668;
”Buffer Descriptor Table”を0x400にアサインしたときにctmu_log4とctmu_log5のアドレスを移す必要が有る事を失念していたのです。
0x400にアサインした”Buffer Descriptor Table”に何回も振り回されましたが、ようやく(本当にようやく!)タッチ・マウス・プログラムにUSBインターフェース機能を組み込むことが出来ました。
ヤレヤレ
------------------------------------
XC8のリンカがwarningで教えてくれれば、こんな苦労はしなくて済むのに・・・
ブツブツ
------------------------------------
|
|
|
タッチ・マウスの動作がおかしい [タッチ・スイッチ]
(2014.01.11)
タッチ・マウス基板で”Device CDC-Basic Demo”が動いたので、本来のプログラムにUSBインターフェース機能を組み込むことにしました。
先ずは”Device HID Mouse”相当の機能を組み込んでみたのですが、不連続な動作になってしまうことが判りました(単体のときは連続的にくるくる回っていた)。
ん?
何だこれは???
CTMUの計測を止めればマウス・ポインタがくるくる回りだすことが判り、CTMU計測の割り込み禁止処理を疑いました。しかし、割り込み禁止処理を止めても間欠的な動作は変わりません。
現在判っているのは、CTMU計測処理は従来のままにして計測結果だけ0にするとマウス・ポインタはくるくる回るということです。
一体どういうことでしょうか?
一難去って、また一難!
ふ~っ
タッチ・マウス基板で”Device CDC-Basic Demo”が動いたので、本来のプログラムにUSBインターフェース機能を組み込むことにしました。
先ずは”Device HID Mouse”相当の機能を組み込んでみたのですが、不連続な動作になってしまうことが判りました(単体のときは連続的にくるくる回っていた)。
ん?
何だこれは???
CTMUの計測を止めればマウス・ポインタがくるくる回りだすことが判り、CTMU計測の割り込み禁止処理を疑いました。しかし、割り込み禁止処理を止めても間欠的な動作は変わりません。
現在判っているのは、CTMU計測処理は従来のままにして計測結果だけ0にするとマウス・ポインタはくるくる回るということです。
一体どういうことでしょうか?
一難去って、また一難!
ふ~っ
|
|
|
タッチ・マウス基板でCDC-Basic Demoが動いた [タッチ・スイッチ]
(2014.01.09)
USBリファレンス・ハードウェア(USB機能の付いたマイコンボード、これです)を入手し、アプリケーション・ライブラリの”USB Device CDC-Basic Demo”に手を入れて、XC8で動くUSBリファレンス・ソフトウェアを用意することにしました。
XC8でコンパイルするとエラーになる部分に修正を加え、何とかコンパイルが通りました。
----------------------------------------
ご参考までに修正の概要を以下に記します。
---------------------------------------
プログラムをビルドし、USBリファレンス・ハードウェアに書き込んで動かしてみると、やはり”Unkown Device”になります。動かないのは残念ですが、重要な手がかりです。動作実績のあるハードウェアに問題は無く、ソフトウェアのどこかにXC8とC18で異なる部分がある筈です。
最初にXC8とC18のマップ・ファイルを比較しましたが、記述の違いが大きくてギブアップしました。やむを得ずソース・ファイルを一つ一つ比較することにしたのですが、親族SNS管理人には有る筈の違いが見つかリません。orz
途方に暮れてWEB上の情報を探していたところ、こちらの方のサイトに行き着きました。
同じ事を試みて成功されたようです。有り難いことにソース・コードを公開(これです)されています。早速、ダウンロードしてソース・コードを比較してみると・・・
@usb_device.c
<拝見したコード>
// バッファ ディスクリプタ テーブルの確保を行う(EP0/EP1/EP2)
volatile BDT_ENTRY BDT[BDT_NUM_ENTRIES] @USB_BDT_ADDRESS; // 4レジスタ x 12個(48byte)
// EP0用の受信データバッファの確保を行う
volatile CTRL_TRF_SETUP SetupPkt @CTRL_TRF_SETUP_ADDR_TAG; // 8byte
volatile BYTE CtrlTrfData[USB_EP0_BUFF_SIZE] @CTRL_TRF_DATA_ADDR_TAG; // 8byte
<XC8で動かないオリジナル・コード>
volatile BDT_ENTRY BDT[BDT_NUM_ENTRIES] BDT_BASE_ADDR_TAG;
volatile CTRL_TRF_SETUP SetupPkt CTRL_TRF_SETUP_ADDR_TAG;
volatile BYTE CtrlTrfData[USB_EP0_BUFF_SIZE] CTRL_TRF_DATA_ADDR_TAG;
シミュレータでアドレスを調べると、動かないコードの方はBDT配列がUSBRAM上に配置されていません!
ようやく不具合の首ねっこを捕まえました。
原因はusb_hal_pic18.hにある以下の記述です。
この修正で、ようやく”USB Device CDC-Basic Demo”がXC8でも動くようになりました。
さらに、PIC18F25k50用に修正したものをタッチ・マウス基板に書き込むと、こちらでも動くことが確認できました。
(パチパチパチ~)
どうやらXC8で動くUSBリファレンス・ソフトウェアが完成したようです。
ヤレヤレ
USBリファレンス・ハードウェア(USB機能の付いたマイコンボード、これです)を入手し、アプリケーション・ライブラリの”USB Device CDC-Basic Demo”に手を入れて、XC8で動くUSBリファレンス・ソフトウェアを用意することにしました。
XC8でコンパイルするとエラーになる部分に修正を加え、何とかコンパイルが通りました。
----------------------------------------
ご参考までに修正の概要を以下に記します。
#ifdef __XC8 #include#ifndef __18CXX #define __18CXX #endif #ifndef __18F14K50 #define __18F14K50 #endi #define ROM const #define FAR #endif @main.c #ifdef __XC8 void High_ISR (void) @0x08 { asm(" goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS "); } void Low_ISR (void) @0x18 { asm(" goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS "); } extern void _startup (void); // See c018i.c in your C18 compiler dir void _reset (void) @REMAPPED_RESET_VECTOR_ADDRESS { asm(" goto _startup "); } void Remapped_High_ISR (void) @REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS { asm(" goto _YourHighPriorityISRCode "); } void Remapped_Low_ISR (void) @REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS { asm(" goto _YourLowPriorityISRCode "); } void interrupt YourHighPriorityISRCode() { #if defined(USB_INTERRUPT) USBDeviceTasks(); #endif } void interrupt low_priority YourLowPriorityISRCode() { } #else オリジナル・コード #endif
---------------------------------------
プログラムをビルドし、USBリファレンス・ハードウェアに書き込んで動かしてみると、やはり”Unkown Device”になります。動かないのは残念ですが、重要な手がかりです。動作実績のあるハードウェアに問題は無く、ソフトウェアのどこかにXC8とC18で異なる部分がある筈です。
最初にXC8とC18のマップ・ファイルを比較しましたが、記述の違いが大きくてギブアップしました。やむを得ずソース・ファイルを一つ一つ比較することにしたのですが、親族SNS管理人には有る筈の違いが見つかリません。orz
途方に暮れてWEB上の情報を探していたところ、こちらの方のサイトに行き着きました。
同じ事を試みて成功されたようです。有り難いことにソース・コードを公開(これです)されています。早速、ダウンロードしてソース・コードを比較してみると・・・
@usb_device.c
<拝見したコード>
// バッファ ディスクリプタ テーブルの確保を行う(EP0/EP1/EP2)
volatile BDT_ENTRY BDT[BDT_NUM_ENTRIES] @USB_BDT_ADDRESS; // 4レジスタ x 12個(48byte)
// EP0用の受信データバッファの確保を行う
volatile CTRL_TRF_SETUP SetupPkt @CTRL_TRF_SETUP_ADDR_TAG; // 8byte
volatile BYTE CtrlTrfData[USB_EP0_BUFF_SIZE] @CTRL_TRF_DATA_ADDR_TAG; // 8byte
<XC8で動かないオリジナル・コード>
volatile BDT_ENTRY BDT[BDT_NUM_ENTRIES] BDT_BASE_ADDR_TAG;
volatile CTRL_TRF_SETUP SetupPkt CTRL_TRF_SETUP_ADDR_TAG;
volatile BYTE CtrlTrfData[USB_EP0_BUFF_SIZE] CTRL_TRF_DATA_ADDR_TAG;
シミュレータでアドレスを調べると、動かないコードの方はBDT配列がUSBRAM上に配置されていません!
ようやく不具合の首ねっこを捕まえました。
原因はusb_hal_pic18.hにある以下の記述です。
//----- Defintions for BDT address -------------------------------------------- #if defined(__18CXX) #if defined(__18F14K50) || defined(__18F13K50) || defined(__18LF14K50) || defined(__18LF13K50) #define USB_BDT_ADDRESS 0x200 #define CTRL_TRF_SETUP_ADDR 0x230 <== 追加 #define CTRL_TRF_DATA_ADDR 0x238 <== 追加 #else #define USB_BDT_ADDRESS 0x400 #define CTRL_TRF_SETUP_ADDR 0x430 <== 追加 #define CTRL_TRF_DATA_ADDR 0x438 <== 追加 #endif #endif #ifdef __XC8 #define BDT_BASE_ADDR_TAG @USB_BDT_ADDRESS #define CTRL_TRF_SETUP_ADDR_TAG @CTRL_TRF_SETUP_ADDR #define CTRL_TRF_DATA_ADDR_TAG @CTRL_TRF_DATA_ADDR #else #define BDT_BASE_ADDR_TAG __attribute__ ((aligned (512))) <==元のコード #define CTRL_TRF_SETUP_ADDR_TAG <==元のコード #define CTRL_TRF_DATA_ADDR_TAG <==元のコード #endif
この修正で、ようやく”USB Device CDC-Basic Demo”がXC8でも動くようになりました。
さらに、PIC18F25k50用に修正したものをタッチ・マウス基板に書き込むと、こちらでも動くことが確認できました。
(パチパチパチ~)
どうやらXC8で動くUSBリファレンス・ソフトウェアが完成したようです。
ヤレヤレ
|
|
|
USBリファレンスを手に入れた [タッチ・スイッチ]
(2014.01.06)
年明け早々に秋葉原へ出かけ、こんなものを買ってきました。
@秋月通商
六角サポート、16V10μF電解コンデンサ、40pinL型ピンヘッダ、USB小型マイコンボード
@千石電商
N452P(ハンダこて)とN452-T-3C(こて先)
動かないまま越年したタッチ・マウスの不具合対策のため、USB機能の付いたマイコンボード
(これです)をUSBリファレンスにする計画です。
もう一つは”SMD部品のハンダづけには3Cのコテ先が良い”と聞いて、その効果を確かめるために新しいハンダこてと替えのコテ先(3C)を購入しました。試してみると3Cのコテ先は確かに使い易そうです。馴染めば効率の良い作業が出来るようになるかもしれません。
さてUSB小型マイコンボードですが、主要部品は既に取り付けられているので、ピン・ヘッダをハンダ付けするだけで動きます。先ずはMicrochip社のアプリケーション・ライブラリにある”USB Device CDC-Basic Demo”を使ってUSBシリアル機能を試すことにしました。
<手順>
(1)MPLABXのプロジェクト・ファイルを開く。
(2)プロジェクト名を右クリックして表示されるプルダウン・メニューのSet Configurationで”LPC_USB_Development_Kit_PIC18F14K50”を選択する。
(3)Project PropertiesウィンドウでDeviceをPIC18F14K50に設定し、コンパイラにC18を選択する。
これが大事
ここまで準備してビルドすると問題無く完了しました。早速デバッガでRUNと思ったら何やらメッセージが・・・
A debug header is required to debug this device.
PIC18F14K50にデバッガを接続する時はdebug header(AC244023これです)が必要なことをすっかり忘れていました。
PIC18F14K50には(Required)と表示される
PIC18F25K50なら表示されない
デバッガが使えないのは残念ですが、プログラムの動作確認には支障ありません。プログラムをデバイスに書き込み、USBケーブルを抜き挿しするとCOM3ポートにUSBシリアル・デバイスが接続されました。(USBシリアル・ドライバーは以前インストールしたものがそのまま使えた)
Rs232C.exeを使って”12345”と送信すると”23456”と返ってきました。
成功です!(パチパチパチ~)
続いて”USB Device-HID-Mouse”を同じ手順で試してみました。プログラムを書き込み、起動すると今度はパソコン側でドライバーのインストール手順が走ります。しかし、特にドライバー・ソフトを用意する必要は無く、見守っている内にドライバーのインストールは完了しました。その後、USBケーブルを抜き挿しするとパソコンのマウス・ポインタがくるくる回り始めました。
成功です!(パチパチパチ~)
デモ・プログラム本来の動作を試すためには4個のLEDと2個のSWが必要ですが、取り合えずUSB接続を試すだけなら必要ありませんでした。また、PICkit3も接続したままで動きました。
これでUSBリファレンス・ハードウェアが手に入りました。
年明け早々に秋葉原へ出かけ、こんなものを買ってきました。
@秋月通商
六角サポート、16V10μF電解コンデンサ、40pinL型ピンヘッダ、USB小型マイコンボード
@千石電商
N452P(ハンダこて)とN452-T-3C(こて先)
動かないまま越年したタッチ・マウスの不具合対策のため、USB機能の付いたマイコンボード
(これです)をUSBリファレンスにする計画です。
もう一つは”SMD部品のハンダづけには3Cのコテ先が良い”と聞いて、その効果を確かめるために新しいハンダこてと替えのコテ先(3C)を購入しました。試してみると3Cのコテ先は確かに使い易そうです。馴染めば効率の良い作業が出来るようになるかもしれません。
さてUSB小型マイコンボードですが、主要部品は既に取り付けられているので、ピン・ヘッダをハンダ付けするだけで動きます。先ずはMicrochip社のアプリケーション・ライブラリにある”USB Device CDC-Basic Demo”を使ってUSBシリアル機能を試すことにしました。
<手順>
(1)MPLABXのプロジェクト・ファイルを開く。
(2)プロジェクト名を右クリックして表示されるプルダウン・メニューのSet Configurationで”LPC_USB_Development_Kit_PIC18F14K50”を選択する。
(3)Project PropertiesウィンドウでDeviceをPIC18F14K50に設定し、コンパイラにC18を選択する。
これが大事
ここまで準備してビルドすると問題無く完了しました。早速デバッガでRUNと思ったら何やらメッセージが・・・
A debug header is required to debug this device.
PIC18F14K50にデバッガを接続する時はdebug header(AC244023これです)が必要なことをすっかり忘れていました。
PIC18F14K50には(Required)と表示される
PIC18F25K50なら表示されない
デバッガが使えないのは残念ですが、プログラムの動作確認には支障ありません。プログラムをデバイスに書き込み、USBケーブルを抜き挿しするとCOM3ポートにUSBシリアル・デバイスが接続されました。(USBシリアル・ドライバーは以前インストールしたものがそのまま使えた)
Rs232C.exeを使って”12345”と送信すると”23456”と返ってきました。
成功です!(パチパチパチ~)
続いて”USB Device-HID-Mouse”を同じ手順で試してみました。プログラムを書き込み、起動すると今度はパソコン側でドライバーのインストール手順が走ります。しかし、特にドライバー・ソフトを用意する必要は無く、見守っている内にドライバーのインストールは完了しました。その後、USBケーブルを抜き挿しするとパソコンのマウス・ポインタがくるくる回り始めました。
成功です!(パチパチパチ~)
デモ・プログラム本来の動作を試すためには4個のLEDと2個のSWが必要ですが、取り合えずUSB接続を試すだけなら必要ありませんでした。また、PICkit3も接続したままで動きました。
これでUSBリファレンス・ハードウェアが手に入りました。
|
|
|
USB接続ができない [タッチ・スイッチ]
(2013.12.30)
タッチ・マウスの応答を劣化させている原因の一つは、JavaのRobotクラスの使用です。
RobotクラスのmouseMove関数の処理に100ms以上掛かっています。
そこで、直接(OSレベルで)マウスを制御するため、後回しにしていた”USBマウス機能”を組み込むことにしました。Microchip社のUSBライブラリを使ってUSBシリアル機能を組み込んだことがあるので、今回も”何とかなるだろう”と気楽に作業を始めたのですが・・・
Microchip社のアプリケーション・ライブラリの多くは、C18ならそのままビルド出来ますが、XC8だと少し手を入れなければなりません。
なんとかビルドが通ったので、早速パソコンに接続したのですが、”Unkown Device”になってしまいます。USBDeviceTasks(void)関数の中でUSBDeviceStateが”ATTACHED_STATE”==>”POWERED_STATE”と動くのですが”Setup”らしい処理に行きません。orz
ハードの問題なのかソフトの問題なのか(はたまたその両方なのか)その見極めをつけなければ先に進みません。そのためにはリファレンスとなるハードとソフトが必要です。
年明けに、これを買ってきて、USBシリアルとUSBマウスを動かしてみることにします。判らないことが出てきたときは、多くの先達の知恵をお借りして・・・
と言うことで、今年はここまで!
問題を抱えて年越しします。
タッチ・マウスの応答を劣化させている原因の一つは、JavaのRobotクラスの使用です。
RobotクラスのmouseMove関数の処理に100ms以上掛かっています。
public void move() { PointerInfo pinf=MouseInfo.getPointerInfo(); if( posi_mode_flag ) { calc_posi(); robot.mouseMove( init_mp.x+move_x, init_mp.y+move_y ); }
そこで、直接(OSレベルで)マウスを制御するため、後回しにしていた”USBマウス機能”を組み込むことにしました。Microchip社のUSBライブラリを使ってUSBシリアル機能を組み込んだことがあるので、今回も”何とかなるだろう”と気楽に作業を始めたのですが・・・
Microchip社のアプリケーション・ライブラリの多くは、C18ならそのままビルド出来ますが、XC8だと少し手を入れなければなりません。
(1)#include <xc.h>を追加する。 (2)includeパスを設定する。 (3)_asmをasm(", _endasmを");に置き換える。 etc.
なんとかビルドが通ったので、早速パソコンに接続したのですが、”Unkown Device”になってしまいます。USBDeviceTasks(void)関数の中でUSBDeviceStateが”ATTACHED_STATE”==>”POWERED_STATE”と動くのですが”Setup”らしい処理に行きません。orz
ハードの問題なのかソフトの問題なのか(はたまたその両方なのか)その見極めをつけなければ先に進みません。そのためにはリファレンスとなるハードとソフトが必要です。
年明けに、これを買ってきて、USBシリアルとUSBマウスを動かしてみることにします。判らないことが出てきたときは、多くの先達の知恵をお借りして・・・
と言うことで、今年はここまで!
問題を抱えて年越しします。
|
|
|