「平成22年度 第7回熊本県高校生ものづくりコンテスト 電気系電子回路組立部門」のプログラミング
「課題2.」の回答例を示します。
「課題2.」は、二つ((1)、(2))に分かれています。
課題の提示方法としては、予め用意したソースファイルに、プログラムを追加する箇所を用意し、競技者に
そこを埋めてもらうものです。
「課題2.(1)」は、初期化の直後の様子を示しています。
------
■初期状態の確認
《電源投入前の設計製作回路の状態》
VR:任意、SW1:下向き(↓)、SW2:そのまま、SW3:下向き(↓)
《電源投入時の制御対象回路の状態》
CPU、制御対象回路の電源をオンにした時、電源表示のLED以外は、すべて消灯していること。
------
「課題2.(2)」の動作をする際、電源投入時に、この状態になれば、それでよいとなります。
「課題2.(2)」は、次の通りです。
------
■課題:SW3(トグルスイッチ)が上向き(↑)の時、7セグメントLED(LED1、LED2)が点灯し、SW2(タ
クトスイッチ)を押す毎に、7セグメントLEDの表示が順次変わる。
0)初期状態:LED1、LED2は、消灯している。
1)SW3を上向き(↑)にする。この時、7セグメントLEDの表示は、00 となる。
2)SW2を一回押す。7セグメントLEDの表示は、11となる。
3)SW2を一回押す。7セグメントLEDの表示は、22となる。
4)SW2の押下操作を繰り返し、7セグメントLEDの表示は、以下の通りに順次表示する。
33、44、55、66、77、88、99、AA、bb、cc、dd、EE、FF
5)表示がFFの時、次にSW2を押すと、00となる。
6)以後、2)~6)の操作と状態を繰り返す。
7)上記操作中、SW3を下向き(↓)にすると、表示はその時の状態で固定され、SW2の操作をしても、
表示内容は変わらない。次にSW3を上向き(↑)にすると、1)の状態となり、以後、2)からの操作と状態
を繰り返す。
注:SW1を操作しても、上記操作と状態に何も影響はない。
注:SW2のチャタリングは、プログラムである程度取り除くこと。その対応で、SW2を押した時からLED
点灯までに多少の待ち時間が発生しても構わない。
------
この課題のプログラミング要領として、次の内容を添えています。
事務局提供のプログラムソースファイル:課題2.(2)
------
グローバル変数LEDSegDataの初期値のうち、A、b、c、d、E、Fの設定を完成させる。
事務局提供のプログラムソースファイル中で下記コメントのところに、抜けている処理を追加し、プログ
ラムを完成させる。
/* ------------------------------------- */
/* ここにプログラムし、課題を完成させる。*/
/* ------------------------------------- */
注:2カ所あるので要注意。
―プログラム仕様(上段)―
SW3の状態が↓~↑遷移確認:遷移したなら以下・・
カウンタの初期値設定:0をセットする。
SW3の状態が↑なのでSW3の状態フラグをリセットする。
SW2の状態取得~オン状態確認:オンならば、以下・・
SW2のチャタリング防止措置 例 WaitMsec(300);
オン状態管理フラグをセットする。
LedShiftedが15をさしたら、0に戻す。
(15以外だったら)LedShiftedに1加算する。
オン状態管理フラグをSW2のオフでクリアする。
カウント(数字)の表示
例 LED7SEG_ALL = LEDSegData[LedShifted];
注:SW2の操作は、SW3がオンの時のみ有効とする。
―プログラム仕様(下段)―
7セグメントLED切替(LED1)=消灯(FET1/オフ)
7セグメントLED切替(LED2)=消灯(FET2/オフ)
提供されているソースファイルでSW2、SW3の動作が課題の通りの動きを実現するようになっているか
確認する。
------
この課題で上記仕様に従い、プログラムが抜けているところを埋める例は次の通りです。
------
/*---ここから1(プログラム仕様(上段)参照のこと)---*/
if( IsOFFonSW3 == True ){ /* SW3の状態が↓~↑遷移確認:遷移したなら以下・・ */
LedShifted = 0; /* カウンタの初期値設定:0をセットする。 */
IsOFFonSW3 = False; /* SW3の状態が↑なのでSW3の状態フラグをリセットする。 */
}
if( GetSW2() == SW_ON /* SW2の状態取得~オン状態確認: */
&& DuringON == False ){ /* オンならば、以下・・ */
WaitMsec(300); /* SW2のチャタリング防止措置 */
DuringON = True; /* オン状態管理フラグをセットする。 */
if( LedShifted == 15 )
LedShifted = 0; /* LedShiftedが15をさしたら、0に戻す。 */
else LedShifted++; /* (15以外だったら)LedShiftedに1加算する。 */
}
if( GetSW2() != SW_ON )
DuringON = False; /* オン状態管理フラグをSW2のオフでクリアする。 */
LED7SEG_ALL = LEDSegData[LedShifted]; /* カウント(数字)の表示 */
/* 注:SW2の操作は、SW3がオンの時のみ有効とする。 */
/*---ここまで1---*/
/*---ここから2(プログラム仕様(下段)参照のこと)---*/
LED7SEG_1 = FET_DISABLE; /* 7セグメントLED切替(LED1)=消灯(FET1/オフ) */
LED7SEG_2 = FET_DISABLE; /* 7セグメントLED切替(LED2)=消灯(FET2/オフ) */
IsOFFonSW3 = True; /* SW3の状態がオフなのでSW3の状態フラグをセットする。 */
/*---ここまで2---*/
------
以上が「課題2.(2)」の回答例です。