【割込みアーキテクチャの概要】
PIC18シリーズになって割込みの扱いもかなり強化されました。
まず、PIC18シリーズの割込みは、優先順位が追加され、高位と低位2つのレベルの
割込みとなりました。
そして、高位の割込みは、低位の割込みを処理中にも優先的に受け付けられ割込む
ことが出来ます。
また、この優先順位分けを使わないで、従来と同じ割込みとすることも出来ます。
【割込みの構造と優先順位】
全体の割込みの論理は下図のようになっていて、従来の割込み構成が2つ実装されて
いるような構成になっています。これにより2つの優先順位が使えるようになりました。
図のように、全体の割込みを許可/禁止するGIEビットもGIEHとGIELの2種類になり、
それぞれの割込み要因に、HighレベルにするかLowレベルにするかの設定ビットが追加
されました。
【割込みレジスタの構成】
このようなレベル分けした構成と、従来と同じ1レベルだけによる構成と両方出来るように
するため、各割込み要因ごとに設定レジスタが追加され、下記のような4つのレジスタと
なりました。
(1)全体レベル設定レジスタ(RCON、INTCON)
優先順位分けをする/しないの設定を全体で指定できます。RCONレジスタのIPENビット
を「1」にすると優先順位分けをするになり、「0」にするとしないで、従来と同じ1レベルと
して扱います。デフォルトは0となっています。
優先順位を分けた時には、全体の割り込みを許可/禁止するビットGIEも2つに分離さ
れて、GIEHとGIELとなっています。
(2) 割込みフラグ(INTCON、INTCON3、PIR1、PIR2)
従来と同じ割込みを受け付けたことを示すフラグで、受付後にソフトウェアでリセットする
必要があります。
(3) 割込みイネーブル(INTCON、PIE1、PIE2)
各割込み要因ごとに割り込みを使うことを設定するためのものです。
(4) 割込みレベル設定(INTCON3、IPR1、IPR2)
新たに追加された設定情報で、各要因ごとに優先順位をHighにするかLowにするかを
指定します。
【レジスタ詳細】
これらの機能追加の結果、割り込みを制御するレジスタは下記のような10個に増えました。
・RCON 優先順位を使う/使わないの指定 と リセット要因の区別
・INTCON 全体割り込み許可/禁止と基本の割込みフラグ、イネーブル
・INTCON2 基本割り込みの優先順位設定と外部割込みのエッジの指定
・INTCON3 外部割込みのフラグと優先順位設定
・PIR1、PIR2 内蔵モジュールの割込みフラグ
・PIE1、PIE2 内蔵モジュールの割込みイネーブル
・IPR1、IPR2 内蔵モジュールの割込みの優先レベル設定
(1) RCONレジスタ
下図のような構成となっていて最上位ビットのIPENビットのみが割込みに関係し、
全体に対し割り込み優先順位を使うか使わないかを指定します。
![]()
(2) INTCON
下図のような構成となっていて、上位2ビットが優先順位の全体制御に関係しています。
つまり、優先順位がRCONで使うとしてされた時には、GIEHとGIELビットとなって上位、
下位それぞれの割込み全体の許可/禁止を制御します。
優先順位を使わないという設定になった時は、従来と同じ、GIEとPEIEビットとして使わ
れ、全体割り込みの許可/禁止と、内蔵モジュールの割込みの許可/禁止ビットとして
使われます。
【コンテキストの退避/復旧】
割込みを受け付けたとき、割り込みから戻る時に、それまで実行中であった処理が
正常に継続できるようにするため、それまで実行中の処理で使われていたレジスタ類
(コンテキスト)を退避し、割り込み処理を終了しリターンする直前でそれらを復旧する
必要があります。
PIC18シリーズではこの退避のための特別なスタックメモリが追加されました。
これが「Fast Return Stack」と呼ばれるもので、ソフトウェアでは読み書きできま
せんが、割込みを受け付けた時、WREG、STATUS、BSRの3つのレジスタを自動的
にこのスタックに格納し、RETFIE Fast命令で復帰するときに自動的にスタックから
レジスタに復旧してくれます。
この機能を、高位の優先順位の割込み処理で使うようにしておけば、低位の割込み
処理中に高位の割込みが発生しても、レジスタの退避/復旧の処理をソフトウェアで
実行する必要がなく、レジスタの混乱を避けることできるとともに、高速な割込み処理が
可能となります。
ただし、低位の割込みでは、このレジスタは、高位の割込みでいつ書き換えられるか
分からないので低位側では使えません。
このFast Return Stackには割り込みの都度退避されているので、実際につかうには、
RETFIE Fast 命令で復旧させるだけで使うことが出来ます。