PIC講習/ビットとレジスタ

概要

本章では、まずレジスタの各ビットを操作する命令を解説します。
そして、レジスタを指定するのに必要な、バンクという概念についても解説します。

重要語

ビット番号

最下位ビットを0とする桁番号

クリア

レジスタの値を0にすること

バンク

128個分のレジスタ領域のまとまり

必要語

レジスタ

数値を一時記憶する回路

ビット操作

PICマイコンのレジスタ1つは、8ビットからなります。
1ビットずつ制御することも、8ビットまとめて制御することもできます。

ビット番号

ビット番号とは、最下位のビットを0とした、桁の番号です。
レジスタの大きさは8ビットなので、最上位は7になります。
今後、ビット番号がNのビットを、ビットNと呼びます。
例えば、2の位に当たるビットはビット1です。
0から数え始めることに注意してください。

ビット操作

1ビットは2進数の1桁ですから、0もしくは1の値をとります。
PICにも、指定したビットを0や1に設定する命令があります。
0がBCF命令、1がBSF命令です。
引数は両命令とも同じで、1つめがレジスタのアドレス、2つめがビット番号です。
なお、ある特殊な場合を除き、指定したビット以外は変化しません。
以下はこれらの命令の例文です。
BCF/BSFの例
COL.R.$43 #使う定数は先に定義
COL.B.5

BCF.R.B   #レジスタRのビットBを0にする
BCF.$43.5 #こう書いても同じ意味

BSF.R.B   #BSFは1にする命令

クリアとセット

クリアClearとは、値を0にすることです。
前項のBCF命令の名前のCもこれに由来します。
ちなみに、BSFのSはSetに由来します。
さて、この項では、レジスタの8ビット全体をクリアする命令について説明します。

クリア

8ビットをまとめてクリアするには、CLR命令を使います。
引数は1つで、レジスタのアドレスを指定します。
CLR命令
COL.R.$5A #使う定数は先に定義

CLR.R     #$5Aのレジスタの値は0になる

セット

レジスタの8ビットをまとめて設定する方法は、代入の章を読んでください。
また、ビット演算の章では、各ビットを反転する命令を解説しています。

バンク

ここからは、レジスタを指定するのに必要な、バンクという概念について解説します。

アドレスのビット数

16F1827のレジスタは、12ビットのアドレスで指定することができます。
しかし、オペコード1つに含められるレジスタのアドレスは7ビットまでです。
残りの5ビット分は、別の手段で指定しなければなりません。

バンク

PICで取られた解決策では、まず7ビットで指定できる範囲のレジスタをまとめました。
このまとまりが、バンクBankです。
そして、選択中のバンクの番号を保存するレジスタを設けました。
このレジスタを、BSRレジスタといいます。
BSRレジスタの5ビットを上位、オペコードの7ビットを下位に置き、12ビットのアドレスとします。
これで、全てのレジスタが指定できるようになりました。

共通レジスタ

ところで、BSRレジスタが特定のバンクのみにあると、大変なことになってしまいます。
そこで、選択中のバンクに影響されず、同じレジスタを使うアドレスが決められています。
下位7ビットが0から$0Bの基幹レジスタCore Registerと、$70から$7Fの共通レジスタCommon RAMです。
前者は特殊レジスタで、プログラムカウンタなども含まれます。
後者は汎用レジスタですが、バンク共通であることを忘れるとバグの原因になります。

BSRレジスタの操作

BSRレジスタは、アドレス8の基幹レジスタです。
操作するには、BCFBSFCLRの各命令も使えます。
しかし、このレジスタは非常によく変更されるレジスタです。
そのため、5ビットの値を直接書き込むMBS命令があります。
引数は1つで、BSRレジスタに書き込む値を指定します。
MSB命令の例
COL.R.$2C #使う定数は先に定義
COL.C.$77 #共通レジスタ

CLR.R     #バンク0の$2Cにあるレジスタを0に設定
MBS.1     #バンク1を選択
CLR.R     #先ほど0にしたのとは別のレジスタ

BSF.C.0   #ビット0を1にする
MBS.0     #バンク0に戻す

BCF.C.0   #1にしたビットを0にする
          #共通レジスタはバンクに無関係