プログラム(制御)no

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
atushi

プログラム(制御)no

#1

投稿記事 by atushi » 15年前

本日制御技術で、
③スイッチの入力により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:以降の答えはどのようになるんでしょうか?

Eeel

Re:プログラム(制御)no

#2

投稿記事 by Eeel » 15年前

ビット演算の>>と<<はご存知でしょうか?
ビットシフトと言って、ビット単位でデータをずらします。

 0x01 << 1

の結果は

 0x02

になります。2進数で表すと

 0000 0001 → 0000 0010

という事です。

 0x01 << n

の場合はn個ずらします。
case 4とcase 6はこれで解けると思います。
case 5とcase 7はビットシフトした値を足していきます。
case 8はその後さらに引いていく処理もします。

softya

Re:プログラム(制御)no

#3

投稿記事 by softya » 15年前

根本的に色々間違っていると思います。
そもそもコンパイルしてみましたか?このコード。
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

#4

投稿記事 by たかぎ » 15年前

ハードウェア構成もコンパイラも分からない状況では何も答えられません。
そもそも利用規約も守っていませんし、現状では話になりません。

non

Re:プログラム(制御)no

#5

投稿記事 by non » 15年前

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が点くのか決めなくてはいけません。

non

Re:プログラム(制御)no

#6

投稿記事 by non » 15年前

すっごく、かぶった。

softya

Re:プログラム(制御)no

#7

投稿記事 by softya » 15年前

えーとマルチポストですね。
http://detail.chiebukuro.yahoo.co.jp/qa ... 1432272859
「規約と注意事項」を読んでいただいて、規約に沿っていただくようにお願いします。

atushi

Re:プログラム(制御)no

#8

投稿記事 by atushi » 15年前

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る