PICROSの基本的な使用例


【実際の使用例の概要】

PICROSを実際に使った例題として下記のような機能を持ったものを製作して
みましょう。

  ・PIC16F877を20MHzクロックで使用
  ・100msec周期で1個の発光ダイオードを点滅させる。
  ・2個のCCPをPWMモードで使い発光ダイオードの明暗を連続変化させる。
   このPWMのデューティ比を10msec周期で0%から100%まで連続的に変化させる。
  ・30msec周期で液晶表示器の2行目にカウンタの値を+1しながら表示する。
  ・周期的なタイマ1のカウントアップ割込みで、A/D変換の2チャンネルのデータを
   入力し、液晶表示器の1行目に最大5.000Vとして2チャンネルの電圧値を浮動
   少数値で表示する。
  ・USARTの受信割込みでパソコンからの文字列コマンドを受信し、dコマンドなら
   液晶表示器の3行目にその受信データを表示し、同時にパソコンに返送する。
   oコマンドなら次のデータで指定されたPORTDのビットをONし、fコマンドなら
   OFFする。

以上の機能を全て並列処理することを考えてみましょう。つまりどの機能も見かけ上
同時に実行されているように見えます。
実際に液晶表示器には下図のように表示されます。まさしく同時に実行されている
ように見えます。


1行目が計測データの表示、2行目がカウンタ値の
表示で、3行目がパソコンからの送信データとなります。
(拡大表示できます)



【ハードウェア構成】

使うハードウェアは下記のような構成のものとします。
液晶表示器には20文字×4行の大き目のものを使いました。









実際の外観は下図の写真のようなものになります。

(拡大できます)

  回路図はここをクリックすれば見られます。




【ソフトウェア構成】

まず全体のソフトウェア構成は下図のようになっています。沢山のタスクで動作しています。
各機能毎に分かれたタスクが全部で7個、タイマ1とUSARTの割込み処理、それと初期化
処理で構成されています。
PICROS内部にはタイマ0の割込み処理が含まれていますので、3つの割込みの処理が
並行して処理されています。
また各タスクは常に同時に実行待ちとなっているタスクが複数存在し、常時マルチタスク
状態ということになります。









ここで使ったタスク、コンフィギュレーションファイルは下記でダウンロード出来ます。
いくつかのファイルの圧縮になっています。
PICROS本体、液晶表示ライブラリ、USB通信ライブラリは含んでいません。

  ★本使用例のプログラム1式(除くPICROS、LCDライブラリ) test01.lzh

  ★同上全て含む(改版版 デバッガ追加したことによる変更) test11.lzh (2001/11/24)



下図は実験中の様子です。





【コンフィギュレーションの内容】

コンフィギュレーションファイルの内容は下記のようになっています。

(1) ユーザコンフィギュレーションファイル








(2) タスクディスパッチテーブル



(3) タスクリンクファイル






【初期化処理の内容】

ユーザー初期化では液晶表示器とCCP、タイマ1を使っていますので、それらの初期化
処理が含まれています。


(1) ユーザー初期化ファイル







【割込み処理の内容】

割込み処理としては2種類になります。
(1) タイマ1の処理
  下記がタイマ1の処理内容です。非常に簡単になっています。常時0からカウント
  するものとして、カウンタへのデータ設定は省略しています。
  毎回タスク6を起動しているだけです。







(2) USARTの受信割込み処理
  パソコンから送信された文字列データを受信し、改行コードになったらタスク7を
  起動します。








【タスクの内容】

(1) タスク1 
  初期起動タスク、最初に初期化ルーチンで1回だけ起動され、タスク2,3,4,5
  を起動します。






(2) タスク2 
  Counterの値を10進数3桁で液晶表示器の2行目に表示します。
  そして30msec毎にこのタスクは繰り返されその都度Counterが+1されます。
  再入可能なようにCounterをSTATIC変数としています。





(3) タスク3
  100msec毎に繰り返し起動され、その都度LEDの表示を反転させています。
  100msec毎に点滅する発光ダイオードが実現できます。





(4) タスク4
  PWMモードのCCP出力で発光ダイオードを点灯させています。10msec毎に起動
  され、その都度PWMのデューティを+1しています。
  そして1023になったらまた0からとします。
  Duty1変数をSTATIC変数とし初期値を0にしています。






(5) タスク5
  タスク4と同様に10msec毎に起動される度に、PWMのデューティ値を+1して
  います。Duty2をSTATIC変数として初期値に512を与えています。
  これでタスク4より1/2周期ずれて制御されることになります。




(6) タスク6
  タイマ1の割込み処理で起動されるため、約110msec周期で起動されます。
  その都度、2チャンネルのアナログデータを入力し、5.000VFSで変換してから
  液晶表示器の1行目に表示します。




(7) タスク7
  パソコンからのデータ受信割込み処理から起動されます。コマンドデータの受信
  完了で起動されますので、受信バッファに格納されているデータをコマンドとして
  処理します。
  コマンドが「d」なら以下の文字列をそのまま液晶表示器の3行目に表示して、同時
  にパソコンにUSARTで送信します。送信側は割込みを使っていませんので、送信
  完了までこのタスクで待ちます。
  「o」コマンドなら次の数字データで指定されたポートDのビットをONし。「f」コマンド
  ならOffとします。









      目次ページへ