質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Arduino

    671questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

ArduinoのPORTBの下位4ビットの比較

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,164

yoshikun

score 91

実現したいこと

ArduinoのPORTB(下位4ビットのみ)を使用して、LEDを点灯させたいです。

0、1、2・・・と15(下位4ビットオール1)までの現在のPORTBの状態を求め、比較する方法を教えていただけますか?
15の時は、

(PORTB & 0xf) == 0x0f


で15(下位4ビットオール1)かそうでないかが比較できるそうです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

int work;
work = PORTB &0x0f;
switch(work){
 case 0:
  // 0 の時
  break;
 case 1:
  // 1 の時
  break;
 case 2:
  // 2 の時
 break;



 case 15:
  //15 の時


と書いたら?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 12:43

    3~14まで省略しました。

    キャンセル

  • 2016/11/11 12:43

    ありがとうございます。

    キャンセル

  • 2016/11/11 14:24

    出力状態を見るのかと思っていた。
    ならば素直に

    void loop()
    {
    int i;
    unsigned bit;
    for(i=0;i<4;i++);
    {
    if(i==0)
    {
    bit=1;
    } else {
    bit *=2;
    }
    PORTB = (PORTB & 0xf0) | bit;
    sleep(1000); // wait 1000ms(1秒待つ)
    }
    }
    位で簡単に出来てしまう。

    キャンセル

checkベストアンサー

0

LED4つをPORTBの下位4bitでON/OFF(1bitあたり1つのLEDに対応)させていると解釈していいですか?
2進数表記
0001 で1番目のLEDだけ光る
0010 で2番目のLEDだけ光る
0100 で3番目のLEDだけ光る
1000 で4番目のLEDだけ光る

0011 なら1番目と2番目が同時光る

という構成なら

if(PORTB & 0x01){/* 1番目が点灯している */}
if(PORTB & 0x02){/* 2番目が点灯している */}
if(PORTB & 0x04){/* 3番目が点灯している */}
if(PORTB & 0x08){/* 4番目が点灯している */}

他の方も回答で??と思われている通り、整数でLED番号指定する。。。この場合ならLEDが15個付いているような構成が思い浮かばなかったのでこちらの判断で4つのLED制御として回答しています。

 追記

質問者様の他の質問を見るとビット演算あたりがまだ少し苦手なのかなと見受けられましたので。

2進数で
0010というのはつまり16進数で0x02

PORTBは8bit?かわかりませんが、下位4ビット以外は全て無視したければ
PORTB & 0x0f <- 0x0fは2進数表記で00001111なので
としてやれば
PORTBがもし2進数で11010011だったとしたら上記処理で 

11010011
00001111
をビット演算で&すると
00000011


で00000011という結果を得られます(ようは条件判定に必要のない値を無視する)

その要領で
PORTBのBIT状態を比較するのに
0001 は16進数で 0x01 
0010 は16進数で 0x02
0100 は16進数で 0x04
1000 は16進数で 0x08
という値でビット演算した値が0になるかどうかで各ビットが1なのか0なのかを判断しています。

これの応用でPORTBの下位1ビットと3ビットがONかどうかというのは
if((PORTB & 0x01) && (PORTB & 0x04)){}
でもできますが、
0x01 | 0x04 つまり
if((PORTB & 0x05) == 0x05)でも比較できます(
下位ビットがすべて1かどうかの判定は
0x01 | 0x02 | 0x04 | 0x08 = 0x0F
なので
if((PORTB & 0x0F) == 0x0F)
となるわけです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 23:25

    hiimさん、横から失礼いたします。質問者の元々の質問が https://teratail.com/questions/54784 でしたので、上位4ビットはいじらずに回答いたしました。ArduinoではGPIOの各ポートのPIN毎の制御が可能ですが、本質問では4ビットに意味があると当初考えて回答いたしました。でもポート状態が'1111'?(出力が受動的?)、またLEDは1ビットだけ?(ここで整合性がなくなり、このコメントをいたしました)。
    突然、不躾ながらのコメント失礼致しました。

    キャンセル

  • 2016/11/12 00:25 編集

    GPIOを各ポート、プルアップしてるのかダウンなのか等まったくわからない状態でとりあえず、コメントのやりとりの流れから勝手に1bitLED一個という結線じゃないのかな?との想定のもと回答しました。(Arduino自体使った事はないです、、、、一般的な初心者向けマイコンならこうかな?という想定でした。。。)

    さきほど、ArduinoしらべたらPORTBは上位2ビットは水晶に使われてるから下位6bitが使用可能なようですね。。

    そして質問者様のLEDのつなぎ方は勝手な想像ですがやはり
    http://www.hobbytronics.co.uk/arduino-tutorial4-cylon
    こういう感じなのではないかな?と想像します。(これは下位5bit使ってますが、、、)

    キャンセル

  • 2016/11/12 00:30

    arduinoでは設定次第で色々とできます。(互換機がamazonで500円以下で買えるし)まあ質問者も初心者のようですので、暖かい目で回答した次第です。またarduinoはC++のサブセットのような言語で今はやりの簡単電子工作の記事も手伝って案件増えそう。それとGPIOのプルアップもビット毎に設定できます。(実は当方、arduinoは先月位から入手して、仕事に活用です)慣れるとまあまあですね。

    キャンセル

  • 2016/11/12 00:32

    調べてみるとマイコンの中ではとっつきやすそうで、遊べそうなマイコンではありますね。私も時間があったら試してみたいと思います(^_^)

    キャンセル

  • 2016/11/12 00:36

    チャットぽくなりましたが、面白いのでお勧めです。(互換機はチャイナ製が多いのでできれば純正を。CH340ドライバーの辺りでつまずく方が多いです)。またWifiやイーサーのシールド(拡張基板)なども色々あって遊べます。

    キャンセル

  • 2016/11/12 00:38

    最後に、arduinoを初めて触るとき、外部電源は不要です。(USBだけで十分)お財布にやさしいコメントでした。

    キャンセル

0

こう言うことでしょうか?

for(int i = 0; i < 4; i++)
    if((PORTB & (1 << i)) != 0)
    {
    // true
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 12:48

    0~15までだから。。

    キャンセル

  • 2016/11/11 12:52

    整数でLED番号指定するHWがあるとは思ってなかった…。

    キャンセル

  • 2016/11/11 13:28

    ん~。どうなんでしょうね。4ビットでデコーダーでもつけて16に分岐させるとか?でも1つしかつかない(もしくは1つだけ消える?)。もしくは4つのLEDだけ?でもPORTBの下位4ビットで点けるなら出力だし。

    キャンセル

  • 2016/11/11 13:49

    ありがとうございます。

    キャンセル

  • 2016/11/11 13:50 編集

    0001→0010→0100→1000→0001→0010・・・というループで1がLED点灯で、0がLED消灯です。
    下位4ビットのみの変更で、光る場所を変えるときは、シフト演算を使用します。

    キャンセル

  • 2016/11/11 15:06

    でもそれでは何のために4ビットが'1111'の比較が必要になるのだろう?

    キャンセル

同じタグがついた質問を見る

  • Arduino

    671questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。