C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C 値の保持にかんして

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■37150 / inTopicNo.1)  C 値の保持にかんして
  
□投稿者/ tkana3 (1回)-(2009/06/14(Sun) 14:33:35)

分類:[C/C++] 

2009/06/14(Sun) 14:44:02 編集(投稿者)

こんにちは。

マイコンをつかいCの勉強をしています。

switchを押したとき、LED(複数あるなかの一つ ex LED1-4)を点灯させて
次に違うswitchを押下したとき、1回目に押下したLEDを点灯させたまま、
2つ目のLEDを点灯させたいのですが、1つ目のLEDが消えてしまいます。

ご指導よろしくお願いします。


while()
 {
  sw = PBDR; //swicth の読み込み
  sw = sw & 0x0f //mask

  if(sw == 0x08 || led1 == 0x80)
{
sw = sw<<4 //4bit shift
sw = PBDR; //led1 on
led1 = PBDR;   //led1が点いていることを保持するもの
//ここで、led1が消えてled2が点く。ここの修正らへんが必要かと…
PBDR = 0x80; //led1 on
}

  else if(sw == 0x04 || led2 == 0x40)
{
sw = sw<<4 //4bit shift
sw = PBDR; //led2 on
led2 = PBDR;   //led2が点いていることを保持するもの
PBDR = 0x40; //led1 on
}
       :
}

以上よろしくお願いしまう。


引用返信 編集キー/
■37151 / inTopicNo.2)  Re[1]: C 値の保持にかんして
□投稿者/ επιστημη (1966回)-(2009/06/14(Sun) 14:45:21)
επιστημη さんの Web サイト
> 次に違うswitchを押下したとき、1回目に押下したLEDを点灯させたまま、
> 2つ目のLEDを点灯させたいのですが、1つ目のLEDが消えてしまいます。

補足要求。
- LED-1を点灯させる命令
- LED-2を点灯させる命令
を示してください。

引用返信 編集キー/
■37152 / inTopicNo.3)  Re[2]: C 値の保持にかんして
□投稿者/ tkana3 (2回)-(2009/06/14(Sun) 14:51:35)
επιστημη さん

お世話になります。

> - LED-1を点灯させる命令

PBDR = 0x80; //led1 on

> - LED-2を点灯させる命令

PBDR = 0x40; //led2 on

の部分です。

よろしくお願いします。
引用返信 編集キー/
■37153 / inTopicNo.4)  Re[3]: C 値の保持にかんして
□投稿者/ επιστημη (1967回)-(2009/06/14(Sun) 15:01:12)
επιστημη さんの Web サイト
2009/06/14(Sun) 15:03:20 編集(投稿者)

>>- LED-1を点灯させる命令
> PBDR = 0x80; //led1 on
>
>>- LED-2を点灯させる命令
> PBDR = 0x40; //led2 on

LED-1がPBDRの第3bit (0x80= 00001000b)
LED-2がPBDRの第2bit (0x40= 00000100b)
に対応しているように見受けられます。

対応しているbitを1にすれば点灯するのかな。
だったら 第3,第2bitを1にすれば両方点灯しそうです。

ってわけで
PBDR = 0x80 | 0x40; (00001100b)
だとどうなりますか?

引用返信 編集キー/
■37154 / inTopicNo.5)  Re[4]: C 値の保持にかんして
□投稿者/ tkana3 (4回)-(2009/06/14(Sun) 15:26:06)
επιστημη さん

補足が悪かったようです…
> LED-1がPBDRの第3bit (0x80= 00001000b)
> LED-2がPBDRの第2bit (0x40= 00000100b)
> に対応しているように見受けられます。

sw1 = 0x08 = 00001000b
sw2 = 0x04 = 00000100b

led1 = 0x80 = 10000000b
led2 = 0x40 = 01000000b

です。同じポート(PBDR)に繋がっているため、4bitシフトさ
せそれをledに表示させているのです。


> PBDR = 0x80 | 0x40; (00001100b)


PBDR = 0x80 | 0x40; 「ここの部分(00001100b)ではなくて(11000000b)ですね」

これですと、一巡目にLED1・LED2が両方光ってしまうのでだめです…

ですので、光っている状態を保持するため、LED1にその値を保持させ、
もし2巡目にsw2を押したときに、最初のLED1を光らせて、その次にLED2のif文に入って
LED2を光らせたいのです。

以上よろしくお願いします(__)
引用返信 編集キー/
■37155 / inTopicNo.6)  Re[5]: C 値の保持にかんして
□投稿者/ επιστημη (1968回)-(2009/06/14(Sun) 15:38:46)
επιστημη さんの Web サイト

> PBDR = 0x80 | 0x40; 「ここの部分(00001100b)ではなくて(11000000b)ですね」←あ、ごめん。
>
> これですと、一巡目にLED1・LED2が両方光ってしまうのでだめです…

だーかーらー...

pattern = 0x00;
/* 一回目 */
pattern |= 0x80; /* LED-1のbitたてる */
PBDR = pattern; /* 光れ! */
/* 二回目 */
pattern |= 0x40; /* LED-2のbitたてる(他のbitはそのまま) */
PBDR = pattern; /* 光れ! */

てことよー

引用返信 編集キー/
■37156 / inTopicNo.7)  Re[6]: C 値の保持にかんして
□投稿者/ tkana3 (5回)-(2009/06/14(Sun) 16:08:53)
επιστημη さん

ありがとうございます。

> だーかーらー...

すみません。

> pattern = 0x00;
> /* 一回目 */
> pattern |= 0x80; /* LED-1のbitたてる */
> PBDR = pattern; /* 光れ! */
> /* 二回目 */
> pattern |= 0x40; /* LED-2のbitたてる(他のbitはそのまま) */
> PBDR = pattern; /* 光れ! */

「|=」の部分は考えもつきませんでした。勉強不足です…
また怒られそうですが…実は家にデバックできる環境がないため実行できません。
明日試してみたいと思います。

今後ともよろしくお願いします。。
引用返信 編集キー/
■37157 / inTopicNo.8)  Re[7]: C 値の保持にかんして
□投稿者/ επιστημη (1969回)-(2009/06/14(Sun) 16:12:42)
επιστημη さんの Web サイト
> 「|=」の部分は考えもつきませんでした。勉強不足です…

いや、勉強不足てゆっかー...

pattern |= 立てたいbit;



pattern = pattern | 立てたいbit;

と同じことっす。


引用返信 編集キー/
■37158 / inTopicNo.9)  Re[8]: C 値の保持にかんして
□投稿者/ tkana3 (6回)-(2009/06/14(Sun) 16:21:12)
επιστημη さん

いつも丁寧にやさしく(厳しく)ありがとうございます。

> いや、勉強不足てゆっかー...

いや、勉強不足です…  
「|=」知らなかったです。演算子なんかテキトーに
やればいいと思ってましたから。



引用返信 編集キー/
■37159 / inTopicNo.10)  Re[9]: C 値の保持にかんして
□投稿者/ επιστημη (1970回)-(2009/06/14(Sun) 16:26:48)
επιστημη さんの Web サイト
>>いや、勉強不足てゆっかー...
>
> いや、勉強不足です…  
> 「|=」知らなかったです。演算子なんかテキトーに
> やればいいと思ってましたから。

ぢつはこのケースでは論理演算不要です。
ふつーの"たしざん"で十分。

pattern = pattern + 0x80; /* or 0x40 */

なぜ + と | が同じことになるかわかんないなら、それこそ勉強不足かも♪

引用返信 編集キー/
■37160 / inTopicNo.11)  Re[10]: C 値の保持にかんして
□投稿者/ tkana3 (7回)-(2009/06/14(Sun) 16:31:56)
επιστημη さん

> なぜ + と | が同じことになるかわかんないなら、それこそ勉強不足かも♪

実は今ほぼ思考停止状態ですので、明日考えたいと思います(__)
これから秋月に「くれーまーくれーまー」してきます。
引用返信 編集キー/
■37164 / inTopicNo.12)  Re[11]: C 値の保持にかんして
□投稿者/ .SHO (881回)-(2009/06/15(Mon) 08:42:08)
switch の状態は、3ビット目と4ビット目に保持されてるんですよね?
リテラルで0x80とか0x40とか指定するんじゃなて
4ビットシフトして、ぶちこみゃ終わりだと思うんですけど。

PBDR <<= 4;

この1行で全て完成。

引用返信 編集キー/
■37167 / inTopicNo.13)  Re[12]: C 値の保持にかんして
□投稿者/ .SHO (882回)-(2009/06/15(Mon) 09:57:39)
全て完成と言うには↓こう書いておいた方がいいかな・・・?

while ( 1 ) PBDR <<= 4;

引用返信 編集キー/
■37181 / inTopicNo.14)  Re[12]: C 値の保持にかんして
□投稿者/ επιστημη (1972回)-(2009/06/15(Mon) 12:59:14)
επιστημη さんの Web サイト
> PBDR <<= 4;
> この1行で全て完成。

そりゃそぉなんだけど、

「みんなできたかな?
 それじゃ課題その2いくよ。
 SW-1 で LED-2,
 SW-2 で LED-1
 を点灯させてごらん」

てなった途端にアウト。

OR: 1を使って1にする
AND: 0を使って0にする
XOR: 1を使って反転する

ってゆーのをちゃんとやっといた方がよさげー。

引用返信 編集キー/
■37185 / inTopicNo.15)  Re[13]: C 値の保持にかんして
□投稿者/ .SHO (883回)-(2009/06/15(Mon) 13:10:33)
2009/06/15(Mon) 13:11:00 編集(投稿者)

> OR: 1を使って1にする
> AND: 0を使って0にする
> XOR: 1を使って反転する
>
> ってゆーのをちゃんとやっといた方がよさげー。

異論ないです。


そもそも最初のソース、コンパイルとおらないし…

while() ← こんな書き方できない。
sw = sw<<4 ← セミコロンない。
引用返信 編集キー/
■37186 / inTopicNo.16)  Re[13]: C 値の保持にかんして
□投稿者/ 倉田 有大 (638回)-(2009/06/15(Mon) 13:10:54)
とりあえず、enum使うとソースが見やすくならないかな。

引用返信 編集キー/
■37198 / inTopicNo.17)  Re[14]: C 値の保持にかんして
□投稿者/ .SHO (884回)-(2009/06/15(Mon) 13:52:27)
ちなみに、PBDRを読みだしても、上位4ビットが現在の点灯状態を示しているとは限らない。
と言うか、たぶん示していないので

PBDR |= ・・・;

はダメだと思います。

あくまで下位4ビットの状態を元に1回で PBDR をたたく必要があり
結局、突き詰めれば

PBDR <<= 4;

こうなってしまうような。

もう少しだけ、わかりやすく書くなら

PBDR = ( PBDR & 0xf ) << 4;

ですかね(同じことだけど)。

引用返信 編集キー/
■37492 / inTopicNo.18)  Re[15]: C 値の保持にかんして
□投稿者/ ちひろ (1回)-(2009/06/23(Tue) 23:31:25)
.SHOさん

> 次に違うswitchを押下したとき、1回目に押下したLEDを点灯させたまま、
> 2つ目のLEDを点灯させたいのですが、1つ目のLEDが消えてしまいます。

これって、ラッチしたいってことじゃないのかしら。
SW1 を押すと LED1 が点灯し、
SW2 を押すと LED2 が点灯するけど、前に SW1 を押したから LED1 も点灯したままにしておきたい、と。

もし、PBDR <<= 4; としてしまうと、その瞬間の SW の状態に対応した LED しか点灯させれないと思うですよ。
LED1 と LED2 を同時に点灯させるには、SW1 と SW2 を同時押ししないといけなくなってしまう。
だから、epiさんは「あえて」pattern 変数を使ってるんだと思う。

すなわち、

while (1) {
 sw = PBDR & 0x0F;
 if (sw & 0x08) {
  led |= 0x80;
 }
 if (sw & 0x04) {
  led |= 0x40;
 }
 PBDR = led;
}

で、最適化して、さらにフツーに ON/OFF できるようにするとこうなる。

whie (1) {
 sw = ~sw & PBDR & 0x0F; // PUSH だけ取得
 led ^= (sw << 4); // 対応するLEDの状態を反転
 PBDR = led; // 出力
}

たぶん。

引用返信 編集キー/
■37498 / inTopicNo.19)  Re[16]: C 値の保持にかんして
□投稿者/ .SHO (894回)-(2009/06/24(Wed) 08:37:29)
> もし、PBDR <<= 4; としてしまうと、その瞬間の SW の状態に対応した LED しか点灯させれないと思うですよ。

スレ主が出てきて、どんなスイッチかを説明しないとわからないですね。

ON/OFF の状態を保持しているのか、押すと1回だけトリガーがかかるだけで
別のスイッチを押したら消えちゃうのか?

まぁ、どっちにしても必要な情報は提供されてるし
スレ主はもう解決してるんじゃないのかな?

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ