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にアクセス できるようになります。
© Copyright 2024 ExpyDoc