練習プログラム4

「練習プログラム4」の編集履歴(バックアップ)一覧に戻る

練習プログラム4 - (2008/04/07 (月) 15:36:08) のソース

<p>続いては、マイコンへの入力信号を処理するプログラムを作ります。</p>
<p>入力信号の処理方法には、情報の確認を何度も繰り返す「ポーリング」、ハードウェアの要求によって処理を発生させる「割り込み」があります。<br />
ポーリングは単純な手法ですが、常にループさせて情報をチェックする必要がある上、処理が長くなるとループを1周する時間が長くなり、応答性が悪くなるという欠点があります。<br />
それに対して、割り込みは応答が早いですが、特殊なルーチンを書く必要があり(既存の関数があれば楽ですが)、また、処理できる数も使用するCPUによって制約を受けがちです。</p>
<p>今回は、プログラム的に簡単な処理であるポーリングを用います。</p>
<h5><br />
参考プログラム④『スイッチを押してる間だけLEDを点滅させよ』</h5>
<pre>

#include &lt;3694.h&gt;
#define SW !IO.PDR1.BIT.B0   //スイッチ(押されたら1 押されてないと0)
/*------------------------------------------*/
/*              指定ms待つ関数                   */
/*------------------------------------------*/
void ms_wait(unsigned int ms){
    //====指定msループ====//
    while(ms--)
    {
        //====TMA設定====//
        TA.TMA.BYTE = 0x1c;  //Clear TCA
        TA.TMA.BYTE = 0x13;  //PSS, 入力クロックφ/512
        while(TA.TCA &lt; 40);  //約1ms待つ
    }
}<br />
/*----------------------------------------------*/
/*                   メイン関数                     */
/*----------------------------------------------*/
int main(void){
  IO.PCR8 = 0xff;            //ポート8を全て出力に設定
  IO.PCR1 = 0x00;            //ポート1を全て入力に設定
  while(1){                  //無限ループ
    if(SW==1){               //もしスイッチが押されたら、
      IO.PDR8.BYTE = 0x00;   //LED全点灯
      ms_wait(200);          //0.2秒待つ
      IO.PDR8.BYTE = 0xff;   //LED消灯
      ms_wait(200);          //0.2秒待つ
    }
    else{                    //押されていない時は、
      IO.PDR8.BYTE = 0xff;   //消灯
    }
  }
  return 0;
}
</pre>
<p> </p>
<p> </p>
<p><strong>プログラムの解説</strong><br /><br />
今回の回路では、スイッチを押していない時は、端子の状態が【High】に、スイッチを押している時は、端子の状態が【Low】になるようになっています。</p>
<p>すなわち、スイッチを押していない時は、port1の0bit目を読み込むと1が、スイッチを押している時は0が読み込まれます。</p>
<p>このままIO.PDR1.BIT.B0と直接書いてもいいのですが、最初に</p>
<pre>
#define SW !IO.PDR1.BIT.B0
</pre>
<p>と#defineを用いてマクロ定義します。
論理演算子!によってport1の0bit目の情報を反転させ、それをSW1と定義することにより、スイッチを押している時はSW1=1、押していない時はSW1=0となる、分かりやすいプログラムにしています。</p>
<p>続いてメイン関数です。 port8は今まで通り出力ですが、port1を入力として用いるため、</p>
<pre>
IO.PCR1 = 0x00;
</pre>
<p>とします。 <br />
その後はif文を使い、SWが1であれば</p>
<pre>
IO.PDR8.BYTE = 0x00;
ms_wait(200);
IO.PDR8.BYTE = 0xff;
ms_wait(200);
</pre>
<p>というLED点滅の処理を、SWが0であれば</p>
<pre>
IO.PDR8.BYTE = 0xff;
</pre>
<p>というLED消灯の処理を行います。 これを無限ループさせることにより、スイッチを押している間だけLEDが点滅します。<br /><br /><br />
課題プログラム④『スイッチを押したらLED全点滅開始』</p>
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。