割込みルーチンの「なぜ」

PIC はタイマーやポートRB0/INTなどで割込みができますが、割り込みルーチンの冒頭にコンテキスト(W レジスタや STATUS レジスタ)の内容を待避(保存)させて、割込みプログラムの終りに、待避した値をもとに復帰(戻す)するプログラムを入れます。

PIC16Fxxのデバイスで割込みプログラムを作る際、SWAPF 命令を使うのはなぜでしょうか。使わない部分もあるのは
なぜでしょうか。

;割り込みプログラム・ルーチンの例
 ISR      
   MOVWF  W_TEMP  ; Wレジスタの値を待避
   SWAPF  STATUS,W  
   MOVWF  STATUS_TEMP  ; STATUSの値を待避
   ; 割込みプログラムをここに書く 
   ・
   ・
   SWAPF  STATUS_TEMP,W  
   MOVWF  STATUS  ; STATUSの値を復帰
   SWAPF  W_TEMP,F  ; W_TEMP をスワップ
   SWAPF  W_TEMP,W  ; さらにスワップしてWレジスタへ復帰
   RETFIE    ; 元のプログラムへ戻る
       

STATUS レジスタの値の退避

MOVF 命令は STATUS レジスタの Z フラグの値を =1 に変えてしまいます。
そこで STATUS レジスタに影響のない SWAPF を使って STATUS レジスタの値を退避させます。

STATUS レジスタと W レジスタの値の復帰

STATUS_TEMP レジスタへ退避されたSTATUSレジスタの値はスワップされていますから復帰の際はSWAPF 命令で元に戻します。 W_TEMP レジスタへ退避した W レジスタの値は復帰させるとき MOVF 命令を使うとSTATUSの値が変化してしまうので SWAPF 命令を2度使って元にもどします。
PIC18Fxxx のデバイスでは割込みに上位、下位の割込み順位をつけることができます。
上位割込みまたは割込み順位をつけない場合は簡単にコンテキストの退避と復帰ができる専用のレジスタがあります。 

下位の割込みは上記のようにコンテキスト退避と復帰の手順を踏まなければなりません。 PIC18Fxxx のデバイスは STATUS レジスタの値を変えないで済む MOVFF 命令があるので SWAPF 命令を使わなくて済みます。
この例はこちらの頁にあります。

PIC目次へ        トップページへ