第10回 ストップウォッチの SW 動作制御部設計

■10.1 SW による動作制御部 仕様
 Step9で作成したプログラムに「SW による動作制御部」を設計する.
 この機能を追加することで,ストップウォッチが完成する.

 8.1に示したストップウォッチの入力動作仕様を以下に示す.
入力 2個のプッシュスイッチ(SW1 および SW2)により,計測開始,計測停止,およびリセット動作を制御する.

SW1 RA3 ポートにローアクティブで接続
SW2 RA4 ポートにローアクティブで接続

 上記の仕様に基づいた「SWによる動作制御部」の仕様を以下に示す.
SW1 計測開始(START),計測停止(STOP)の制御
SW1 を押すごとに START(カウンタインクリメント開始)と STOP(カウンタインクリメント停止)を切り替える.
SW2 リセット動作(RESET)の制御
SW2 を押すことで RESET(カウンタリセット)を実行する.
ただし,STOP 時にのみ有効

 動作制御とはカウンタの制御を行うことと言える.

 上記の仕様を満たす割り込みルーチンのアルゴリズム(フローチャート)を以下に示す.
 ここで,F_START および F_RESET は,それぞれ以下の動作状態を示すフラグである.
F_START 1:START,0:STOP
F_RESET 1:RESET要求,0:RESET要求無し



 上記のフラグを,メインルーチン内で,適宜設定することにより,カウンタの制御を行うことができる.

 なお,フラグの利用方法に関しては「◆4.3.2 ビット変数(フラグ)の設定」を参照すること.
 
■10.2 SW入力シーケンス
 機械式スイッチの状態を入力する場合の注意点を以下に示す.
  1. チャタリング等のノイズ対策.
  2. 不要なビットのマスク処理.
  3. スイッチが「off」であることを確認してから「on」を検出する.
 1 に対してはフィルタ処理(【7.3 入力フィルタ処理】を参照)で,対処できる.
 以下に,2 および 3 に対する対処法を示す.

◆10.2.1 マスク処理
 マイコンシステムでスイッチ入力を実現する場合,入力ポートにスイッチを接続して利用するが,その入力ポートは8ビットレジスタで構成されていることが多い.
 そのような場合,任意のポートに接続されたスイッチの状態を読み込む際に,8 ビットの入力データ中の不要なビットを 0 もしくは 1 に固定しなければならない場合がある.
 そのような処理をマスク処理と呼ぶ.

 特に,入力フィルタ処理等において入力データを比較する場合等は,スイッチ入力ポート以外のポートの状態は不要な情報であるのでマスク処理でビットを固定しなければ成らない場合が多い.

 以下に,マスク処理のプログラム例を示す.

▼‘0’にマスクする場合
 不要なビットを 0 にマスクする処理は論理積演算を利用することで実行できる.
 すなわち,以下に示すように.0と AND をとったビット(例では第 4〜7 ビット)は 0 となり,1 と AND をとったビット(第 0〜3 ビット)は変化しないことを利用する.

   01011101  (元のデータ)
AND  00001111  (マスクデータ:第 0〜3 ビット以外を 0 にマスクする)

 00001101  (マスク処理されたデータ)

 以下に POARTA の RA3 および RA4 に接続されたスイッチ入力処理におけるマスク例を示す.
 この処理により,Wreg には RA3 および RA4 ビット以外は 0 にマスクされたデータが格納される.

       MOVF    PORTA,W
       ANDLW   B'00011000'     ;mask(RA3,4 only)

▼‘1’にマスクする場合
 不要なビットを 1 にマスクする処理は論理和演算を利用することで実行できる.
 すなわち,以下に示すように.1 と OR をとったビット(例では第 4〜7 ビット)は 1 となり,0と OR をとったビット(第 0〜3 ビット)は変化しないことを利用する.

   01011101  (元のデータ)
OR  11110000  (マスクデータ:第 0〜3 ビット以外を 1 にマスクする)

 11111101  (マスク処理されたデータ)

 以下に POARTA の RA3 および RA4 に接続されたスイッチ入力処理におけるマスク例を示す.
 この処理により,Wreg には RA3 および RA4 ビット以外は 1 にマスクされたデータが格納される.

       MOVF    PORTA,W
       ANDLW   B'11100111'     ;mask(RA3,4 only)

◆10.2.2 入力シーケンス
 例えば,プッシュスイッチが「一回押された(on)」という判断を行う場合は,「スイッチがoff からon になった」という変化を読み取る必要がある.
 つまり,一度「on」になったと判断したなら,その後,一端「off」の状態が存在してからでなければ再び「on」にはならないようなアルゴリズムが必要である.そうでなければ「一回押した」つもりでも「複数回押された」という判断になってしまう場合がある.
 
 以下に,PORTA に接続された SW1 と SW2 の入力シーケンスのフローチャートを示す(チャタリング対策として 1kHz のフィルタ処理を施してある.また,マスク処理は記載していないが PORTA を読み込む毎に行う必要がある).
 なお,例ではスイッチが全て「off」である状態を確認するために専用フラグ(F_SWoff:変数 flag の任意ビット)を利用している.

1. スイッチが全て「off」になるまで待ち,「off」になったら専用フラグ F_SWoffをセット(1)する
2. F_SWoff が 1 の場合,スイッチのいずれかか「on」になるまで待ち,「on」になったなら F_SWoffをクリア(0)する
3. 各スイッチの状態に応じた処理を実行する.
4. 1 へ戻る.

 
■課題
 以下に示す内容のプログラムを作成し,その「フローチャート」と「ソースコード」を示しなさい.
 ただし,LCD制御ライブラリの「フローチャート」と「ソースコード」は示さなくてよい.

プロジェクト名 step10
内容 「基本分解能で動作するカウンタ部」および「LCDによるカウンタ値の表示部」および「SWによる動作制御部」
(完成版ストップウォッチ)
正解例オブジェクトコード step10.hex

 レポートは,下記のWordファイルを使用して作成すること.なるべく簡潔にまとめることが望ましい.
 Form10.docx

 WebClassより期限内に提出すること.