トラ技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関数です。


    void Warikomi (void) { // ユーザが定義した割り込み処理関数
       /* ここに処理の実体を書く */
    }

    void main() {
     ・・・ // いろいろな初期化

     trg_regintsrv(TRG_INTID_BSIP0, Warikomi); //割り込み処理関数を登録する

     ・・・ // メインの処理

     trg_regintsrv(TRG_INTID_BSIP0, NULL); //割り込み処理関数を解除する

    }


    trg_regintsrv 関数の第一引数は、割り込み要因に応じたID を指定します。
    上のリスト のTRG_INTID_BSIP0 というのは外部端子割り込み0 を意味します。これらのID はtrgbios.h内でマクロ定義されています。

割り込み要因の一覧

    割り込み要因

    割り込み要因ID

    数値

    低電圧検出

    TRG_INTID_BSILVI

    0

    端子入力エッジ検出

    TRG_INTID_BSIP0

    1

    端子入力エッジ検出

    TRG_INTID_BSIP1

    2

    端子入力エッジ検出

    TRG_INTID_BSIP2

    3

    端子入力エッジ検出

    TRG_INTID_BSIP3

    4

    UART6の受信エラー検出

    TRG_INTID_BSISRE6

    5

    UART6の受信完了

    TRG_INTID_BSISR6

    6

    UART6の送信完了

    TRG_INTID_BSIST6

    7

    CSI10の通信完了

    TRG_INTID_BSICSI10

    8

    TMH1とCMP01の一致

    TRG_INTID_BSITMH1

    9

    TM50とCR50の一致

    TRG_INTID_BSITM50

    10

    TM00とCR000の一致

    TRG_INTID_BSITM000

    11

    TM00とCR010の一致

    TRG_INTID_BSITM010

    12

    TM51とCR51の一致

    TRG_INTID_BSITM51

    13

    BRK命令の実行

    TRG_INTID_BSBRK

    14

trg_regintsrv関数の使い方

    この関数は実体はマクロで、

      #define trg_regintsrv(ID,FUNC) \
          (( void (*)(unsigned char id,TrgIntService func)   ) ( 0x18E0 )) \
          (ID,FUNC)

    と定義されています。わかりやすく書けば、

      void trg_regintsrv(unsigned char id,TrgIntService func);

    となります。引数のidには上の表で挙げた「割り込み要因ID」を指定します。
    funcにはユーザが定義した割り込み処理関数を指定します。

    例えば、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文字受信したらユーザ定義ルーチンを呼び出すという使い方はまだできません。

 

chickens_back.gif 戻る

 Copyright(C) 2008 NAITOU Ryuji. All rights reserved. 無断転載を禁ず