「平成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)
------
事務局提供のプログラムソースファイル中で下記コメントのところに、抜けている処理を追加し、プログ
ラムを完成させる。
/* ------------------------------------- */
/* ここにプログラムし、課題を完成させる。*/
/* ------------------------------------- */
―プログラム仕様―
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)
------
事務局提供のプログラムソースファイル中で下記コメントのところに、抜けている処理を追加し、プログ
ラムを完成させる。
/* ------------------------------------- */
/* ここにプログラムし、課題を完成させる。*/
/* ------------------------------------- */
―プログラム仕様―
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)
------
事務局提供のプログラムソースファイル中で下記コメントのところに、抜けている処理を追加し、プログ
ラムを完成させる。
/* ------------------------------------- */
/* ここにプログラムし、課題を完成させる。*/
/* ------------------------------------- */
―プログラム仕様―
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)」の回答例です。