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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

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

Q&A

解決済

3回答

3064閲覧

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

Yoshikun_0945

総合スコア224

Arduino

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

0グッド

0クリップ

投稿2016/11/11 03:32

編集2016/11/11 03:33

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

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

(PORTB & 0xf) == 0x0f

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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 03:41

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2016/11/11 05: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秒待つ) } } 位で簡単に出来てしまう。
guest

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 05:07

編集2016/11/11 05:31
hiim

総合スコア1689

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2016/11/11 14:25

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

2016/11/11 15:26 編集

GPIOを各ポート、プルアップしてるのかダウンなのか等まったくわからない状態でとりあえず、コメントのやりとりの流れから勝手に1bitLED一個という結線じゃないのかな?との想定のもと回答しました。(Arduino自体使った事はないです、、、、一般的な初心者向けマイコンならこうかな?という想定でした。。。) さきほど、ArduinoしらべたらPORTBは上位2ビットは水晶に使われてるから下位6bitが使用可能なようですね。。 そして質問者様のLEDのつなぎ方は勝手な想像ですがやはり http://www.hobbytronics.co.uk/arduino-tutorial4-cylon こういう感じなのではないかな?と想像します。(これは下位5bit使ってますが、、、)
MasahikoHirata

2016/11/11 15:30

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

2016/11/11 15:32

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

2016/11/11 15:36

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

2016/11/11 15:38

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

0

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

C++/C#

1 2for(int i = 0; i < 4; i++) 3 if((PORTB & (1 << i)) != 0) 4 { 5 // true 6 } 7 8

投稿2016/11/11 03:46

mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mugicya

2016/11/11 03:52

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

2016/11/11 04:28

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

2016/11/11 04:50 編集

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

2016/11/11 06:06

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問