ものづくりBLOG blog page

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

2010-06-16 (Wed) 21:21

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

ものづくりBLOG

Blog Category

Blog Calendar

RSS 2.0