ものづくりBLOG blog page

第7回熊本大会コンテスト回答例-課題2.-

2010-06-17 (Thu) 00:33

「平成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)  事務局提供のプログラムソースファイル:課題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)」の回答例です。

ものづくりBLOG

Blog Category

Blog Calendar

RSS 2.0