PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.7.10

前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆C++でUSB(HID)アクセスプログラムを作成

PIC側のプログラムはC18コンパイラを使わずPICアセンブラで作成しますが、パソコン側のUSB(HID)アクセスプログラムはBorland C++コンパイラで作成します。
しかしこれがまた難物で悪戦苦闘の連続でありました。

[第50回]

●VenderIDとVendorID

HIDテストプログラムのソースリストを見ていて、気がつきました。
いままでずっと、説明としてはVenderIDと書いてきましたが、プログラムをよくよく見てみましたら、VendorIDなのですね。
うっかりしていて、全く気がつきませんでした。

ソースプログラムのその部分です。

        HIDD_ATTRIBUTES attr;
        HidD_GetAttributes( handle, &attr ) ;
        cout<<"VenderID: " <<attr.VendorID <<endl;
        cout<<"ProductID: " <<attr.ProductID<<endl;
        cout<<endl;

attrのメンバは、attr.VendorIDになっています。
うう。
よく考えもしないで、ひとさまのサイトからソースプログラムをいただいてきてしまったことが、バレバレです。

なお、今回のHIDテストプログラムは、ema log(http://emaame.com/20061227.html)様のサイトにありましたソースリストをもとに作成させていただきました。
プログラムを作成する過程では、あちこちのサイトを検索しまわったために、どことどこのサイトを参考にさせていただいたのか、今となってははっきりわかりません。
でも、やっぱりこのままではいかんなあ、ということで、あらためて検索をし直したり、HDDに残っている古いソースリストを調べたりして、上記ema様のサイトにありましたソースプログラムをもとにさせていただいたことがわかりました。
遅くなりましたが、ema様には感謝申し上げます。

念の為に辞書で調べてみましたら、VenderでもVendorでも、どちらでもよいようです。

それならば、ということで、attr.VenderIDに書き直してコンパイルしてみましたら。

やっぱり、VendorIDでなければダメなのだそうです。

●デバイスみつけた!

そろそろ、PICの側のプログラムについての説明に入らなければいけないのですけれど、どこからはじめていったらよいものか、思案中です。
説明することもなかなかむつかしいです。
とりあえず今回のところは、C++のプログラムをもう少し先に進めておくことにいたします。

前回までの説明で、USBに接続されているデバイスのVendorIDとProductIDを検出するところまでできました。
今回は、そのVendorIDとProductIDをチェックして、ターゲットデバイスのhandleを確定するところまでいきたいと思います。
そこまでできれば、そのあとは本当にWriteFile()とReadFile()で、ターゲットデバイスと送受信するだけになります。

前回までのプログラムに以下の部分を付け加えます。
今回付け加える部分は、とても簡単です。

//
//      VendorIDとProductIDの取得
//
        HIDD_ATTRIBUTES attr;
        HidD_GetAttributes( handle, &attr ) ;
        cout<<"VendorID: " <<attr.VendorID <<endl;
        cout<<"ProductID: " <<attr.ProductID<<endl;
        cout<<endl;
//
//ここから下が追加する部分
//
        if (attr.VendorID==0x4d8 && attr.ProductID==0xa){cout << "GET!" <<endl;getmk=1;break;}
//
        CloseHandle(handle);
   }
        if (getmk==0){cout <<"not found" <<endl;return;}
//
//write file & read file
//
// ここにWriteFile()とReadFile()のプログラムを書く
//
        CloseHandle(handle);
}       

いままでのプログラムでは、handleがローカルになっていて、forブロックの外で使えませんから、HANDLE handleの宣言はforの前に置くことにします。

	int getmk=0;
	HANDLE handle;
        for( int index = 0; ; index++ )
  {

実行結果です。

ターゲットがみつかりましたから、
GET!
と表示されました。

今度はターゲットのPIC試作基板を外してから、もう一度実行してみました。

今度は、not foundと表示されました。
CPUをつくろう!第477回(2010.4.14upload)を再編集

PICでUSBを![第50回]
2011.7.10upload

前へ
次へ
目次へ戻る
ホームページトップへ戻る