【実際の使用例の概要】
PICROSとUSBライブラリを実際に使った例題として下記のような機能を持ったものを
製作してみましょう。 機能的には前ページの基本的な使用例と同じもので、USART
の代わりにUSB通信が加わったものです。
・PIC16F876を20MHzクロックで使用
・100msec周期で1個の発光ダイオードを点滅させる。
・2個のCCPをPWMモードで使い発光ダイオードの明暗を連続変化させる。
このPWMのデューティ比を10msec周期で0%から100%まで連続的に変化させる。
・30msec周期で液晶表示器の2行目にカウンタの値を表示する。
そしてその都度カウンタの値を+1しながら表示する。
・周期的なタイマ1のカウントアップ割込みでA/D変換の2チャンネルのデータを
入力し、液晶表示器の1行目に最大5.000Vとして2チャンネルの電圧値を浮動
少数値で表示する。
・USB通信でパソコンから送信されるコマンドを受信し、そのコマンドの指示で
4チャンネルの計測を実行し、液晶表示器の4行目に16進数4桁で表示し、
同時にUSB通信でパソコンに計測データを送信する。
これをパソコンから約80msec周期で繰り返す。
以上の機能を全て並列処理することを考えてみましょう。つまりどの機能も見かけ上
同時に実行されているように見えます。
実際に液晶表示器には下図のように表示されます。まさしく同時に実行されている
ように見えます。
1行目が計測データの表示、2行目がカウンタ値の表示
4行目がパソコンからのUSB通信でのコマンドによる計測
データ表示となります。高速表示繰り返しなので一部
ダブって見えています。
(拡大表示できます)
【ハードウェア構成】
使うハードウェアは下記のような構成のものとします。
液晶表示器には20文字×4行の大き目のものを使いました。
実際の外観は下図の写真のようなものになります。
(拡大できます)
回路図はここをクリックすれば見られます。
【ソフトウェア構成】
まず全体のソフトウェア構成は下図のようになっています。沢山のタスクで動作
しています。
各機能毎に分かれたタスクが全部で7個、タイマ1とUSBの割込み処理、それと
初期化処理で構成されています。
USB通信の関連以外は前ページの基本的な使用例と全く同じです。
PICROS内部にはタイマ0の割込み処理が含まれていますので、3つの割込み
の処理が並行して処理されています。
また各タスクは常に同時に実行待ちとなっているタスクが複数存在し、常時
マルチタスク状態ということになります。
USBの処理タスク(testtsk8())の中には、独立関数としてUSBの受信割込み
処理のユーザー関数部(do_rx1()、do_rx2()、do_rx3())を含んでいます。
この関数は別の独立したファイルとして作成しても構いません。
ここで使ったタスク、コンフィギュレーションファイルは下記でダウンロード出来ます。
いくつかのファイルの圧縮になっています。
PICROS本体、液晶表示ライブラリ、USB通信ライブラリは含んでいません。
★本使用例のプログラム1式(除くPICROS、LCDとUSBライブラリ) test02.lzh
★改版版(全ファイルを含む) test12.lzh 2001/11/24
下図は実験中の様子です。
【USBコンフィギュレーションの内容】 usbconf.h
USBのコンフィギュレーションは簡単で、送信、受信それぞれ3個ずつのUSB通信
の1回の転送サイズを指定するだけです。
このサイズは8バイトから64バイトまでの範囲で自由に決められますが、合計が
PICのレジスタ数以上には出来ません。
<記述例>
【ユーザー関数の作り方】
USB通信の割込み処理の中で、データを受信したあとや、送信する場合の
データ処理のために、ユーザー用の関数があらかじめ用意されています。
それらの関数の作り方は下記のようにします。
(1) 受信用ユーザー関数 ( do_rx1( )、do_rx2( )、do_rx3( ) )
受信処理はUSBの割込み処理の中の一部となっていますので、必ず割込みは
禁止状態のまま(許可しなければ良い)で実行します。
そして受信データは既にバッファに取り込まれていますので、通常は受信データ
を処理するタスクをTrigger_Task()関数を呼んで起動するだけで良いはすです。
従って通常は下記記述例のようにします。
<記述例>
この例のように、単純にTrigger_Task()関数の実行だけで大丈夫です。
また3つのパイプの内、使わないパイプについての受信処理関数については
空の関数をダミーで記述追加する必要があります。コンパイルエラーとなるため。
【タスクの内容】
タスク8以外は前ページのPICROSの基本的な使用例と全く同じですので省略
します。ただし、タスク7のUSART処理関連は本機にはありませんので削除して
います。
当然ユーザーコンフィギュレーションからもUSARTの#USE記述は削除しています。
タスクリンク、ディスパッチテーブルからもタスク7は削除しています。
タスク8は、前項のUSBの受信割込みのユーザー処理関数と、タスクとしてのデータ
処理部分を一緒にしています。
(関数記述が一緒になっているだけで、別々の関数です)
タスク8(testtsk8())では、計測コマンド処理として、4チャンネルの計測をして、
そのデータを16進数4桁ずつとして液晶表示器に表示してから、同じデータを
USB通信でパソコンに送り返しています。(usb_send3())
送り返すデータはT3_DAT[i]に格納しています。