[H8-ML(655)] Re: [H8-ML(654)] スイッチの立ちあがりを検出したいのですが??
From: "Henry Sugimoto of O.B." <ob_henry@xxxxxxxxxxxxxxxx>
Date: 2000年06月26日(月)21時50分11秒
> 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


スレッド概略
[654(R)](起点)
 └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]