「天文屋のためのマイコン入門」STATUSレジスタ詳細
さて、ページ番号を切り替えるには、STATUSレジスタにページ番号を設定(書込み)すればよいのでした。ところでSTATUSレジスタは8ビットの情報をもつレジスタですが、その詳細を以下に示します。(上段のb0などは第0ビットということ)
ここで黄色の部分でページ番号を指定します。他のビットですが、これはページ数とはまったく関係ない機能です。STATUSレジスタはページ数以外の情報も扱うレジスタと思ってください。
さて、この黄色の部分でページ数を設定するのですが、それを下の表に示します。
これを見ると、たとえばページ数を2に設定したいなら、RP1=1、RP0=0とすればよいのが分かります。具体的なプログラムではSTATUSレジスタに2進数で01000000を書き込めばよい事がわかります。ここでSTATUSレジスタの番地は3番地であることに注意すると、プログラムは以下のようになります。
MOVLW b'01000000' ワーキングレジスタに2進数01000000を転送
MOVWF 3 ワーキングレジスタの内容を3番地に転送
2進数の場合、先頭にbを付け、シングルコーテーションで囲うことに注意して下さい。
これで、STATUSレジスタに値01000000を書き込むことができました。つまりレジスタファイルにおいて2ページ目を開いたことになります。
しかし、このプログラムでは問題があります。STATUSレジスタはページ数以外にも他の情報を共有しています。つまり、RP1、RP0以外の他のビットにも値を書き込んでしまうことになるのです。これは他の全然関係ない部分に影響を与えてしまうのでまずいです。
そこで、特定のビットだけ、1(ビットをセット)または0(ビットをクリア)に書き込む命令を紹介しますので、これを使うようにします。
これを見ると、STATUSのRP0を1にセットしたい場合はSTATUSレジスタは3番地なので、
BSF 3,5
とすれば良い事になります。
さて、この命令を使えば、レジスタファイルのページを切り替えるのは次のように命令を書けばよいことになります。
ページ0
BCF 3,5
BCF 3,6
ページ1
BSF 3,5
BCF 3,6
ページ2
BCF 3,5
BSF 3,6
ページ3
BSF 3,5
BSF 3,6
さて、STATUSのRP0とRP1の値がわかっていて変更する必要がないならそれらの命令を省略することができます。たとえばマイコン起動時はRP0もRP1も初期値は0ですから、クリアする命令は省略できて、次のようになります。
ページ0
なし
ページ1
BSF 3,5
ページ2
BSF 3,6
ページ3
BSF 3,5
BSF 3,6
次に4つのページのうち、良く使うのはページ0と1ですから、実際問題としては、RP0のクリアとセットだけでなんとかなってしまうこともあります。
ページ0にする
BCF 3,5
ページ1にする
BSF 3,5
さて、前回出した4つのレジスタファイルのページの図を良く見てください。STATUSレジスタがすべてのページにあります。これは当然といえば当然です。STATUSレジスタが一つのページにしかないと、ページを切り替えたらSTATUSページにアクセスできなくなり、2度ともとのページに戻れなくなってしまいます。
STATUS以外にも、複数のページに同じ名称のレジスタがあります。これらはすべて同一のものです。良く使うレジスタはいちいちページを切り替える必要がないようにという配慮からです。
また、この図の灰色の部分はプログラムで自由にメモリとして使えるレジスタですが、112番地から127番地の16番地は、どのページもページ0と同一です。ですから、この番地にデータを割り当てておけば、現在がどのページであっても、アクセスすることができます。これは嬉しい配慮ですが、やはり、面倒ですね。
さて、ここではバンクという概念を本にたとえて、ページという概念で説明しました。これで十分なのですが、バンクをまた別の概念で理解する方法があります。実はマイコンの動作から見るとこちらの理解のほうが近い感じがします。次回、それを説明します。
| 固定リンク
コメント