> P8-3はプルアップされていてスイッチが押されると"LOW"になるようになっていま
> す。
>
>
> old_sw = *P8DR; file://スイッチが押される前の状態を確認
> if (((*P8DR & 0x08) != (old_sw & 0x08 )) && ((*P8DR & 0x08) == (0x08))
//
> 立ちあがりの検出
>
> // その後の処理がこの下に続いています。
>
> よろしくお願いいたします。
>
> Jun.26 '00 M.Sakurai
>
>
>
To Mr. sakurai
行数を更に 一行追加し、確実に ステイトを追う方法が、適正かと
考えます。 1行に、同じ表現が有ると、コンパイラーが最適化の対
象として、再度の入力をせず、予想外の結果になる場合が有ります
し、複数の評価式が有る場合の評価順序の保証を コンパイラーが
していない点を、考えると、この種の 危険な表現は、お勧め出来ま
せん。 若しも、 *P8DR が 2回使われるので無ければ 動作が
期待した物と異る事は無かったでしょう。
一般論ですが、H8で、コンパイラー名、コンパイル オプション指定、
等、あなたの 遭遇した 環境を公表していただければ今後の、事故
予防の参考になるでしょう。
H8では、まだ、この種のひどいめには合っていませんが、SH2 では、
少しでも コンパイラーの SW 指定をサボると えらいめに合ってい
ます。
Proposal-1 ブロックタイプ
old_sw = *P8DR; file://スイッチが押される前の状態を確認
if (((*P8DR & 0x08) != (old_sw & 0x08 )) // hennka ?
{ if((*P8DR & 0x08) == (0x0)) // SW on?
{ while((*P8DR & 0x08) == (0x0)) ; // Matunoda!
Process Starts // yareyare SW
Off da.
}
}
Proposa-2 ノンブロックタイプ
私は、この種の処理は 必ず ステイトマシン処理をします。 処理プ
ログラムは、人の操作時間に比べ十分短い間隔で定期的に呼び出され
るものとします。
int sw_x=0; // kouiki hensuu
void sw_process()
{ int i;
switch(sw_x)
{ case 0:
{ i=(*P8DR & 0x08);
if(0 == i) sw_x=1; // SW is ON
}
break;
case 1;
{ i=(*P8DR & 0x08);
if(0 != i)
{ sw_x=0;
// process here ! −−−−−−−−−−−−
}
}
break;
defaults sw_x=0;
}
}
実際のプログラムでは、更に チャタリングの影響を除くため、SWの状態
遷移の判定に時間をかける事と、エラー処理を含ませるのが常識となっ
ています。
〒226-0002 横浜市緑区
東本郷 6-17-1-602
オンボード tel 045-473-7678
fax 045-474-5351