練習プログラム4

「練習プログラム4」の編集履歴(バックアップ)一覧はこちら

練習プログラム4」(2011/05/19 (木) 16:17:51) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<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.B4 //スイッチ(押されたら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.B4 </pre> <p>と#defineを用いてマクロ定義します。 論理演算子!によってport1の4bit目の情報を反転させ、それをSW1と定義することにより、スイッチを押している時はSW1=1、押していない時はSW1=0となる、分かりやすいプログラムにしています。</p> <p>続いてメイン関数です。 port8は今まで通り出力ですが、port1を入力として用いるため、</p> <pre> IO.PCR1 = 0x00; </pre> <p>とします。PCR1の初期値は0ですが、明示的に0にしておきます。 <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>
<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.B4 //スイッチ(押されたら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待つ } } /*----------------------------------------------*/ /* メイン関数 */ /*----------------------------------------------*/ int main(void){ IO.PCR5 = 0xff; //ポート5を全て出力に設定 IO.PCR1 = 0x00; //ポート1を全て入力に設定 while(1){ //無限ループ if(SW==1){ //もしスイッチが押されたら、 IO.PDR5.BYTE = 0x00; //LED全点灯 ms_wait(200); //0.2秒待つ IO.PDR5.BYTE = 0xff; //LED消灯 ms_wait(200); //0.2秒待つ } else{ //押されていない時は、 IO.PDR5.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.B4 </pre> <p>と#defineを用いてマクロ定義します。 論理演算子!によってport1の4bit目の情報を反転させ、それをSW1と定義することにより、スイッチを押している時はSW1=1、押していない時はSW1=0となる、分かりやすいプログラムにしています。</p> <p>続いてメイン関数です。 port8は今まで通り出力ですが、port1を入力として用いるため、</p> <pre> IO.PCR1 = 0x00; </pre> <p>とします。PCR1の初期値は0ですが、明示的に0にしておきます。 <br /> その後はif文を使い、SWが1であれば</p> <pre> IO.PDR5.BYTE = 0x00; ms_wait(200); IO.PDR5.BYTE = 0xff; ms_wait(200); </pre> <p>というLED点滅の処理を、SWが0であれば</p> <pre> IO.PDR5.BYTE = 0xff; </pre> <p>というLED消灯の処理を行います。 これを無限ループさせることにより、スイッチを押している間だけLEDが点滅します。<br /><br /><br /> 課題プログラム④『スイッチを押したらLED全点滅開始』</p>

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

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