R8C I/Oポートの仕組み

R8C I/Oポートの仕組み
SFR定義ファイルの中身
SFR定義ファイルとは


sfr_r815.hファイル
p1_1などの変数名をプログラム中で利用でき
るようにする
 I/Oポートへのアクセスの場合、1バイト単位の
アクセス以外に、1ビット毎(1つのI/Oポート
毎)のアクセスもできるようにしている
SFR定義ファイルの中身
#pragma ADDRESS p1_addr 00E1H
:
:
struct bit_def{
char b0:1;
char b1:1;
char b2:1;
char b3:1;
char b4:1;
char b5:1;
char b6:1;
char b7:1;
};
union byte_def{
struct bit_def bit;
char byte;
};
union byte_def p1_addr;
SFR定義ファイルの中身
#pragma ADDRESS p1_addr 00E1H
:
:
struct bit_def{
char b0:1;
char b1:1;
char b2:1;
char b3:1;
char b4:1;
char b5:1;
char b6:1;
char b7:1;
};
union byte_def{
struct bit_def bit;
char byte;
};
union byte_def p1_addr;
#pragma(「プラグマ」)とは、
コンパイラに特定の情報を渡す
ために使用するコンパイラ指令
です。
この中身は、コンパイラごとに
異なっています。
この場合は、p1_addrという変数
名を、アドレス00E1に強制的に
割り当てています。
こうすることで、p1_addrという
変数名でSFRの00E1アドレスへア
クセスできるようになります。
SFR定義ファイルの中身
#pragma ADDRESS p1_addr 00E1H
これはbit_def構造体の定義です。
:
:
char b0:1;と宣言すると1ビットの
struct bit_def{
データとなります。
char b0:1;
char b1:1;
この構造体のサイズは全部で8
char b2:1;
ビットです。(b0~b7)
char b3:1;
char b4:1;
この構造体の変数を作成した場
char b5:1;
合
char b6:1;
構造体変数名.b0
char b7:1;
などの方法で、対応するビット
};
へアクセスできます。
union byte_def{
struct bit_def bit;
プログラム
構造体変数名.b0=1;
x=構造体変数名.b1
char byte;
};
5V
1 1
構造体に対応したメモリ
union byte_def p1_addr;
b7
b6
b5
b4
b3
b2
b1
b0
SFR定義ファイルの中身
#pragma ADDRESS p1_addr 00E1H
• これはbyte_def共用体の定義です。
:
• bitというメンバ変数(bit_def型)と、
:
byteというメンバ変数(char型)は、ど
struct bit_def{
ちらも8ビットのデータです。
char b0:1;
• この共用体のサイズは全部で8ビットで
char b1:1;
す。
char b2:1;
• この共用体の変数を作成した場合
char b3:1;
共用体変数名.byte
char b4:1;
の方法で、8ビット全体にアクセスでき
char b5:1;
ます。
char b6:1;
• この共用体の変数で
char b7:1;
共用体変数名.bit.b0
};
の方法で、1ビット毎にアクセスできま
union byte_def{
す。
struct bit_def bit;
プログラム
共用体変数名.bit.b0=1;
共用体変数名.byte=0x0F;
char byte;
};
1
構造体に対応したメモリ 0 0 0 0 1 1 1 1
union byte_def p1_addr;
b7
b6
b5
b4
b3
b2
b1
b0
SFR定義ファイルの中身
#pragma ADDRESS p1_addr 00E1H
これが実際の変数の宣言です。
:
:
変数名p1_addrはbyte_def共用体の変数と
struct bit_def{
して定義されています。
char b0:1;
char b1:1;
#pragmaでアドレスを00E1に割り当てて
char b2:1;
いるので、SFRにアクセスする変数となっ
char b3:1;
ています。
char b4:1;
char b5:1;
char b6:1;
char b7:1;
};
union byte_def{
struct bit_def bit;
p1_addr.bit.b0=1;
プログラム
char byte;
};
1
メモリのSFR領域
00E1
union byte_def p1_addr;
b7
b6
b5
b4
b3
b2
b1
b0
SFR定義ファイルの中身2
#define p1 p1_addr.byte
#define p1_0 p1_addr.bit.b0
:
:
#defineでp1_0などがプログラム
中で利用できるように定義して
います。
こうすることで、p1_0がSFR内の
ポート1のビット0にアクセス
できるようになります。