ものづくりBLOG blog page

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

2010-06-17 (Thu) 00:45

「平成22年度 第7回熊本県高校生ものづくりコンテスト 電気系電子回路組立部門」のプログラミング
「課題4.」の回答例を示します。


「課題4.」は、四つ((1)、(2)、(3)、(4))に分かれています。
課題の提示方法としては、予め用意したソースファイルに、プログラムを追加する箇所を用意し、競技者に
そこを埋めてもらうものです。

 

「課題4.(1)」は、初期化の直後の様子を示しています。
------
■初期状態の確認
《電源投入前の設計製作回路の状態》
VR:任意、SW1:下向き(↓)、SW2:そのまま、SW3:下向き(↓)
《電源投入時の制御対象回路の状態》
CPU、制御対象回路の電源をオンにした時、電源表示のLED以外は、すべて消灯していること。
------
「課題4.(2)」の動作をする際、電源投入時に、この状態になれば、それでよいとなります。

 

「課題4.(2)」は、次の通りです。
------
■課題:SW1(トグルスイッチ)を上向き(↑)、SW3(トグルスイッチ)を上向き(↑)にした時、VRの
位置によりモーターの回転を制御する。
1)SW1を上向き(↑)、SW3を上向き(↑)にする。
2)VR中央で、モーターは停止する。
3)VR左方向回転で、モーターは左回転する。
4)VR右方向回転で、モーターは右回転する。
5)SW1、SW3のいずれか、或いは両方ともに下向き(↓)となると、モーターは停止する。
注:SW2を操作しても、上記操作と状態に何も影響はない。
------

この課題のプログラミング要領として、次の内容を添えています。
課題4.(2)  事務局提供のプログラムソースファイル:課題4.(2)
------
事務局提供のプログラムソースファイル中で下記コメントのところに、抜けている処理を追加し、プログ
ラムを完成させる。

 /* ------------------------------------- */
 /* ここにプログラムし、課題を完成させる。*/
 /* ------------------------------------- */

 ―プログラム仕様―
 AD変換結果(10bit)を電圧値に変換(浮動小数点値):fVofAD
  =電圧変換係数xAD変換の出力
  注:この式で(VRを右いっぱいに回し)最大値が課題の通り(50)にならない時、0.05を加算する。
 浮動小数点の電圧値「fVofAD」を整数2桁へ変換: iVofAD
  =(整数型へキャスト)(浮動小数点の電圧値x10)
 20以内は、モーター逆転とする。
  TA7257.IN1(Pin1) = 1
  TA7257.IN1(Pin2) = 0
 20より大きく、30以内は、モーター停止とする。
  ストップモード指示(IN1)
  ストップモード指示(IN2)
 30より大きいと、モーター正転とする。
  TA7257.IN1(Pin1) = 0
  TA7257.IN1(Pin2) = 1

提供されているソースファイルでSW1、SW3の動作が課題の通りの動きを実現するようになっているか
確認する。
------

この課題で上記仕様に従い、プログラムが抜けているところを埋める例は次の通りです。
------
/*---ここから---*/
/*  AD変換結果を電圧値に変換(10bit版:浮動小数点値)*/
fVofAD = VREF10BIT * ADConv() + 0.05;
/*  AD変換結果を電圧値に変換(10bit版:整数値)      */
iVofAD = (int)( fVofAD * 10 );
if( iVofAD <= 20 ){                        /*  20以内は、モーター逆転とする。                     */
    MTR1 = CTR1;                          /*   TA7257.IN1(Pin1) = 1                         */
    MTR2 = CTR0;                          /*   TA7257.IN1(Pin2) = 0                         */
}
if( 20 < iVofAD && iVofAD <= 30 ){   /*  20より大きく、30以内は、モーター停止とする。       */
    MTR1 = CTR0;                           /*   ストップモード指示(IN1)                           */
    MTR2 = CTR0;                           /*   ストップモード指示(IN2)                           */
}
if( 30 < iVofAD ){                         /*  30より大きいと、モーター正転とする。               */
    MTR1 = CTR0;                          /*   TA7257.IN1(Pin1) = 0                         */
    MTR2 = CTR1;                          /*   TA7257.IN1(Pin2) = 1                         */
}
/*---ここまで---*/
------
以上が「課題4.(2)」の回答例です。

 

次に「課題4.(3)」を示します。
------
■課題:前項(2)の操作と動きに加えて、VRの位置により7セグメントLEDの表示を行う。
1)VRの操作により7セグメントLEDが00~50まで変化する。
2)VRの操作により7セグメントLEDの表示が00~20の時、モーターは左回転する。
3)VRの操作により7セグメントLEDの表示が21~30の時、モーターは停止する。
4)VRの操作により7セグメントLEDの表示が31~50の時、モーターは右回転する。
5)7セグメントLEDの表示は、SW1とSW3がいずれも上向き(↑)の時のみとする。
6)SW1、SW3のいずれか、或いは両方ともに下向き(↓)となると、モーターは停止し、7セグメントLEDの
表示は消灯する。
注:SW2を操作しても、上記操作と状態に何も影響はない。
------

この課題のプログラミング要領として、次の内容を添えています。
課題4.(3)  事務局提供のプログラムソースファイル:課題4.(3)
------
事務局提供のプログラムソースファイル中で下記コメントのところに、抜けている処理を追加し、プログ
ラムを完成させる。

 /* ------------------------------------- */
 /* ここにプログラムし、課題を完成させる。*/
 /* ------------------------------------- */

 ―プログラム仕様―
 AD変換結果(10bit)を電圧値に変換(浮動小数点値):fVofAD
  =電圧変換係数xAD変換の出力
  注:この式で(VRを右いっぱいに回し)最大値が課題の通り(50)にならない時、0.05を加算する。
 浮動小数点の電圧値「fVofAD」を整数2桁へ変換: iVofAD
  =(整数型へキャスト)(浮動小数点の電圧値x10)
 20以内は、モーター逆転とする。
  TA7257.IN1(Pin1) = 1
  TA7257.IN1(Pin2) = 0
 20より大きく、30以内は、モーター停止とする。
  ストップモード指示(IN1)
  ストップモード指示(IN2)
 30より大きいと、モーター正転とする。
  TA7257.IN1(Pin1) = 0
  TA7257.IN1(Pin2) = 1
 10の位の値の計算
 1の位の計算(先に計算した Digit2nd を使って)
 7segLED点灯:10の位
 7SEG LEDの点灯許可=許可(IC1.19pin:~OE)
 LEDの点灯許可=禁止(IC2.19pin:~OE)
 7SegLED1点灯許可
 7SegLED2点灯禁止
 7SegLED1点灯保持(1msec)
 7segLED点灯:1の位
 7SegLED1点灯禁止
 7SegLED2点灯許可
 7SegLED2点灯保持(1msec)

7セグメントLEDの表示は、前項「課題3.(2)」を完成させ、そのmain関数をよく見る。
------

この課題で上記仕様に従い、プログラムが抜けているところを埋める例は次の通りです。
------
/*---ここから---*/
/*  AD変換結果を電圧値に変換(10bit版:浮動小数点値)*/
fVofAD = VREF10BIT * ADConv() + 0.05;
/*  AD変換結果を電圧値に変換(10bit版:整数値)      */
iVofAD = (int)( fVofAD * 10 );
if( iVofAD <= 20 ){                        /*  20以内は、モーター逆転とする。                       */
    MTR1 = CTR1;                          /*   TA7257.IN1(Pin1) = 1                         */
    MTR2 = CTR0;                          /*   TA7257.IN1(Pin2) = 0                         */
}
if( 20 < iVofAD && iVofAD <= 30 ){   /*  20より大きく、30以内は、モーター停止とする。       */
    MTR1 = CTR0;                           /*   ストップモード指示(IN1)                             */
    MTR2 = CTR0;                           /*   ストップモード指示(IN2)                             */
}
if( 30 < iVofAD ){                         /*  30より大きいと、モーター正転とする。                  */
    MTR1 = CTR0;                          /*   TA7257.IN1(Pin1) = 0                         */
    MTR2 = CTR1;                          /*   TA7257.IN1(Pin2) = 1                         */
}
Digit2nd = iVofAD / 10;                    /*  10の位の値の計算                               */
Digit1st = iVofAD - ( Digit2nd * 10 );  /*  1の位の計算                       */
                                                   /*   (先に計算した Digit2nd を使って)              */
LED7SEG_ALL = LEDSegData[Digit2nd];        /*  7segLED点灯:10の位                  */
OE_7SEG = OE_ENABLE;                /*  7SEG LEDの点灯許可=許可(IC1.19pin:~OE) */
OE_LED = OE_DISABLE;                /*  LEDの点灯許可=禁止(IC2.19pin:~OE)          */
LED7SEG_1 = FET_ENABLE;            /*  7SegLED1点灯許可                                */
LED7SEG_2 = FET_DISABLE;           /*  7SegLED2点灯禁止                                */
Wait1msec();                              /*  7SegLED1点灯保持(1msec)                      */
LED7SEG_ALL = LEDSegData[Digit1st];        /*  7segLED点灯:1の位                    */
LED7SEG_1 = FET_DISABLE;                   /*  7SegLED1点灯禁止                        */
LED7SEG_2 = FET_ENABLE;                    /*  7SegLED2点灯許可                        */
Wait1msec();                               /*  7SegLED2点灯保持(1msec)                    */
/*---ここまで---*/
------
以上が「課題4.(3)」の回答例です。

 

次に「課題4.(4)」を示します。
------
■課題:前項(3)の操作と動きにおいて、VRの操作でモーターが停止する時、LEDをフラッシングさせる。
1)VRを操作し、7セグメントLEDの表示が21~30の時、LED3~LED10が揃ってフラッシング(点滅)する。
2)VRの操作で、7セグメントLEDの表示が00~20、31~50では、LED3~LED10は消灯している。
注:点滅速度は、目視にて確認できる程度でよい。
注:SW2を操作しても、上記操作と状態に何も影響はない。
------

この課題のプログラミング要領として、次の内容を添えています。
課題4.(4)  事務局提供のプログラムソースファイル:課題4.(4)
------
事務局提供のプログラムソースファイル中で下記コメントのところに、抜けている処理を追加し、プログ
ラムを完成させる。

 /* ------------------------------------- */
 /* ここにプログラムし、課題を完成させる。*/
 /* ------------------------------------- */

 ―プログラム仕様―
 AD変換結果(10bit)を電圧値に変換(浮動小数点値):fVofAD
  =電圧変換係数xAD変換の出力
  注:この式で(VRを右いっぱいに回し)最大値が課題の通り(50)にならない時、0.05を加算する。
 浮動小数点の電圧値「fVofAD」を整数2桁へ変換: iVofAD
  =(整数型へキャスト)(浮動小数点の電圧値x10)
 20以内は、モーター逆転とする。
  7SEG LEDの点灯許可=禁止(IC1.19pin:~OE)
  LEDの点灯許可=許可(IC2.19pin:~OE)
  7セグメントLED切替(LED1)=消灯(FET1/オフ)
  7セグメントLED切替(LED2)=消灯(FET2/オフ)
  先にLED3~LED10は消灯なら、以下・・
   LED3~LED10点灯制御:True=点灯
   LED3~LED10点灯
   フラッシング用待ち時間 例 WaitMsec(200);
  先にLED3~LED10は点灯なら、以下・・
   LED3~LED10点灯制御:False=消灯
   LED3~LED10s消灯
   フラッシング用待ち時間 例 WaitMsec(200);
  LED1、LED2点灯制御指示:False=消灯
  TA7257.IN1(Pin1) = 1
  TA7257.IN1(Pin2) = 0
  LED1、LED2点灯制御指示:True=点灯 例 SvnSegLedOn = True;
 20より大きく、30以内は、モーター停止とする。
  LED1、LED2点灯制御指示:False=消灯 例 SvnSegLedOn = False;
  ストップモード指示(IN1)
  ストップモード指示(IN2)
 30より大きいと、モーター正転とする。
  TA7257.IN1(Pin1) = 0
  TA7257.IN1(Pin2) = 1
  LED1、LED2点灯制御指示:True=点灯
------

この課題で上記仕様に従い、プログラムが抜けているところを埋める例は次の通りです。
------
/*---ここから---*/
/*  AD変換結果を電圧値に変換(10bit版:浮動小数点値)*/
fVofAD = VREF10BIT * ADConv() + 0.05;
/*  AD変換結果を電圧値に変換(10bit版:整数値)      */
iVofAD = (int)( fVofAD * 10 );
if( iVofAD <= 20 ){                        /*  20以内は、モーター逆転とする。                      */
    MTR1 = CTR1;                          /*   TA7257.IN1(Pin1) = 1                        */
    MTR2 = CTR0;                          /*   TA7257.IN1(Pin2) = 0                        */
    SvnSegLedOn = True;                /*   LED1、LED2点灯制御指示:True=点灯        */
}
if( 20 < iVofAD && iVofAD <= 30 ){  /*  20より大きく、30以内は、モーター停止とする。        */
    OE_7SEG = OE_DISABLE;           /*   7SEG LEDの点灯許可=禁止(IC1.19pin:~OE)*/
    OE_LED = OE_ENABLE;              /*   LEDの点灯許可=許可(IC2.19pin:~OE)       */
    LED7SEG_1 = FET_DISABLE;       /*   7セグメントLED切替(LED1)=消灯(FET1/オフ)     */
    LED7SEG_2 = FET_DISABLE;       /*   7セグメントLED切替(LED2)=消灯(FET2/オフ)     */
    if( LedOn == False ){                  /*   先にLED3~LED10は消灯なら、以下・・        */
        LedOn = True;                      /*    LED3~LED10点灯制御:True=点灯         */
        LED7SEG_ALL = LED_AL_ON;           /*    LED3~LED10点灯                     */
        WaitMsec(200);                     /*    フラッシング用待ち時間                            */
    } else {                               /*   先にLED3~LED10は点灯なら、以下・・             */
        LedOn = False;                 /*    LED3~LED10点灯制御:False=消灯             */
        LED7SEG_ALL = LED_AL_OFF;   /*    LED3~LED10s消灯                           */
        WaitMsec(200);                     /*    フラッシング用待ち時間                            */
    }
    SvnSegLedOn = False;               /*   LED1、LED2点灯制御指示:False=消灯        */
    MTR1 = CTR0;                          /*   ストップモード指示(IN1)                              */
    MTR2 = CTR0;                          /*   ストップモード指示(IN2)                              */
}
if( 30 < iVofAD ){                          /*  30より大きいと、モーター正転とする。                 */
    MTR1 = CTR0;                          /*   TA7257.IN1(Pin1) = 0                         */
    MTR2 = CTR1;                          /*   TA7257.IN1(Pin2) = 1                         */
    SvnSegLedOn = True;                /*   LED1、LED2点灯制御指示:True=点灯        */
}
/*---ここまで---*/
------
以上が「課題4.(4)」の回答例です。


Comments

ご回答頂きありがとうございます。ファイル名に()を入れておりまして、無くすことで解消できました。お世話になりました。コンテストでもよろしくお願いします。
by sirataki | 2011-06-13 (Mon) 19:15
siratakiさんへ お疲れ様です。 以下、回答いたします。 「ルネサステクノロジ 開発環境 FAQ」からの転載です。 ------ 件名:リンク時にL2011が出力されます。 内容:ソースファイルのファイル名やパス名に括弧("("、および")")を含んでいる場合、 リンク時にL2011が出力されます。 最適化リンケージエディタがリンクオプション "input" で "input <lib_name> (<module_name>)" という書式をサポートしており、ファイル名やパス名の括弧をサブオプションの括弧として解釈するためです。 括弧を含めないファイル名やパス名にして下さい。
by mono2kuri | 2011-06-08 (Wed) 13:56
課題4−3について質問させていただきます。 開発環境はHEWで、掲載されている内容でビルドしましたが、 以下のようなエラーを解決することができません。 L2011 (E) Invalid parameter specified in option "input" : ""C:WorkSpacemono2kurimono2kuriDebugkadairensyu4-(3).obj"" ご多用中すいませんがアドバイスをいただければ幸いです。
by sirataki | 2011-06-08 (Wed) 11:33

ものづくりBLOG

Blog Category

Blog Calendar

RSS 2.0