ボタン処理
ボタンは、タクタイルスイッチとトグルスイッチを利用します。
スイッチを利用する場合、チャタリングが発生します。
チャタリングは、シフトレジスタを使い、除去します。
ただし、MODEを指定するトグルスイッチは、電源投入前にONか
OFFを決めるので、チャタリング除去操作の対象に入れません。
スイッチで、内部の状態を切替えます。
チャタリング除去
8ビットの変数btn_startを用意し、シフトレジスタとします。
システムコールwai_tskで、20msごとに、タクタイルスイッチ
の状態を入力し、変数のLSB(Least Significant Bit)に格納
します。
変数btn_startの下4ビットが、すべて0のときに、スイッチが
押されたと判断します。
状態切替
スイッチを押すたびに内部状態を切替えます。
シーケンスは、以下とします。
- 現在(CUR_MODE)のモードを、フラグ(PRE_MODE)に保存
- CUR_MODEの論理値反転
- (PRE_MODE,CUR_MODE)=(OFF,ON)→他のタスクを起床する
- (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 );
}
目次
前
次