PIC24Fシリーズ内蔵の割り込みについて説明します。
【割り込みの方式】
PIC24Fファミリの割り込み方式は、ベクタ方式になっていて、割り込み要因ごとに
独立のジャンプ先がテーブル形式で用意されています。
禁止できないトラップが8個と、禁止可能な割り込みが118個の合計126個が用意
されていて、それぞれにプログラム メモリ内の指定アドレスにテーブル形式で配置
されています。
この割り込みベクタには、それぞれの割り込み処理の開始番地を24ビットで配置
します。使わない割り込みの場合には、リセットベクタにジャンプするようなデフォルト
の割り込み処理を作成し、そこにジャンプするようにします。
これで、割り込みが発生すると自動的に対応する割り込みベクタを使って、そこに
指定されたアドレスにジャンプしますので、直ぐ対応する割り込み処理を実行開始
できます。これで非常に高速な応答処理とすることができます。
この割り込みベクタは、割り込みベクタ テーブル(IVT)と代替割り込みベクタ テーブル
(AIVT)の2種類があり、代替割り込みベクタ テーブルは、デバッグなどの際に異なる
割り込み処理プログラムを用意している場合、一括で割り込み処理プログラムを変更
するような場合に使います。
この切り替えは、ALTIVTビット(INTCON2<15>)により制御します。
これらのベクタ テーブルの配置は下図のようになっています。
0番地から始まる2ワードはリセット ベクタで、割り込みベクタはこの後の4番地から
始まっています。リセット ベクタには、通常2ワードのGOTO命令を配置します。
リセットによりプログラム カウンタが0クリアされることで0番地から実行が開始されます
から、このGOTO命令で任意の場所からプログラムを実行させることができます。
ベクタ テーブルはMPLAB C30コンパイラでプログラムを作成すると、自動的に
デフォルト状態で生成されるようになっていますし、割り込み処理関数を記述すると
割り込みベクタも自動的に生成されるようになっています。
【割り込み優先順位】
PIC24Fファミリは、周辺モジュールの各割り込み要因ごとに割り込み
優先レベルとして0から15の16段階を設定できます。
優先レベルは次のように8レベルずつの2つに分けられて、それぞれの割り込み
要因に設定されます。数値の大きい方が高い優先レベルとなっています。
レベル15から8 : トラップのそれぞれに固定設定
レベル7から0 : 汎用割り込みに設定する
これに対して、CPUの割り込み優先レベルも0から15の任意の値に設定できます。
この設定は下記の2つのレジスタ設定で行います。
・CORCONレジスタのIPL<3> :レベルの最上位ビット
・SRレジスタのIPL<2:0> :レベルの下位3ビット(0〜7)
そして実際の割り込みは、このCPUの割り込み優先レベルより割り込みレベルが
高い割り込みだけが許可され受け付けられます。
リセット後はIPL<3>=0となっていますので、CPUの割り込み許可レベルは7以下
ですからトラップは常に割り込み許可状態となっています。
一般の周辺モジュールの割り込み要因のレベルは、それぞれに用意されている
IPCxレジスタ内のxxIP<2:0>ビットで0から7に設定できます。
同じ割り込みレベル間の優先順位は、割り込みベクタテーブルの並び順となって
います。これで、まったく同時に割り込みが発生した場合には、割り込みベクタ テーブル
の若いアドレスの方が先に受け付けられることになります。
【割り込み関連レジスタ】
割り込みに関連するSFRはたくさんあり、下記のようなレジスタが関連します。
・SRレジスタ :CPUの割り込み優先レベル設定制御
・CORCONレジスタ :CPUの割り込み優先レベルのIPL<3>の設定制御
・INTCON1レジスタ :グローバル制御で割り込みネスティング制御
・INTCON2レジスタ :外部割込み制御
・IFSnレジスタ :割り込みフラグ用レジスタ群
・IECnレジスタ :割り込み許可用レジスタ群
・IPCnレジスタ :割り込み優先レベル設定用レジスタ群
【割り込みの許可手順】
各割り込み要因ごとに割り込みを許可するには下記の手順で行います。
(1) 割り込み要因の割り込みを許可する
各内蔵モジュールの割り込み要因には、割り込みを許可禁止するための
ビット(xxxIE)がIECnレジスタに用意されています。
このビットを1にすればそのモジュールの割り込みが許可されます。
(2) 割り込み要因の割り込み優先レベルを設定する
各内蔵モジュールの割り込み要因には、割り込み優先レベルを指定する
ビット(xxxIP<2:0>)が用意されています。
このビットはいずれも3ビット構成で0から7までの数値で設定します。
(3) CPUの割り込み優先レベルを設定する
CPU自身の割り込み優先レベルはステータスレジスタ(SR)の中の
IPL<2:0>ビットとして用意されています。
この割り込み優先レベルは、内蔵モジュールとの関係が下記の関係になると
内蔵モジュールの割り込みが許可されます。
xxxIP<2:0> > IPL<2:0>
このCPU割り込み優先レベルはデフォルトでは2に自動的に設定されます。
以上の設定をすれば割り込みが許可され、内蔵モジュールで割り込み要因が
発生すれば、レジスタIFSn内の割り込みフラグビット(xxxIF)が1になって割り込む
ことが可能になります。
この割り込みフラグは自動的にクリアされることはありませんので、割り込みを
受け付けたら、割り込みサービスルーチンの中でクリアする必要があります。
これを忘れると同じ割り込みが永久に継続発生します。