本日制御技術で、
③スイッチの入力によりLEDの点灯パターンが以下のように変わるプログラムを考えよ。
--------------------------------------------------------------------
|スイッチ(SW)|状態|その他|動作 |
--------------------------------------------------------------------
| SW1 | on | off |すべてのLEDが点滅(約1秒) |
--------------------------------------------------------------------
| SW2 | on | off |1つおきにLEDが交互に点灯(約1秒間隔) |
--------------------------------------------------------------------
| SW3 | on | off |右4bitと左4bitが交互に点灯(約1秒間隔) |
--------------------------------------------------------------------
| SW4 | on | off |右から1個ずつ点灯(for文使用) |
--------------------------------------------------------------------
| SW5 | on | off |右から1個ずつ点灯が増える(for文使用) |
--------------------------------------------------------------------
| SW6 | on | off |左から1個ずつ点灯(for文使用) |
--------------------------------------------------------------------
| SW7 | on | off |左から1個ずつ点灯が増える(for文使用) |
--------------------------------------------------------------------
| SW8 | on | off |右から1個ずつ増えた後、左から1個ずつ減る |
--------------------------------------------------------------------
↑という問題が宿題として出されました。
/* メインプログラム */
void main(void)
{
unsignede char d;
init(); /*初期化 */
while(1){
d = P7DR
PBDR = d;
switch(d){
case 1:
PBDR = 0xff;
timer(1000);
break;
case 2:
PBDR = 0x55;
timer(1000);
PBDR = 0xaa;
timer(1000);
break;
case 3:
PBDR = 0xf0;
timer(1000);
PBDR = 0x0f;
timer(1000);
break;
case 4:
for ()
PBDR = 0x01
とここまでなんですが,実はcase 4:の方も曖昧で手も足も出ず解りません。
case 3:以降の答えが知りたいです。
言い方が失礼かもしれませんが,case 3:以降の答えはどのようになるんでしょうか?
プログラム(制御)no
Re:プログラム(制御)no
ビット演算の>>と<<はご存知でしょうか?
ビットシフトと言って、ビット単位でデータをずらします。
0x01 << 1
の結果は
0x02
になります。2進数で表すと
0000 0001 → 0000 0010
という事です。
0x01 << n
の場合はn個ずらします。
case 4とcase 6はこれで解けると思います。
case 5とcase 7はビットシフトした値を足していきます。
case 8はその後さらに引いていく処理もします。
ビットシフトと言って、ビット単位でデータをずらします。
0x01 << 1
の結果は
0x02
になります。2進数で表すと
0000 0001 → 0000 0010
という事です。
0x01 << n
の場合はn個ずらします。
case 4とcase 6はこれで解けると思います。
case 5とcase 7はビットシフトした値を足していきます。
case 8はその後さらに引いていく処理もします。
Re:プログラム(制御)no
根本的に色々間違っていると思います。
そもそもコンパイルしてみましたか?このコード。
unsignede char d;
はつづりが違います。
d = P7DR
PBDR = d;
も意味不明ですよ。
P7DRに繋がっているSWって、SWごとのビットがONになるんですよね?
ってことで、
switch(d){
case 3:
って、SW1と2がONだった場合って意味になります。
SWがビットに割り当てられているなら
case 0x01:
case 0x02:
case 0x04:
case 0x08:
が正解じゃないでしょうか?
で、
case 1:
PBDR = 0xff;
timer(1000);
もONにしているだけで1秒後にOFFしてません。
OFFするにしても、この後ループしているとまたONになってしまうので、1秒ONにした後はSWが変化しない限りOFFし続けるとかの制御は必要ないんでしょうか?という疑問とか、SW2の「1つおきにLEDが交互に点灯(約1秒間隔)」はSW2がONの間だけ続けるのでしょうか?
SW4の「右から1個ずつ点灯(for文使用)」ってのは、途中でSW4がOFFになったらどうなるのでしょうか?
など仕様が曖昧な所も多いので疑問にお答えください。
そもそもコンパイルしてみましたか?このコード。
unsignede char d;
はつづりが違います。
d = P7DR
PBDR = d;
も意味不明ですよ。
P7DRに繋がっているSWって、SWごとのビットがONになるんですよね?
ってことで、
switch(d){
case 3:
って、SW1と2がONだった場合って意味になります。
SWがビットに割り当てられているなら
case 0x01:
case 0x02:
case 0x04:
case 0x08:
が正解じゃないでしょうか?
で、
case 1:
PBDR = 0xff;
timer(1000);
もONにしているだけで1秒後にOFFしてません。
OFFするにしても、この後ループしているとまたONになってしまうので、1秒ONにした後はSWが変化しない限りOFFし続けるとかの制御は必要ないんでしょうか?という疑問とか、SW2の「1つおきにLEDが交互に点灯(約1秒間隔)」はSW2がONの間だけ続けるのでしょうか?
SW4の「右から1個ずつ点灯(for文使用)」ってのは、途中でSW4がOFFになったらどうなるのでしょうか?
など仕様が曖昧な所も多いので疑問にお答えください。
Re:プログラム(制御)no
CPUや各ポートの状況がわからないのですが・・・
>d = P7DR
おそらく、P7はスイッチにつながっている。
>PBDR = d;
おそらく、PBはLEDに違いないと仮定して・・・
各スイッチに対応しているとするなら、スイッチは8個あるので
case文は
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
ではないのでしょうか?
>PBDR = d;
がスイッチの状態をLEDに出しているとするなら、これを点灯している時間はないので
無駄です。
case 1: は 0xffを出力しているだけなので、点灯しっぱなし、
点滅になってません。
sw4以降でシフトする場合、どの段階でスイッチを見に行くかを決めないといけません。
すなわち、1個LEDを移動するたびに、スイッチの状態を見に行くのか。
7回シフトして左端まで行った段階でスイッチの状態を見るのかです。
こちらの方が簡単なのでこっちかも知れませんが。
また、一番左端までLEDが移動したらその次はどのLEDが点くのか決めなくてはいけません。
>d = P7DR
おそらく、P7はスイッチにつながっている。
>PBDR = d;
おそらく、PBはLEDに違いないと仮定して・・・
各スイッチに対応しているとするなら、スイッチは8個あるので
case文は
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
ではないのでしょうか?
>PBDR = d;
がスイッチの状態をLEDに出しているとするなら、これを点灯している時間はないので
無駄です。
case 1: は 0xffを出力しているだけなので、点灯しっぱなし、
点滅になってません。
sw4以降でシフトする場合、どの段階でスイッチを見に行くかを決めないといけません。
すなわち、1個LEDを移動するたびに、スイッチの状態を見に行くのか。
7回シフトして左端まで行った段階でスイッチの状態を見るのかです。
こちらの方が簡単なのでこっちかも知れませんが。
また、一番左端までLEDが移動したらその次はどのLEDが点くのか決めなくてはいけません。
Re:プログラム(制御)no
えーとマルチポストですね。
http://detail.chiebukuro.yahoo.co.jp/qa ... 1432272859
「規約と注意事項」を読んでいただいて、規約に沿っていただくようにお願いします。
http://detail.chiebukuro.yahoo.co.jp/qa ... 1432272859
「規約と注意事項」を読んでいただいて、規約に沿っていただくようにお願いします。