「天文屋のためのマイコン入門」割り込みを使おう
マイコンのプログラムでは、あるきっかけに反応して、今までやっていた処理を中断して、別の処理を強制的にやりたい時があります。
この別の処理を割り込み処理といいます。そのまんまのネーミングですね。あるきっかけとは、たとえば、外部からの信号が変化した、タイマーがオーバーフローした、シリアル通信でデータを受信した。などです。
割り込みを使うのは簡単です。INTCONという割込みに関係したレジスタを操作するだけです。
割り込み処理は、4番地から記述する決まりがあります。マイコンは割り込みが発生すると強制的に4番地にジャンプします。ですから、4番地にちゃんと割り込み処理を記述しておかないとプログラムは暴走します。
4番地にプログラムを記述するにはどうしたらいいでしょうか。実は次のような擬似命令を記述します。
ORG 4
ORGはOriginの略で、この擬似命令の後に命令を記述すれば、4番地からプログラムが記述できます。
しかし、ここで困ったことがあります。割り込み処理は4番地から記述しますが、通常のプログラムは0番地から始まります。つまり、通常のプログラムの真っ只中に割り込み処理があることになります。ほんとうに割り込みですね。そこで通常は0番地の最初の命令はGOTO命令を記述して、割り込み処理を飛び越しさせます。
INTCONレジスタの説明
INTCONレジスタは実はタイマーの説明でもう出てきましたね。そう、タイマーがオーバーフローした時にセットされるフラグを有するレジスタでした。その復習も含めて以下に説明します。
例としてタイマー0オーバーフロー割込みについて説明します。タイマー0がオーバーフローするとbit2のTMR0IFが1にセットされます。これはタイマーのところで説明しましたね。このビットのことを割込み要求フラグと言います。つまり、タイマーがオーバーフローしたので、割り込みを発生してくれという要求のためのビットです。
ただ、割込み要求フラグがセットされていても無条件で割込みが発生するわけではありません。
割り込みが実際に発生するためには、bit5のTMR0IEが1で、かつbit7のGIEも1でなくてはなりません。
TMR0IEはタイマー0オーバーフロー割込みを個別に許可するビットで、GIEは割込み全体を許可するビットです。GIEが0の場合は他のビットがどうであれ、すべての割込みは禁止されます。
したがって、タイマー0オーバーフロー割り込みを使うには、GIEとTMR0IEを両方とも1にセットする命令を記述しなければなりません。
;タイマー0オーバーフロー割り込みの初期化
BSF INTCON , 2 ;TMR0IE=1
BSF INTCON , 7 ;GE =1
2番目の命令を実行した時点で割込みが発生する可能性が出てきますので、2番目の命令を記述する場所は特に注意する必要があります。必ずしも最初の初期化の部分に書けば良いというもではありません。
割込みはマイコンの概念の中では難しい部類です。PICの場合は特に難しいです。あせらず、3回くらいに分けて説明します。今日はここまで。
| 固定リンク
コメント