トラ技BIOSでの割り込みの使い方平成20年8月16日 78Kマイコンの割り込みのしくみ78Kマイコンは、割り込みが発生すると、割り込み要因に応じてアドレス0004〜003F 番地に書き込まれたアドレスにジャンプします。通常はジャンプ先で必要な処理を行い、割り込み発生の原因を取り除いた後、機械語のRETI 命令で元のルーチンに復帰します。 (※ソフトウェア割り込み(BRK 割り込み)だけはRET 命令で復帰します。) トラ技78Kマイコン基板での割り込みのしくみ78Kマイコンの本来の割り込みベクタ・テーブルは 0004H 番地のROM 領域にあるので、トラ技BIOSの上から書き換えできません。 そこで、トラ技78Kマイコン基板では割り込みが発生すると、いったんトラ技BIOS 内の1800H 番地から始まるルーチンへ分岐するようにしています。その中で要因を判断してユーザが定義した関数へジャンプするようにしています。 割り込み処理関数はユーザがつくる必要がありますが、C 言語で記述した普通の関数が使えます。 多重割り込みやマスクなどは、普通の用途では特に気にする必要はありません。何も特別なことをしなくても多重割り込みは使えます。
割り込み処理プログラムの例割り込み処理関数はC 言語の記述で作った普通の関数が使えます。 具体的には次のリスト のような関数をつくり、適当なタイミングでtrg_regintsrv 関数を呼び出して登録します。trg_regintsrv 関数はトラ技BIOSのAPI関数です。
trg_regintsrv 関数の第一引数は、割り込み要因に応じたID を指定します。 割り込み要因の一覧
trg_regintsrv関数の使い方この関数は実体はマクロで、 #define trg_regintsrv(ID,FUNC) \ と定義されています。わかりやすく書けば、 void trg_regintsrv(unsigned char id,TrgIntService func); となります。引数のidには上の表で挙げた「割り込み要因ID」を指定します。 例えば、UART6の受信完了割り込みを使いたい場合、 void intterupt_uart6_rx(); という関数をつくり、main()の中で trg_regintsrv(TRG_INTID_BSISR6, intterupt_uart6_rx); と、実行します。これでトラ技BIOSのシステムはUART6割り込みが発生した場合にユーザが定義したintterupt_uart6_rx関数を呼び出すようになります。 また、funcにNULLを指定した場合は、その割り込みを使用しないことを意味します。プログラムが実行を終えて、トラ技BIOSに制御を戻す前に、必ず使った割り込みはNULLを指定して解除するようにしてください。 割り込みを有効にする方法78Kマイコンは、内蔵周辺ペリフェラルから割り込み要求が発生するような状況になったら、CPUコア内の割り込みマスク・フラグ・レジスタ(MK0L, MK0H, MK1L, MK1H)の値によってその割り込みが実際に発生するかどうかが決まります。 さらに、トラ技付録基板では、trg_regintsrv関数によって処理ルーチンが登録されていればその処理が行われ、処理ルーチンが登録されていなければトラ技BIOS内で適当に処理します。 つまり、割り込みを使うまでの手順としては @ 内蔵周辺ペリフェラル内のレジスタを設定し、割り込み発生の条件を作る A 割り込みマスク・フラグ・レジスタをセットし、個々の割り込み要因を許可する B トラ技BIOSで割り込み処理関数を登録する また、割り込みが発生したら、割り込み処理ルーチン内でそれに対応する割り込み要求フラグ・レジスタ(IF0L, IF0H, IF1L, IF1H)をリセットしてやらねばなりません。 USB関係の割り込みは使えない残念ながら、現在のトラ技BIOSでは下記のUSB関係の割り込みは使えません。 INTUSB0 USBファンクション・ステータス0 INTUSB1 USBファンクション・ステータス1 INTUSB2 USBファンクション・ステータス2 INTRSUM USB Resume信号検出 USBの割り込みはUSBファームウェアが使用しているためです。そのため、USBから1文字受信したらユーザ定義ルーチンを呼び出すという使い方はまだできません。
|
Copyright(C) 2008 NAITOU Ryuji. All rights reserved. 無断転載を禁ず