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 : 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; これはbit_def構造体の定義です。 char b0:1;と宣言すると1ビットのデータとなります。 この構造体のサイズは全部で8ビットです。(b0~b7) この構造体の変数を作成した場合 構造体変数名.b0 などの方法で、対応するビットへアクセスできます。 プログラム 構造体変数名.b0=1; x=構造体変数名.b1 構造体に対応したメモリ 5V 1 1 b7 b6 b5 b4 b3 b2 b1 b0
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; これはbyte_def共用体の定義です。 bitというメンバ変数(bit_def型)と、byteというメンバ変数(char型)は、どちらも8ビットのデータです。 この共用体のサイズは全部で8ビットです。 この共用体の変数を作成した場合 共用体変数名.byte の方法で、8ビット全体にアクセスできます。 この共用体の変数で 共用体変数名.bit.b0 の方法で、1ビット毎にアクセスできます。 プログラム 共用体変数名.bit.b0=1; 共用体変数名.byte=0x0F; 構造体に対応したメモリ 0 0 0 0 1 1 1 1 1 b7 b6 b5 b4 b3 b2 b1 b0
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; これが実際の変数の宣言です。 変数名p1_addrはbyte_def共用体の変数として定義されています。 #pragmaでアドレスを00E1に割り当てているので、SFRにアクセスする変数となっています。 プログラム p1_addr.bit.b0=1; メモリのSFR領域 00E1 1 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にアクセスできるようになります。