【ビット操作命令】
指定レジスタの特定のビットを0や1にする命令で、BCF f,bと、
BSF f,bがこれに属します。
命令構造は、図2(b)のようになっています。
nemonic : 内容 :Flag :Cycle :オペコード
------------------------------------------------------
BCF f,b : 0 -> f<b> : None : 1 : 01 00bb bfff ffff
BSF f,b : 1 -> f<b> : None : 1 : 01 01bb bfff ffff
【ビット操作命令の動作】
実際の命令の実行がどのようになされるかを、図1で説明します。
(1)命令のフェッチ
プログラムカウンタでアドレスされたプログラムメモリ内の命令が、
命令レジスタに呼び出されます。
(2)命令の解読実行
命令レジスタに行くと、命令コードが解読され命令の動作が実行
されます。
(3)レジスタの読み出し。
命令中の f で指定されたレジスタファイルのf番地のレジスタが
データバス経由ALUに行きます。
(4)ビット演算の実行
ALUの中で、命令中のbで指定された bビット目のビットデータが
BCFは0に、BSFは1に変更されて、ALUから出力されます。
そして結果はfレジスタに上書きされます。
STATUSレジスタへの影響は何もありませんので、書きこみ動作は
ありません。
【ビット操作命令の使い方】
良く使う例を下記にあげます。
(1)STATUSのビットの制御
BCF STATUS,C ;Carry Bitのクリア
(2)入出力ピンの制御
BSF PORTA,3 ;PORTAの4ビット目をHにする
【ビットテスト&スキップ命令の種類】
ビット操作の命令ですが、ただ指定されたビットをチェックするだけ
という命令です。
指定レジスタの特定ビットが0か1かをテストする命令で、BTFSC f,b、
BTFSS f,bがこれに相当します。いずれも構造は図2(b)です。
nemonic : 内容 :Flag :Cycle :オペコード
---------------------------------------------------------------
BTFSC f,b : skip if f<d>=0 : None : 1(2) : 01 10bb bfff ffff
BTFSS f,b : skip if f<d>=1 : None : 1(2) : 01 11bb bfff ffff
【ビットテスト&スキップ命令の動作】
動作としては、命令中のfで指定された、f レジスタのbビット目を
チェックします。
そして、BTFSCの時は0だったら、BTFSSの時は1だったら、次ぎの
命令を強制的にNOP命令に置き換えます。
NOP命令ですから、何もせず、プログラムカウンタだけが+1されます。
従って、その時には次ぎの命令が飛ばされて、次ぎの次ぎの命令を
実行することになって、すぐ次ぎの命令はスキップされたことになります。
【ビットテスト&スキップ命令の使い方】
プログラムの中で、流れを制御するために色々な判定と分岐が必要
になります。
ここでPICでIF文やCASE文を作る方法を説明します。
(1)比較結果で分岐(IF文)
DATA_AとDATA_Bを比較し、DATA_Aが大きければAへ
そうでなければBへ分岐
MOVF DATA_B,W ;DATA_Bをロード
SUBWF DATA_A,W ;DATA_A - DATA_B
BTFSC STATUS,C ;? DATA_A < DATA_B
GOTO A
B (Aが小さいときか等しい時)
(2)データの値による分岐(CASE文)
DATAが1ならA、2ならB 3ならCその他ならDへ分岐する
MOVF DATA.W ;DATAをロード
MOVWF TEMP ;一時保存用のレジスタ
DECF TEMP,F ;TEMP-1
BTFSC STATUS,Z ;ゼロかつまり1かテスト
GOTO A ;1ならAへ分岐
DECF TEMP,F ;TEMP-1
BTFSC STATUS,Z ;2かをテスト
GOTO B ;Bへ分岐
DECF TEMP,F ;TEMP-1
BTFSC STATUS,Z ;3かをテスト
GOTO C ;Cへ分岐
GOTO D ;Dへ分岐