ビットアクセス
テクニカル・ノート 25083
アーキテクチャ:
AVR
コンポーネント:
compiler
更新日:
2018/08/08 8:14
はじめに
本テクニカルノートでは、AVR用IAR Embedded Workbenchを使用する際のビットアクセスに関するさまざまな事柄について説明します。
背景
多くの特殊機能レジスタ(SFR)には、セット、クリア、テストの対象となるビットが含まれています。本テクニカルノートでは、それらのビットをセット、クリア、テストする方法について説明します。
例えば、8051用のコンパイラに慣れているユーザであれば、ISO/ANSI C言語の拡張仕様であるドットによるビット番号構文(P3.2等)に詳しいかもしれません。その構文は、AVR用IAR C/C++コンパイラではサポートされていません。
推奨の方法
その代わり、ISO/ANSI Cでは、C言語の通常の表記でビットにアクセスできます。
P3 &= ~(1 << 2); /* clear a bit */
P3 |= (1 << 2); /* set a bit */
コンパイラは、ユーザが何をしたいかを理解して、可能であれば、指定されたビット命令を使用します。
シンボル名が存在するビットにアクセスする必要がある場合、ヘッダファイルio<chip>.hで定義されたビット名を使用できます。例えば、8535にはGIMSKレジスタがあり、このレジスタにはINT1というビットがあります。このビットは、以下の方法でセットできます。
GIMSK |= (1 << INT1);
ヘッダファイルio8535.hの末尾でビット名を定義するには、ENABLE_BIT_DEFINITIONSというシンボルを定義する必要があります。これは以下のようにします。
#define ENABLE_BIT_DEFINITIONS
#include <io8535.h>
また、これをコード内で定義する代わりに、ビルド環境で定義することもできます。
I/Oヘッダファイル内のSFRシンボルを定義するのに使用されるSFR_?()マクロでも、ビットシンボルが定義されています。これにより、以下のように記述できます。
GIMSK_Bit2 = 0;
これを明確に説明するため、AVR用IAR C/C++コンパイラのリリース2.28A以降、このヘッダファイルに以下のコメントが追加されています。
/*****************************************************
* An example how the macro's below expand to.
* SFR_B(AVR, 0x1F) Expands to:
* __io union {
* unsigned char AVR;//The sfrb as 1 byte
* struct { //The sfrb as 8 bits
* unsigned char AVR_Bit0:1,
* AVR_Bit1:1,
* AVR_Bit2:1,
* AVR_Bit3:1,
* AVR_Bit4:1,
* AVR_Bit5:1,
* AVR_Bit6:1,
* AVR_Bit7:1;
* };
* } @ 0x1F;
* To set bit 5 of AVR you can do like this:
* AVR |= (1<<5);
* or like this:
* AVR_Bit5 = 1;
****************************************************/
GIMSK_Bit2というシンボルは、実際には1ビットの匿名ビットフィールドを表します。匿名に関する部分は言語の拡張仕様で、ビットフィールドはISO/ANSI C言語の仕様です。
すべての製品名は、その所有者の商標または登録商標です。