「天文屋のためのマイコン入門」割込み最終説明続き
前回の復習です。
STATUSレジスタというのはゼロフラグのような各種フラグを格納しており、命令の結果により値がしゅっちゅう書き換わっています。このような不安定なレジスタを値を変えずに保存用のレジスタに格納しなければなりません。
そのため、次のような命令は許されません。
MOVF STATUS,W
なぜなら、MOVFという命令は転送する値が0か0以外でどちらにしてもSTATUSレジスタの値が変わってしまいます。しかも、転送する前に値が変わってしまうのです。
そこで、フラグを変化させない命令でSTATUSレジスタをワーキングレジスタに転送させる必要があります。そのような命令があるか? 実はあるんです。(ないわけないです。ないならマイコンの命令セットとしては不完全ですから)
スワップという命令です。スワップというのは交換という意味です。スワップ命令はレジスタ単独間の命令とレジスタとワーキングレジスタ間の命令があります。まずは、レジスタとワーキングレジスタ間の命令を説明します。
転送命令とほとんど同じですが、転送するときに、レジスタfの上位4ビットと下位4ビットを交換してWへ転送します。交換して転送するというのが面白いです。で、この命令はフラグに影響を与えません。
もう一つは、上の命令のWをFに変えたもので、これはレジスタ単独の交換命令になります。
このスワップ命令はフラグを変化させません。この命令を使えば、STATUSレジスタをSTATUS_BUFに転送させることができます。
まず、ワーキングレジスタを保存しましょう。
MOVWF W_BUF ;W -> W_BUF Wを保存
この命令の実行でフラグは変化しません。次に、STATUSレジスタを保存します。スワップ命令でワーキングレジスタに転送します。
SWAPF STATUS , W ;STATUS -> W STATUSをWに交換転送
下位4ビットと上位4ビットが入れ替わり、ワーキングレジスタに保存されますが、実害はありません。戻すに、もう一度入れ替わるからです。
さて、STATUSレジスタの内容がWに転送されましたので、それをSTATUS_BUFに保存します。
MOVWF STATUS_BUF ;W -> STATUS_BUF
これで完成です。割り込みの先頭では次のように記述します。
ORG 4H
MOVWF W_BUF
SWAPF STATUS , W
MOVWF STATUS_BUF
さて、次は割込み処理の出口です。ここでは上で保存したワーキングレジスタとSTATUSレジスタの内容を戻してやります。やはり、これらの値を変化させてはいけません。
まず、STATUSレジスタの内容を元に戻します。これを復帰といいます。STATUSを復帰させます。
最初にスワップ命令でSTATUS_BUFに保存してあったSTATUSの内容をWに戻します。
SWAPF STATUS_BUF , W
Wの値が変化しますが、問題ありません、Wはまだ復帰していないからです。Wに入ったSTATUS_BUFの内容をSTATUSに転送します。
MOVWF STATUS
これで、無事STATUSが復帰しました。フラグを変化させる命令は一切使っていません。
次にWを復帰させますが、既にSTATUSは復帰しているので、フラグを変化させる命令を使ってはいけません。そこでスワップ命令を使わざるを得ないのですが、
SWAPF W_BUF , W
ただ、これだと、上位4ビットと下位4ビットが入れ替わってしまいます。そこでこの命令の前にもう一回スワップ命令をやって、予め4ビットを入れ替えておきます。
SWAPF W_BUF , F
SWAPF W_BUF , W
図で説明しましょう。
これで完成です。まとめです。割込み処理は先頭と終わりに次のような命令を記述します。これを記述することにより、WとSTATUSは割込み処理で値が変化することがないので、メインの処理に影響を与えることはありません。
STATUSの中にはバンク番号も入っているので、割込み処理の中でバンクを変化させても大丈夫です。
W_BUF EQU xxh
STATUS_BUF EQU xxh
;ここから割込み処理
ORG 4
;入り口の処理
MOVWF W_BUF
SWAPF STATUS , W
MOVWF STATUS_BUF
。
。
。
;出口の処理
SWAPF STATUS_BUF , W
MOVWF STATUS
SWAPF W_BUF , F
SWAPF W_BUF , W
RETFIE
それにしてもめんどくさいですPICマイコン。普通のマイコンはこんな面倒ではないです。さて、割り込みの説明はこれで終わりですが、難しかったですか? 難しいなら、もう丸暗記するしかないですね。上記、入り口出口の処理は定型文として覚えるしかないですね。
次回、いよいよインターバルシャッターのプログラムを作ります。
| 固定リンク
コメント