« 「天文屋のためのマイコン入門」割込み最終説明 | トップページ | 星太朗さんへの回答 »

2014年7月13日 (日)

「天文屋のためのマイコン入門」割込み最終説明続き

前回の復習です。

STATUSレジスタというのはゼロフラグのような各種フラグを格納しており、命令の結果により値がしゅっちゅう書き換わっています。このような不安定なレジスタを値を変えずに保存用のレジスタに格納しなければなりません。

そのため、次のような命令は許されません。

MOVF   STATUS,W

なぜなら、MOVFという命令は転送する値が0か0以外でどちらにしてもSTATUSレジスタの値が変わってしまいます。しかも、転送する前に値が変わってしまうのです。

そこで、フラグを変化させない命令でSTATUSレジスタをワーキングレジスタに転送させる必要があります。そのような命令があるか? 実はあるんです。(ないわけないです。ないならマイコンの命令セットとしては不完全ですから)

スワップという命令です。スワップというのは交換という意味です。スワップ命令はレジスタ単独間の命令とレジスタとワーキングレジスタ間の命令があります。まずは、レジスタとワーキングレジスタ間の命令を説明します。

1407131

転送命令とほとんど同じですが、転送するときに、レジスタfの上位4ビットと下位4ビットを交換してWへ転送します。交換して転送するというのが面白いです。で、この命令はフラグに影響を与えません。

もう一つは、上の命令のWをFに変えたもので、これはレジスタ単独の交換命令になります。

1407132

このスワップ命令はフラグを変化させません。この命令を使えば、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

図で説明しましょう。

1407133

これで完成です。まとめです。割込み処理は先頭と終わりに次のような命令を記述します。これを記述することにより、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マイコン。普通のマイコンはこんな面倒ではないです。さて、割り込みの説明はこれで終わりですが、難しかったですか? 難しいなら、もう丸暗記するしかないですね。上記、入り口出口の処理は定型文として覚えるしかないですね。

次回、いよいよインターバルシャッターのプログラムを作ります。

|

« 「天文屋のためのマイコン入門」割込み最終説明 | トップページ | 星太朗さんへの回答 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 「天文屋のためのマイコン入門」割込み最終説明 | トップページ | 星太朗さんへの回答 »