ビットの比較とビットの設定

本当に簡単な質問ですが、私はそれを正しく理解していることを確認したいだけです。私はこれが必ずしもArduino特有のものではないことを理解している。

ATmega2560に関して、私は3つのバックツーバックA/D変換を行っています。前の終了直後のものです。私は毎回シングルコンバージョンを呼び出すことでこれを達成しています。

私は変換を完了するのを待つためにこの便利なコードを見つけました:

while(ADCSRA & (1<

私はそれが変換が完了するのを待っていることを理解し、ADSCは0に設定されます(逆に、私はADIFが1に設定されるのを待つことができます)。行が解釈されます。

Normally when I see something along the lines of (1< it means write a 1 to the ADSC bit.

しかし、この場合、そうではありません。

なぜ書くだけではないのですか?

while(ADSC);
3

1 答え

あなたは以下の意味を誤解しています。

1 << ADSC

これは、実際には値ADSC で指定されたビット数だけビットシフト1が残っていることを意味します。

ADSC in this case is 6:

#define ADSC    6

あなたがした場合:

while(ADSC);

あなたは実際にやっているでしょう:

while(6);

もちろん、6は0ではないので、決して終わらないでしょう、そうです。

代わりに1を左に6回シフトします。バイナリでは次のようになります。

00000001
    << 6
01000000

もちろん、それは64、または0x40で16進数です。次に、ADCSRAレジスタの値と論理積をとって、そのレジスタ内の1ビットの値を返します。それはその結果であり、 while を使って制御します。だからそれは次のように終わる:

while(ADCSRA & 0x40);

これは、

while(0x40);

7 th ビットが設定されている場合、または設定されていない場合:

while(0x00);

また、0x00は0であるため、ビットが設定されていないときに while が終了するとfalseとなります。

4
追加された
私は、ADSCがADCSRA登録簿の旗であると私は謝罪します。
追加された 著者 Ambrose,
私は毎日何か新しいことを学びます。ありがとう!
追加された 著者 Ambrose,
これは数字の#defineです。この場合、レジスタ内のADSCビットの番号です。これを使用してレジスタを操作します。ビットを単独で操作することはできません。
追加された 著者 Majenko,
これをAVRライブラリに大きくサポートしています。 nongnu.org/avr-libc/user-manual/group__avr__sfrを参照してください。 html をご覧ください。これはAVR MCUのレジスタとビットフィールドの記号と使用法についても説明します。 loop_until_bit_clear(ADCSRA、ADSC);
追加された 著者 Mikael Patel,