「平成22年度 第7回熊本県高校生ものづくりコンテスト 電気系電子回路組立部門」のプログラミング
「課題1.」の回答例を示します。
「課題1.」は、三つ((1)、(2)、(3))に分かれています。
課題の提示方法としては、予め用意したソースファイルに、プログラムを追加する箇所を用意し、競技者に
そこを埋めてもらうものです。
「課題1.(1)」は、初期化の直後の様子を示しています。
------
■初期状態の確認
《電源投入前の設計製作回路の状態》
VR:任意、SW1:下向き(↓)、SW2:そのまま、SW3:下向き(↓)
《電源投入時の制御対象回路の状態》
CPU、制御対象回路の電源をオンにした時、電源表示のLED以外は、すべて消灯していること。
------
「課題1.(2)」の動作をする際、電源投入時に、この状態になれば、それでよいとなります。
但し、「課題1.(3)」の時は、状態を反転させないといけない為、この初期状態のうち、LED3~LED10は点
灯します。
「課題1.(2)」は、次の通りです。
------
■課題:SW2(タクトスイッチ)を押す毎に、LED3~LED10が順次点灯する。
0)初期状態:LED3~LED10は、消灯している。
1)SW2を一回押す。LED3のみ点灯する。
2)SW2を一回押す。LED4のみ点灯する。
3)SW2の押下操作を繰り返し、LED5~LED10が順次点灯する。
4)LED10が点いて、次にSW2を一回押すと、LED3~LED10はすべて点灯する。
5)SW2を一回押すことで、LED3~LED10はすべて消灯する。
6)SW2を一回押すとLED3のみ点灯する。
7)以後、2)~6)の操作と状態を繰り返す。
注:SW1、SW3を操作しても、上記操作と状態に何も影響がないこと。
注:SW2のチャタリングは、プログラムである程度取り除くこと。
その対応で、SW2を押した時からLED点灯までに多少の待ち時間が発生しても構わない。
------
この課題のプログラミング要領として、次の内容を添えています。
事務局提供のプログラムソースファイル:課題1.(2)
------
事務局提供のプログラムソースファイル中で下記コメントのところに、抜けている処理を
追加し、プログラムを完成させる。
/* ------------------------------ */
/* ここにプログラムし、課題を完成させる。*/
/* ------------------------------ */
―プログラム仕様―
変数LedShiftedを使い、LED3~LED10の点灯指示(制御)を行う処理を完成させる。処理
の流れは、次の通り。
LED点灯状態(LedShifted)のチェック
全消灯だったら、
LED3を点灯する。例 LedShifted = 0x01;
LED3が点灯していたら、
LED4が点灯していたら、
LED5が点灯していたら、
LED6が点灯していたら、
LED7が点灯していたら、
LED8が点灯していたら、
LED9が点灯していたら、
LedShiftedを左へシフトトする(=点灯が順送りとなる)。
例 LedShifted = LedShifted << 1;
LED10が点灯していたら、
全点灯する。例 LedShifted = 0xff;
LEDnの指定でないなら、
全消灯する。例 LedShifted = 0x00;
変数LedShiftedとLED3~LED10との関係は、コメント◆印の式をよく見る。
提供されているソースファイルでSW2の動作が課題の通りの動きを実現するようになってい
るか確認する。
------
この課題で上記仕様に従い、プログラムが抜けているところを埋める例は次の通りです。
------
/*---ここから---*/
switch( LedShifted ){ /* LED点灯状態のチェック */
case 0x00: /* 全消灯だったら、 */
LedShifted = 0x01; /* LED3を点灯する。 */
break;
case 0x01: /* LED3が点灯していたら、 */
case 0x02: /* LED4が点灯していたら、 */
case 0x04: /* LED5が点灯していたら、 */
case 0x08: /* LED6が点灯していたら、 */
case 0x10: /* LED7が点灯していたら、 */
case 0x20: /* LED8が点灯していたら、 */
case 0x40: /* LED9が点灯していたら、 */
LedShifted = LedShifted << 1; /* LedShiftedを左へシフトする。 */
break; /* (=点灯が順送りとなる) */
case 0x80: /* LED10が点灯していたら、 */
LedShifted = 0xff; /* 全点灯する。 */
break;
default: /* LEDnの指定でないなら、 */
LedShifted = 0x00; /* 全消灯する。 */
break;
}
/*---ここまで---*/
------
以上が「課題1.(2)」の回答例です。
次に「課題1.(3)」を示します。
------
■課題:前項(2)において、点灯と消灯を逆にする。
------
この課題のプログラミング要領として、次の内容を添えています。
事務局提供のプログラムソースファイル:課題1.(3)
------
事務局提供のプログラムソースファイル中で下記コメントのところに、抜けている処理を追加し、プログラ
ムを完成させる。
/* ------------------------------ */
/* ここにプログラムし、課題を完成させる。*/
/* ------------------------------ */
前項「課題1.(2)」を完成させ、そのmain関数をよく見る。
------
ここは状態を反転させるだけなので、「課題1.(2)」のmain関数の内容をそのままコピーして、最終行
LED7SEG_ALL = ~LedShifted;
のチルダを外すだけで、この仕様を実現することができます。
この課題で上記仕様に従い、プログラムが抜けているところを埋める例は次の通りです。
------
/*---ここから---*/
/* ローカル変数の定義 */
unsigned char LedShifted; /* LEDシフト点灯用変数 */
int DuringON; /* スイッチがオン状態のままなのかを示すフラグ */
/* 処理 */
InitializeIO(); /* マイコン初期化 */
OE_7SEG = OE_DISABLE; /* 7SEG LEDの点灯許可=禁止(IC1.19pin:~OE) */
OE_LED = OE_ENABLE; /* LEDの点灯許可=許可(IC2.19pin:~OE) */
LedShifted = 0x00; /* LEDのシフト初期値設定:LED3~LED10消点灯 */
DuringON = False; /* オン状態管理フラグを(初期化)クリアする。 */
for(;;){ /* 無限ループ(開始) */
if( GetSW2() == SW_ON
&& DuringON == False ){ /* SW2の状態取得~オン状態確認: */
/* オンならば、以下・・ */
WaitMsec(300); /* SW2のチャタリング防止措置 */
DuringON = True; /* オン状態管理フラグをセットする。 */
switch( LedShifted ){ /* LED点灯状態のチェック */
case 0x00: /* 全点灯だったら、 */
LedShifted = 0x01; /* LED3を消点灯する。 */
break;
case 0x01: /* LED3が消灯していたら、 */
case 0x02: /* LED4が消灯していたら、 */
case 0x04: /* LED5が消灯していたら、 */
case 0x08: /* LED6が消灯していたら、 */
case 0x10: /* LED7が消灯していたら、 */
case 0x20: /* LED8が消灯していたら、 */
case 0x40: /* LED9が消灯していたら、 */
LedShifted = LedShifted << 1; /* LedShiftedを左へシフトする。 */
break; /* (=消灯が順送りとなる) */
case 0x80: /* LED10が消灯していたら、 */
LedShifted = 0xff; /* 全点灯する。 */
break;
default: /* LEDの指定でないなら、 */
LedShifted = 0x00; /* 全点灯する。 */
break;
}
}
if( GetSW2() != SW_ON )
DuringON = False; /* オン状態管理フラグをSW2のHiでクリアする。 */
LED7SEG_ALL = LedShifted; /* LEDの点灯(シフト中のLEDだけを消灯) */
} /* 無限ループ(終端) */
/*---ここまで---*/
------
以上が「課題1.(3)」の回答例です。