【割込みアーキテクチャの概要】
PIC18シリーズになって割込みの扱いもかなり強化されました。
まず、PIC18シリーズの割込みは、優先順位が追加され、高位と低位2つのレベルの
割込みとなりました。
そして、高位の割込みは、低位の割込みを処理中にも優先的に受け付けられ割込む
ことが出来ます。
また、この優先順位分けを使わないで、従来と同じ割込みとすることも出来ます。
【割込みの構造と優先順位】
全体の割込みの論理は下図のようになっていて、従来の割込み構成が2つ実装されて
いるような構成になっています。これにより2つの優先順位が使えるようになりました。
図では、上半分が高位レベルの割込み制御回路で、下半分は低位レベル割込みです。
まず、左側から、すべての割込み要因に対して高位/低位の指定ができるようになって
います。これがそれぞれの割込みフラグにある「xxIP」というビットでこれが「1」だと高位、
「0」なら低位側が有効な割込みとなります。
全体の割込みを許可/禁止するGIEビットもGIEHとGIELの2種類になり、「IPEN」ビット
により、割込みレベル分けを有効にすると、GIEH,GIELが2つの許可ビットとして有効に
なります。
IPENが0の時はレベル分けをしないという指定になり、高位側の割込みベクタだけが
有効になります。
このときの割込み許可は、GIEHはGIEとなって全体の許可/禁止を制御し、GIELは
PEIEとなって周辺割込み許可/禁止を制御することになります。
【コンテキストの退避/復旧】
割込みを受け付けたとき、割り込みから戻る時に、それまで実行中であった処理が
正常に継続できるようにするため、それまで実行中の処理で使われていたレジスタ類
(コンテキスト)を退避し、割り込み処理を終了しリターンする直前でそれらを復旧する
必要があります。
PIC18シリーズではこの退避のための特別なスタックメモリが追加されました。
これが「Fast Register Stack」と呼ばれるもので、ソフトウェアでは読み書きできま
せんが、高位の割込みを受け付けた時、WREG、STATUS、BSRの3つのレジスタを
自動的にこのスタックに格納し、RETFIE Fast命令で復帰するときに自動的にスタック
からレジスタに復旧してくれます。
この機能は、高位の優先順位の割込み処理でしか使えませんが、低位の割込み
処理中に高位の割込みが発生しても、レジスタの退避/復旧の処理をソフトウェアで
実行する必要がなく、レジスタの混乱を避けることできるとともに、高速な割込み処理が
可能となります。
ただし、低位の割込みでは、このレジスタは、高位の割込みでいつ書き換えられるか
分からないので低位側では使えません。
しかし割込みレベルを1レベルだけで使うときには、全てを高位割込みに設定すれば
このFast Register Stackを使うことができます。
このFast Register Stackには割り込みの都度退避されているので、実際に使うには、
RETFIE Fast 命令で復旧させるだけで使うことができます。
低位割込み処理で、このFast Register Stackを使わずに、命令によってレジスタを退避、
復旧するには、下記のようなプログラムで実現できます。
これまでと異なり、2ワード命令を使うことでスマートに出来ます。
【レジスタ退避、復旧ルーチン】
【割込みレジスタの構成】
このようなレベル分けした構成と、従来と同じ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ビットのみが割込みに関係し、
全体に対し割り込み優先順位を使うか使わないかを指定します。
下位5ビットはリセットの要因の区別に使います。(リセットのページ参照)
(2) INTCONレジスタ
割込みの全体の許可/禁止の制御をするためのレジスタで、下図のような構成と
なっていて、上位2ビットが優先順位の全体制御に関係しています。
つまり、RCONレジスタで優先順位を使うと指定された時には、INTCONレジスタの上位
2ビットが、GIEHとGIELビットとなって上位、下位それぞれの割込み全体の許可/禁止
を制御します。
優先順位を使わないと指定されたときは、従来と同じ、GIEとPEIEビットとして使われ、
全体割り込みの許可/禁止と、内蔵基本モジュールの割込みの許可/禁止ビットと
して使われます。
(3) INTCON2レジスタ
基本内蔵モジュールの割込み制御用のレジスタで、外部割込みエッジと
割込みレベルの設定を行います。
内容は下図のようになっています。
(4) INTCON3レジスタ
外部割込みの制御用のレジスタ
内容は下図のようになっています。
(5) PIR1レジスタ、PIR2レジスタ
追加の周辺内蔵モジュールの割込みフラグ用のレジスタで、内容は下図の
ようになっています。
(6) PIE1レジスタ、PIE2レジスタ
追加の周辺内蔵モジュールの割込み制御用のレジスタで、内容は下図の
ようになっています。
(7) IPR1レジスタ、IPR2レジスタ
追加の周辺モジュールの割込みレベルの指定用のレジスタです。
内容は下図のようになっています。