目次

ボタン処理

 ボタンは、タクタイルスイッチとトグルスイッチを利用します。

 スイッチを利用する場合、チャタリングが発生します。
 チャタリングは、シフトレジスタを使い、除去します。

 ただし、MODEを指定するトグルスイッチは、電源投入前にONか
 OFFを決めるので、チャタリング除去操作の対象に入れません。

 スイッチで、内部の状態を切替えます。


チャタリング除去

 8ビットの変数btn_startを用意し、シフトレジスタとします。  システムコールwai_tskで、20msごとに、タクタイルスイッチ  の状態を入力し、変数のLSB(Least Significant Bit)に格納  します。  変数btn_startの下4ビットが、すべて0のときに、スイッチが  押されたと判断します。

状態切替

 スイッチを押すたびに内部状態を切替えます。  シーケンスは、以下とします。
  1. 現在(CUR_MODE)のモードを、フラグ(PRE_MODE)に保存
  2. CUR_MODEの論理値反転
  3. (PRE_MODE,CUR_MODE)=(OFF,ON)→他のタスクを起床する
  4. (PRE_MODE,CUR_MODE)=(ON,OFF)→他のタスクを眠らせる

ソースコード

 関数tsk1_procに入れた内容は、以下です。 void tsk1_proc(void) { /* show */ put_lcd_clear(1); put_lcd_str(1,0,(UBYTE *)"WAIT TRIGGER"); /* shift and store data */ btn_start <<= 1 ; if ( PB.DR.BIT.B4 ) { btn_start |= ON ; } /* judge */ if ( (btn_start & MASK0F) == 0 ) { /* store previous mode */ PRE_MODE = CUR_MODE ; /* change current mode */ if ( CUR_MODE ) { CUR_MODE = OFF ; } else { CUR_MODE = ON ; } /* judge */ if ( PRE_MODE == OFF && CUR_MODE == ON ) { /* wakeup tasks */ rsm_tsk(TSK_ID2); rsm_tsk(TSK_ID3); rsm_tsk(TSK_ID4); /* start PWM */ start_pwm(); } if ( PRE_MODE == ON && CUR_MODE == OFF ) { /* suspend tasks */ sus_tsk(TSK_ID2); sus_tsk(TSK_ID3); sus_tsk(TSK_ID4); /* stop PWM */ stop_pwm(); } } /* delay 20ms */ wai_tsk( 2 ); }
目次

inserted by FC2 system