2012-01-24 22 views
-1

私はバイナリでOCIE0A=0001を知っていますので、(1<<OCIE0A)は0010ですか?私はこれがかなり頻繁に使用されているのを見ます。なぜそれを0010に設定するのではなく、レジスタを(1<<OCIE0A)に設定する理由は何ですか?C言語の(1 << OCIE0A)とは何ですか?

+1

'OCIE0A'は何ですか?変数の名前? – Mysticial

+0

@神秘的なヘックス。 – mugetsu

+6

「I」は16進数ではありません。さらに、それは '0001'の近くにもないでしょう。 – Mysticial

答えて

42

Google検索の結果から判断すると、「タイマ/カウンタ割り込みマスクレジスタ」*の「タイマ/カウンタ出力比較A割り込み」*を制御するビットの名前* 8ビットAVRマイクロコントローラ」*次のようにその用途がある*:TIMSK0は、タイマ割り込みマスクレジスタ*である

TIMSK0 |= _BV(OCIE0A); // enable compare A interrupts 
TIMSK0 &= ~_BV(OCIE0A); // disable compare A interrupts 

*。 OCIE0Aは、*より(AVRコード*に精通した人に)より理解しやすい*という識別子です。

ハーフウィットコンパイラはビット - >マスクに対して同じものに最適化できるので、マスクの代わりにビット識別子を使用しますが、マスク - >ビットの方がより難しくなります*。だから、それをちょっと残しておくと、すべての用途に簡単かつ迅速に*できます。

数値とは無関係に、数字はコンピュータにバイナリとして保存されます。 "Decimal"と "Hex"はの表現で、これらの値のです。したがって、OCIE0Aは「16進数」ではありません。それは私が何を知らない、どこにでも1

*仮定の値で、フラグのビットオフセットを表したシンボルである

+2

+1。 –

+3

埋め込みプログラマとして、私は完全に同意します。私は古いコードを読んで、 'config_reg = 0x051C'を見つけるのが嫌いです。 "ああ、ひどい、もう一度参考マニュアルを見つけなければならない"。それは 'config_reg = EN_FIFO | EN_INT | WORD_SZ_8; ' – AShelly

+1

あなたはあなたの前提に完全に合致しています。また、そのトピックの詳細についてはこちらをご覧ください:http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_use_bv –

関連する問題