R8C15.cは、文字通り、マイコンR8C/15に特化した関数群です。そのほとんどが、マイコン特有のレジスタ(いわゆるSFR)を操作します。操作するといっても、ディジタルですから特定のビットを1にするか0にするかだけです。どのビットがどのような機能を持つかは、マイコンのハードウェアマニュアルに書いてあります。それを見てでも良いですが、前回紹介したように予めマイコン機能一覧を用意しておくと、楽です。
この階層が一番手間がかかるところだと思われがちですが、考えようによってはそうでもありません。大抵のマイコンメーカーはそのマイコン用機能別にサンプルプログラムを用意していますから、それを改良して使えば良いのです。サンプルプログラムから機能設定に必要なレジスタと特定ビットを割り出してハードウェアマニュアルを読めば、時間も大幅に節約できます。くどいようですが読み出した内容は、機能一覧にしておくと後で役立ちます。当然、サンプルプログラムで、動作をきちんと確認しておけば、マイコン特有の機能の理解も早まります。
また、前回述べたような階層構造にしておけば、ここ(R8C15.c)でやるべきことは、ほとんど決まっていますから、改良するのも悩むようなことは、ほとんどないでしょう。あるとすれば、上位階層でまだ、仕様が固まっていない場合です。
では、R8C15.cを見ていきましょう。先ず、割り込み関数のところですが、
#pragma INTERRUPT tz_int ←この部分で割り込みルーチンに設定します(R8C15.h) void (*tx_func)(void); ←この部分が、systemIO.cで設定される関数ポインタです。 void tx_int(void){ ←ここからが、実装部分 tx_func(); }
でおしまいです。実際の中身はmain.cで記載していますから、ここは、割り込みに設定するだけです。コンパイルすると以下のように実装されます。
249 .align 250 .glb _tx_int 251 000B0 _tx_int: ←割り込み関数の入口 252 000B0 ECFD pushm R0,R1,R2,R3,A0,A1,FB 253 000B2 7D1F0000r jsri.a _tx_func ←間接サブルーチン読み出し 254 000B6 EDBF popm R0,R1,R2,R3,A0,A1,FB 255 000B8 FB reit ←割り込み関数の出口 256 000B9 M7:
割り込み関数の入口と出口で汎用レジスタの退避/復帰を行い、戻りには、"reit"を使います。
"#pragma INTERRUPT"の指定でこれらが自動的に設定されます。これらはあくまでR8C/15用ですから、例えば、NECの78Kマイコンであれば、違うやり方になります。
また、R8C15.incの中で、割り込みに応じたアドレスに割り込み先を指定します。
.org VECTOR_ADR .lword dummy_int ; vector 0 .lword dummy_int ; vector 1 : .lword dummy_int ; vector 20 .lword dummy_int ; vector 21 .glb _tx_int .lword _tx_int ; vector 22 timerX用 .lword dummy_int ; vector 23 .glb _tz_int .lword _tz_int ; vector 24 timerZ用 .lword dummy_int ; vector 25 .lword dummy_int ; vector 26 : .lword dummy_int ; vector 62 .lword dummy_int ; vector 63
これら割り込みに応じたアドレスへの割り込み先の指定は、マイコンが異なってもほとんど同じようにあります。ファイル名やアドレス、指定方法は違うでしょうが。
この辺も、大抵のマイコンメーカでサンプルプログラムもしくはアプリケーションノートが用意されています。それをもとに設定していけば、それほど手間はかからないはずです。
関数名に"_"がついているのは、コンパイラの仕様です。この辺は、開発環境のマニュアルに書いてあります。
その他は、レジスタの設定ですので特に説明はしません。下記のwebを参照して下さい。
注意点としては、特定ビットの設定または読み出しの際、ビット単位、バイト単位、ワード単位の操作で動作が異なる場合があることです。この辺も、ハードウェアマニュアルまたはテクニカルアップデートに書いてありますので、必要な機能のレジスタ周りは、よく読んでおくことです。特にサンプルプログラムを変更して使う際は、忘れずに。
マイコン機種を変える時、今までの資産を書き直すと考えると大変ですが、最初から前回書いたような階層構造にしておけば、最下層のところのみの変更ですから、マイコン機種を変更するのも大幅に簡単になります。
マイコン機種に依存しないシステム、作ってみませんか?
参考:R8C/15グループ
テクニカルアップデート:レジスタ設定の注意点等
ドキュメント:ハードウェア&ソフトウェアマニュアル、開発環境マニュアル等
アプリケーションノート:サンプルプログラム等