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の基幹レジスタです。
操作するには、BCF
やBSF
、CLR
の各命令も使えます。
しかし、このレジスタは非常によく変更されるレジスタです。
そのため、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にする
#共通レジスタはバンクに無関係