2017年12月11日月曜日
PSoC5LP で USB-HIDデバイスでもしてみるか。。。( PSoC Advent Calender2017 )
PSoC Advent Calender 2017 の 記事の2こめです。
PSoC5LPにはUSB がついています。
これ、案外USB UARTくらいしかつかっていないんですが
普通にHIDデバイスとしても作ることができます。
今回はMouseにしてみます。
といっても、マウスなら、ちゃんとサンプルが用意されているんですよね。
スケマティックにUSBFSを配置して、右クリックメニューから出る
Find Code Example ...
を実行します。
すでにUSBFSが選ばれているので、関連するものがでてますね。
今回はとりあえず
USBFS_HID
を選択します。
3-Button mouseって書いてあるので、大丈夫そうですね。
よければ、Create Project を押します。
ん!エラー? はぁ???
このメッセージわかりにくいよね。まったく。
要はこれは
『そのままではインポートされていないので、Webからとってきてね!』
というメッセージ。じゃ、どうするの?ってなるんだけど、
左はしの地球のアイコンをクリックすると、勝手にダウンロードされてくるので
そのままプロジェクトをつくります。
できたプロジェクトはデバイスが PSoC3になっているので
利用するPSoC5の型番に変更します。
PrototypingKitでは、CY8C5888LTI-LP097ですね。
WorkSpace Explorerの Project部で右クリックして
Device Selecter
を出し、ここで選択しなおします。
できたら、ビルドします。
スケマティックをみても、USBFSしか配置されていないので、基本は
これでエラーもでないはずです。
自動でピン配置もUSBピンはセレクトされているはずなので
大丈夫なはず。
添付のPDFの最後のところに
================================
Expected Results
You should see that the device is recognized as a 3-button mouse. The mouse is continuously moving back and forth horizontally.
================================
ってなっているので、マウスになってカーソルを水平移動でうごかすよ。
ってよめますね。
うごきましたか?
で、この設定、どこできまるんだ?ってことなんですが
一番わかりにくいのは HID Report Descriptersなんですよね。
なんじゃそら、と。
Device Class Definition for HID 1.11 (PDF)
を参照してみてください。
page81 (表題ページ番号71)にマウスの定義サンプルが挙げられています。
ね、このとおりの定義を書いてるだけですね。
あとは 3バイト用意して、一定のタイミングで
値をセットしておくりかえせばいいんですね。
このやりかたをしっておくと、JoyStickもキーボードもつくれますね!
ラベル:
Advent Calender,
HID,
PSoC,
USB
2017年12月5日火曜日
Uartのボーレートチェンジを実装してみる( PSoC Advent Calender2017 )
とうとうこんな季節になってしまった。
いまだに炎上案件抱えてひーひーゆうてるのに。
PSoC Advent Calender 2017 の 記事を!って頼まれたのでそれをば。
さて、PSoC のUARTってコンポーネント、ポンっ!ってかんじで
いいので、とっても簡単なんですがね、ほかのマイコンなら
途中でボーレートチェンジ!なんて簡単にできるのに

この部分はAPIとしてはParityは公開されているけれど、
肝心の速度は公開されてないので、なんともならない。
きっかけは MonoWirelessのTWELiteの書き込みがPSoCからしたいよね!的な
ところから始まったんだけど。
PC <--USB--> PSoC <--UART-->TWELite
っていう感じでつかって、モード変更で書き込み対応したいとか。
で、やってみた。
Design Wide Resources (.cydwr)をひらいて Clockタブを見てみる。
やっぱり、UART_1_IntClockを引き込んでいる。
今回は115200bps = 115.2kHzがほしい設定なので
サンプリングを8倍した 921.6kHzを生成してるわけですね。(最下行)
この921.6kHzを生成するのに、64MHzを69分周して近似の
927.536kHzを出してるというのはわかる。
ということなら
このDividerを変更したらよくね?
UART_1のコードの下に、UART_1_IntClock.cというのができてる。
このなかに SetDividerRegister()関数という、もうそのままのネーミングの
関数あるじゃんと。
これをよべばよさげですよね。
===================================
===================================
ぼくの場合だと
#define HS115200 69
#define HS57600 139
#define HS38400 208
#define HS19200 417
#define HS9600 833
ってかんじですかね。
ここらは計算でする方法もあるし、あるていど決め打ちでもいいかも
ですね。
64000(kHz) / (欲しい周波数(kHz) * 8) = divider
ってかんじですね。
いまだに炎上案件抱えてひーひーゆうてるのに。
PSoC Advent Calender 2017 の 記事を!って頼まれたのでそれをば。
さて、PSoC のUARTってコンポーネント、ポンっ!ってかんじで
いいので、とっても簡単なんですがね、ほかのマイコンなら
途中でボーレートチェンジ!なんて簡単にできるのに
この部分はAPIとしてはParityは公開されているけれど、
肝心の速度は公開されてないので、なんともならない。
きっかけは MonoWirelessのTWELiteの書き込みがPSoCからしたいよね!的な
ところから始まったんだけど。
PC <--USB--> PSoC <--UART-->TWELite
っていう感じでつかって、モード変更で書き込み対応したいとか。
で、やってみた。
Design Wide Resources (.cydwr)をひらいて Clockタブを見てみる。
やっぱり、UART_1_IntClockを引き込んでいる。
今回は115200bps = 115.2kHzがほしい設定なので
サンプリングを8倍した 921.6kHzを生成してるわけですね。(最下行)
この921.6kHzを生成するのに、64MHzを69分周して近似の
927.536kHzを出してるというのはわかる。
ということなら
このDividerを変更したらよくね?
UART_1のコードの下に、UART_1_IntClock.cというのができてる。
このなかに SetDividerRegister()関数という、もうそのままのネーミングの
関数あるじゃんと。
これをよべばよさげですよね。
===================================
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void setBitRate(uint32 rate) | |
{ | |
uint16 div; | |
switch( rate ){ | |
case 57600: div = HS57600; break; | |
case 38400: div = HS38400; break; | |
case 19200: div = HS19200; break; | |
case 9600: div = HS9600; break; | |
case 115200: | |
default: | |
div = HS115200; | |
break; | |
} | |
UART_1_Stop(); | |
UART_1_IntClock_SetDividerRegister(div, 1); // 設定変更+リスタート | |
UART_1_Start(); | |
} | |
===================================
ぼくの場合だと
#define HS115200 69
#define HS57600 139
#define HS38400 208
#define HS19200 417
#define HS9600 833
ってかんじですかね。
ここらは計算でする方法もあるし、あるていど決め打ちでもいいかも
ですね。
64000(kHz) / (欲しい周波数(kHz) * 8) = divider
ってかんじですね。
ラベル:
Advent Calender,
PSoC,
UART,
ボーレートチェンジ
登録:
投稿 (Atom)