PICの全体アーキテクチャ
①命令の取り出し(Fetch)
起動・初期化を終えると、プログラムメモリの命令レジスタから命令のフェッチ(取り出し)がされる。
起動・初期化を終えると、プログラムメモリの命令レジスタから命令のフェッチ(取り出し)がされる。
②命令の解読(Decode)
命令を解読し、演算・制御指示をする。
命令を解読し、演算・制御指示をする。
③演算データの転送と演算実行(Execute)
ALUやMUXで演算処理がなされる。
ALUやMUXで演算処理がなされる。
④結果の転送と格納(Write-Back)
Wレジスタやfレジスタへ結果が転送され、格納される。さらに、その結果の状態(正負、ゼロ)はSTATUSレジスタに記憶される。
Wレジスタやfレジスタへ結果が転送され、格納される。さらに、その結果の状態(正負、ゼロ)はSTATUSレジスタに記憶される。
⑤周辺機器の制御
演算結果の格納先がSFRであった場合、動作制御が行われる場合がある。
演算結果の格納先がSFRであった場合、動作制御が行われる場合がある。
⑥次の命令へ(①へ戻る)
プログラムカウンタが+1されて、次の命令が実行される。
プログラムカウンタが+1されて、次の命令が実行される。
データメモリのアーキテクチャ
一例として、PIC16F88のデータメモリのアーキテクチャを掲載する。これらの内容はPICごとに異なっているので、データシートで確認する必要がある。
SFR(Special Function Register)
SFRとは、PICの入出力や各種モード設定などに使う特別なレジスタのこと。
INDFレジスタ
TMR0レジスタ
STATUSレジスタ
演算結果の各種フラグと、データメモリのBank指定のビットを含んでいる。
レジスタファイルの3番地としてすべてのデバイスで共通であるとともに、すべてのBankのアドレス3番地の位置に用意されている。
レジスタファイルの3番地としてすべてのデバイスで共通であるとともに、すべてのBankのアドレス3番地の位置に用意されている。
IRP | RP1 | RP0 | TO | PD | Z | DC | C |
TOフラグ
電源がONにされた時か、CLRWDT命令もしくはSLEEP命令が実行された時、フラグが立ち、TOフラグビット=1となる。
また、ウォッチドッグタイマがタイムアウトした時、TOフラグビット=0となる。
また、ウォッチドッグタイマがタイムアウトした時、TOフラグビット=0となる。
PDフラグ
電源がONにされた時か、CLRWDT命令が実行された時、フラグが立ち、PDフラグビット=1となる。
また、SLEEP命令が実行された時、PDフラグビット=0となる。
また、SLEEP命令が実行された時、PDフラグビット=0となる。
Zフラグ
演算結果が0の時、フラグが立ち、Zフラグビット=1となる。
DCフラグ
演算結果の下位4ビットからの繰り越しがある時、フラグが立ち、DCフラグビット=1となる。
Cフラグ
演算結果の最上位ビットからの繰り越しがある時、フラグが立ち、Cフラグビット=1となる。
OPTION_REGレジスタ
各種のPIC内部の制御を行うためのレジスタ。すべてのビットを読み書きすることができる。
RBPU | INTEDG | T0CS | T0SE | PSA | PS2 | PS1 | PS0 |
FSRレジスタ
INTCONレジスタ
PIE1レジスタ
PIR1レジスタ
PIE2レジスタ
PIR2レジスタ
PCONレジスタ
PCLレジスタ
PCLATHレジスタ
EEADRレジスタ
EEADRHレジスタ
EECON1レジスタ
EECON2レジスタ
OSCTUNEレジスタ
OSCCONレジスタ
フラグ
特定の結果や条件・状態を保存しておくための、領域やシステムのこと。
フラグは1ビット幅であることが多いため、2通りの情報(真 or 偽)しか保存できない。
例えば、『A'という条件を満たしていればAという処理を、そうでなければ(B'という条件を満たしていれば)Bという処理を行う』場合を考える。Aが実行したい目的であるならば、A'が条件分岐の『フラグ』であり、A'を満たすことを『フラグを立てる、セットする』と言う。逆に、B'を満たすことは『フラグを落とす・倒す』と言う。
フラグは主に条件判定に関わる命令(ビット操作命令・IF文・CASE文)に関係する。
フラグは1ビット幅であることが多いため、2通りの情報(真 or 偽)しか保存できない。
例えば、『A'という条件を満たしていればAという処理を、そうでなければ(B'という条件を満たしていれば)Bという処理を行う』場合を考える。Aが実行したい目的であるならば、A'が条件分岐の『フラグ』であり、A'を満たすことを『フラグを立てる、セットする』と言う。逆に、B'を満たすことは『フラグを落とす・倒す』と言う。
フラグは主に条件判定に関わる命令(ビット操作命令・IF文・CASE文)に関係する。
クロック
クロック信号、クロックパルスとも言う。
複数の回路を動かすために、ペースメーカーとして使われる信号のこと。メトロノームのようなものだと考えれば良い。
周期的に電圧が高い状態と低い状態をとることで一定の周波数を保つ。アナログ回路では正弦波、デジタル回路では矩形波が用いられる場合が多い。
複数の回路を動かすために、ペースメーカーとして使われる信号のこと。メトロノームのようなものだと考えれば良い。
周期的に電圧が高い状態と低い状態をとることで一定の周波数を保つ。アナログ回路では正弦波、デジタル回路では矩形波が用いられる場合が多い。
PICでは、命令の1サイクル(Fetch→Decode→Execute→Write-Back)は4クロックで行われることが多い。
例えば、クロックが1kHz(1秒間に1000回、電圧の昇降が起こる)で、命令の1サイクルが4クロックで行われる場合、1秒間に250個の命令を処理することができる。
つまり、クロックが大きければ大きいほど、命令処理速度は大きくなる。しかし、クロックが大きいということは、1秒間あたりの消費電力が大きいことも同時に意味しており、これは『発熱』という形で回路に悪影響を及ぼす。
つまり、クロックが大きければ大きいほど、命令処理速度は大きくなる。しかし、クロックが大きいということは、1秒間あたりの消費電力が大きいことも同時に意味しており、これは『発熱』という形で回路に悪影響を及ぼす。
クロックは発振器または振動子という装置によって形成される。これらはPICに内蔵されていることもあるが、外部に別の発振器・振動子を取り付けてPICを動作させることも可能である。この状態(発振モード)には6種類ある。
LP | 外部水晶振動子 外部セラミック振動子 |
200kHz以下 | 極低消費電力 |
XT | 外部水晶振動子 外部セラミック振動子 |
200kHz~4MHz | 標準的 |
HS | 外部水晶振動子 外部セラミック振動子 |
4MHz~20MHz | 高速動作 |
EXTRC | 外部RC発振 | 約1MHz以上 | 周波数精度は良くない |
EXTCLK | (高性能)外部発振器 | 20MHz以下 | 高性能なものや、 低周波を使用する場合 |
INTOSC INTRC |
内部発振 | 4MHz or 8MHz | 外付部品が無い |
また、PIC16F88では、3種類のそれぞれ異なるクロックから1つを選ぶことができる。
命令のアーキテクチャ
上位ビットには『命令コード』があり、これによって、すべての命令が区別できるようになっている。
下位ビットには『オペランド』があり、これによって、演算対象や定数などの命令実行内容を指定する。
下位ビットには『オペランド』があり、これによって、演算対象や定数などの命令実行内容を指定する。
バイト処理命令
主に演算が中心となる命令。fの部分で指定されたf番地レジスタファイルが演算の対象となる。
13 8 7 6 0
命令コード d f
f:レジスタファイルのアドレス
d:宛先指定
d=0ならWreg、d=1ならレジスタファイルのf番地
d:宛先指定
d=0ならWreg、d=1ならレジスタファイルのf番地
ビット処理命令
主にビット演算が中心となる命令。f部分で指定された、f番地レジスタファイルにあるデータのbビット目が演算の対象となる。b部分は3ビット幅あることから、1ビット目~8ビット目のうちいずれか一つを選択することができる。
13 10 9 7 6 0
命令コード b f
f:レジスタファイルのアドレス
b:レジスタファイルのビット位置
b:レジスタファイルのビット位置
リテラル処理命令
k部分で指定された定数kが演算の対象となる。k部分は8ビット幅あるので、0~255までの数を扱うことができる。
13 8 7 0
命令コード k
k:定数データ
ジャンプ命令
主にジャンプ命令が中心となる命令。a部分で指定されたアドレスへとジャンプする。aは11ビット幅あるので、直接ジャンプできる範囲は0~2047番地までに限られる。
13 11 10 0
命令コード a
a:ジャンプ先のアドレス
演算方法
ここでは2進数、10進数、16進数の扱いについて紹介する。
これらの演算処理は、PICのアセンブラ命令に関与する部分でもある。
なお、パソコンの電卓(プログラマモード)を使えばすぐに演算・変換ができる。
これらの演算処理は、PICのアセンブラ命令に関与する部分でもある。
なお、パソコンの電卓(プログラマモード)を使えばすぐに演算・変換ができる。
2進数加算
基本的な計算は以下のようになる。
0+0=0
0+1=1
1+0=1
1+1=10(桁上がり)
0+1=1
1+0=1
1+1=10(桁上がり)
これを使えば、あとは筆算で考えれば良い。
111000
+ 101010
────────
1100010
+ 101010
────────
1100010
2進数減算・符号付2進数
基本的な計算は以下のようになる。
0-0=0
1-0=1
1-1=0
10-1=1
100-1=11
1000-1=111
1-0=1
1-1=0
10-1=1
100-1=11
1000-1=111
引き算の場合は、桁借りに注意しなければならない。原理は10進数の引き算と同じだが、初めのうちは理解しにくいかもしれない。
111000
- 101010
────────
1110
- 101010
────────
1110
また、情報処理において、最上位ビットが符号を意味する(0が+、1が-)ことがある。ここから、最上位ビットを符号ビットと呼ぶこともある。つまり、8ビット幅の場合、符号無しだと0(00000000)~255(11111111)を指定することができるが、符号付だと-128(10000000)~127(01111111)を指定する。
なお、この時、値は以下のように変化するので注意が必要である。
なお、この時、値は以下のように変化するので注意が必要である。
00000000(10進数における0)
↓↑
00001111(10進数における15)
↓↑
01111111(10進数における127)
10000000(10進数における-128)
10000001(10進数における-127)
↓↑
10001111(10進数における-113)
↓↑
11111111(10進数における-1)
↓↑
00001111(10進数における15)
↓↑
01111111(10進数における127)
10000000(10進数における-128)
10000001(10進数における-127)
↓↑
10001111(10進数における-113)
↓↑
11111111(10進数における-1)
これらの符号の有無は、演算処理時に設定することができる。
補数
b進法において、自然数aを表現するのに必要な最小の桁数をnとしたとき、
bn - a を「b進法におけるaに対する『bの補数』」
bn - a - 1 を「b進法におけるaに対する『b-1の補数』」
bn - a - 1 を「b進法におけるaに対する『b-1の補数』」
と言う。例えば、10進数では、自然数32の10の補数は64である(32+64=100)。2進数では、10010に対する2の補数は1110である(10010+1110=100000)。
2進数における1の補数は、各桁の0と1とを逆転することで簡単に求められる(NOT演算)。これを利用して、簡単に負の数を表現することが可能になり、また、減算も容易になる。
00111000(10進数における56) →(1の補数へ変換;0と1とを逆転)→ 11000111
→(2の補数へ変換;1の補数に+1する)→ 11001000(10進数における-56)
→ 1000(または、10進数における8)
→(2の補数へ変換;1の補数に+1する)→ 11001000(10進数における-56)
→ 1000(または、10進数における8)
00101010(10進数における42) →(1の補数へ変換;0と1とを逆転)→ 11010101
→(2の補数へ変換;1の補数に+1する)→ 11010110(10進数における-42)
→ 10110(または、10進数における22)
→(2の補数へ変換;1の補数に+1する)→ 11010110(10進数における-42)
→ 10110(または、10進数における22)
00111000(5610)- 00101010(4210)= 00111000(5610)+ 11010110(-4210)
または、
111000(5610)- 101010(4210)=111000(5610)-[1000000(6410)- 10110(2210)]
または、
111000(5610)- 101010(4210)=111000(5610)-[1000000(6410)- 10110(2210)]
2進数乗算
基本的な計算は以下のようになる。
0×0=0
0×1=0
1×0=0
1×1=1
0×1=0
1×0=0
1×1=1
1100
× 1111
───────
1100
1100
1100
1100
───────
10110100
× 1111
───────
1100
1100
1100
1100
───────
10110100
2進数余算
乗算と減算との組み合わせであり、10進数における余算とほぼ同じである。
111
101 )100011
101
───────
111
101
───────
101
101
───────
0
101 )100011
101
───────
111
101
───────
101
101
───────
0
101
101 )11010
101
───────
11
0
───────
110
101
───────
1 ←あまり
101 )11010
101
───────
11
0
───────
110
101
───────
1 ←あまり
2進数・10進数変換
10進数は10nの数の集まりと考えられる。
123 = 2×102 + 2×101 + 6×100
同様にして考えると、2進数も2nの数の集まりと考えられる。この考え方と加算の考え方とを組み合わせることで、2進数と10進数とを相互に変換することができる。
123 = 0×27 + 1×26 + 1×25 + 1×24 + 1×23 + 0×22 + 1×21 + 1×20
∴ 01111011
∴ 01111011
1111011= 1×26 + 1×25 + 1×24 + 1×23 + 0×22 + 1×21 + 1×20
=64+32+16+8+0+2+1
=123
=64+32+16+8+0+2+1
=123
10進数・16進数変換
考え方は、2進数←→10進数の変換と同じである。
123 = 0×162+ 7×161 + B×160
∴ 7B
∴ 7B
7B = 7×161 + B(12)×160
= 123
= 123
論理演算
ここではPICのアセンブラ命令における論理演算を紹介する。
論理積演算(AND)
両方とも1ならば、結果は1。それ以外なら0。
(例)
Wreg
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
freg
1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
結果
1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
(使用例)
▼0でのマスク
▼0か否かの確認
▼正か負かの確認
▼0でのマスク
▼0か否かの確認
▼正か負かの確認
論理和演算(OR)
どちらか片方が1ならば、結果は1。それ以外は0。
(例)
Wreg
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
freg
1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
結果
1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
(使用例)
▼1でのマスク
▼0か否かの確認
▼正か負かの確認
▼1でのマスク
▼0か否かの確認
▼正か負かの確認
排他的論理和演算(XOR)
両方とも同じ数字ならば、結果は0。異なるのならば1。
(例)
Wreg
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
freg
1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
結果
0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
(使用例)
▼任意ビットの反転
▼0の代入
▼データの暗号化
▼任意ビットの反転
▼0の代入
▼データの暗号化
否定演算(NOT)
1の補数へと変換する。2進数の場合、0と1とを逆転することにより、1の補数を求めることができる。
PICのアセンブラでは、COM命令に相当する。
PICのアセンブラでは、COM命令に相当する。
(例)
freg
1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
結果
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
記号説明
f、freg | レジスタファイルのアドレス |
W、Wreg | ワーキングレジスタ(アキュムレータ) |
b | レジスタ中のビットアドレス |
a k | リテラルデータ、定数データ |
x | 無効、何でも良い |
d | 格納宛先指定 d=0ならWへ d=1ならレジスタへ |
label | ラベル |
TOS | スタックメモリの最上位の内容 |
PC | プログラムカウンタ(13ビット長) |
PCLATH | プログラムカウンタの上位5ビット |
GIE | グローバル割込許可ビット |
WDT | ウォッチドッグタイマ |
TO | タイムアウトステータスビット |
PD | パワーダウンステータスビット |
dest | 宛先 |
[ ] | オプションで省略化 |
( ) | 内容 |
→ | 割当先 |
<b> | レジスタの第bビット |
Z | ゼロステータス |
C | キャリーステータス |
DC | 下位4ビットのキャリーステータス |
命令一覧
加減算命令
加減算の命令。
演算結果によって、STATUSレジスタのC、DC、Zフラグが変化する。
演算結果によって、STATUSレジスタのC、DC、Zフラグが変化する。
ADDWF
意味 | Add W and f |
書式 | [label] ADDWF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | (Wreg) + (freg) → (dest) |
影響フラグ | C、DC、Z |
サイクル | 1 |
機械語 | 00 0111 dfff ffff |
実行内容 | Wregの内容にfレジスタの内容を加算し、その結果を、d=0ならWregに、d=1ならfregに上書きする。 |
SUBWF
意味 | Subtract W from f |
書式 | [label] SUBWF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | (freg) - (Wreg) → (dest) |
影響フラグ | C、DC、Z |
サイクル | 1 |
機械語 | 00 0010 dfff ffff |
実行内容 | fregの内容からWregの内容を減算し、その結果を、d=0ならWregに、d=1ならfregに上書きする。 結果が0または正の時、Cフラグが1となる。 |
ADDLW
意味 | Add literal and W |
書式 | [label] ADDLW k |
オペランド | k:リテラルデータ(0~255) |
実行内容 | (Wreg) + (k) → (Wreg) |
影響フラグ | C、DC、Z |
サイクル | 1 |
機械語 | 11 111x kkkk kkkk |
実行内容 | Wregの内容に8ビットのリテラルデータを加算し、その結果をWregに上書きする。 |
SUBLW
意味 | Substract W from literal |
書式 | [label] SUBLW k |
オペランド | k:リテラルデータ(0~255) |
実行内容 | (k) - (Wreg) → (Wreg) |
影響フラグ | C、DC、Z |
サイクル | 1 |
機械語 | 11 110x kkkk kkkk |
実行内容 | 8ビットのリテラルデータからWregの内容を減算し、その結果をWregに上書きする。 結果が0または正の時、Cフラグが1となる。 |
論理演算命令
論理演算をする命令。
演算結果によって、STATUSレジスタのZフラグが変化する。
演算結果によって、STATUSレジスタのZフラグが変化する。
ANDWF
意味 | AND W with f |
書式 | [label] ANDWF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | (Wreg).AND.(f) → (dest) |
影響フラグ | Z |
サイクル | 1 |
機械語 | 00 0101 dfff ffff |
実行内容 | Wregの内容とfregの内容との論理積演算をし、その結果を、d=0ならWregに、d=1ならfregに上書きする。 |
IORWF
意味 | IORWF Inclusive OR With f |
書式 | [label] IORWF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | (Wreg).OR.(f) → (dest) |
影響フラグ | Z |
サイクル | 1 |
機械語 | 00 0100 dfff ffff |
実行内容 | Wregの内容とfregの内容との論理和演算をし、その結果を、d=1ならWregに、d=1ならfregに上書きする。 |
XORWF
意味 | Exclusive OR W with f |
書式 | [label] XORWF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | (Wreg).XOR.(f) → (dest) |
影響フラグ | Z |
サイクル | 1 |
機械語 | 00 0110 dfff ffff |
実行内容 | Wregの内容とfregの内容の排他論理和演算をし、その結果を、d=0ならWregに、d=1ならfregに上書きする。 |
COMF
意味 | Complement f |
書式 | [label] COMW f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | complement(f) → (dest) |
影響フラグ | Z |
サイクル | 1 |
機械語 | 00 1001 dfff ffff |
実行内容 | fregの内容の補数を演算し、その結果を、d=0ならWregに、d=1ならfregに上書きする。 |
ANDLW
意味 | AND literal with W |
書式 | [label] ANDLW k |
オペランド | k:リテラルデータ(0~255) |
実行内容 | (Wreg).AND.(k) → (Wreg) |
影響フラグ | Z |
サイクル | 1 |
機械語 | 11 1001 kkkk kkkk |
実行内容 | Wregの内容と8ビットのリテラルデータのANDを取り、結果をWregに上書きする。 |
IORLW
意味 | Inclusive OR literal with W |
書式 | [label] IORLW k |
オペランド | k:リテラルデータ(0~255) |
実行内容 | (Wreg).OR.(k) → (Wreg) |
影響フラグ | Z |
サイクル | 1 |
機械語 | 11 1000 kkkk kkkk |
実行内容 | Wregの内容と8ビットのリテラルデータのORを取り、結果をWregに上書きする。 |
XORLW
意味 | Exclusive OR literal with W |
書式 | [label] XORLW k |
オペランド | k:リテラルデータ(0~255) |
実行内容 | (Wreg).XOR.(k) → (Wreg) |
影響フラグ | Z |
サイクル | 1 |
機械語 | 11 1010 kkkk kkkk |
実行内容 | Wregの内容と8ビットのリテラルデータのXORを取り、結果をWregに上書きする。 |
移動・転送命令
指定したレジスタへデータをコピーする命令。
演算結果によって、STATUSレジスタのZフラグが変化する。
演算結果によって、STATUSレジスタのZフラグが変化する。
MOVF
意味 | Move f |
書式 | [label] MOVF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | (f) → (dest) |
影響フラグ | Z |
サイクル | 1 |
機械語 | 00 1000 dfff ffff |
実行内容 | fregの内容をdestにコピーする。 すなわち、d=0ならWregに、d=1ならfregに上書きする。 |
MOVWF
意味 | Move W to f |
書式 | [label] MOVWF f |
オペランド | f:レジスタアドレス(0~127) |
実行内容 | (Wreg) → (dest) |
影響フラグ | なし |
サイクル | 1 |
機械語 | 00 0000 1fff ffff |
実行内容 | Wregの内容をfregに上書きする。 Wregの内容はそのまま。 |
MOVLW
意味 | Move literal to W |
書式 | [label] MOVLW k |
オペランド | k:リテラルデータ(0~255) |
実行内容 | (k) → (dest) |
影響フラグ | なし |
サイクル | 1 |
機械語 | 11 00xx kkkk kkkk |
実行内容 | 8ビットのリテラルデータをWregに上書きする。 |
CLRF
意味 | Clear f |
書式 | [label] CLRF f |
オペランド | f:レジスタアドレス(0~255) |
実行内容 | 0 → (f) |
影響フラグ | 1 → Z |
サイクル | 1 |
機械語 | 00 0001 1fff ffff |
実行内容 | fregに0を上書きし、Zフラグをセットする。 |
CLRW
意味 | Clear W |
書式 | [label] CLRW |
オペランド | なし |
実行内容 | 0 → (Wreg) |
影響フラグ | 1 → Z |
サイクル | 1 |
機械語 | 00 0001 0xxx xxxx |
実行内容 | Wregに0を上書きし、Zフラグをセットする。 |
カウントアップダウン命令・FOR文
指定したレジスタの値を+1、-1する命令。
DECF
意味 | Decrement f |
書式 | [label] DECF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | (f) - 1 → (dest) |
影響フラグ | Z |
サイクル | 1 |
機械語 | 00 0011 dfff ffff |
実行内容 | fregの内容に1を減算し、その結果を、d=0ならWregに、d=1ならfregに上書きする。 |
INCF
意味 | Increment f |
書式 | [label] INCF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | (f) + 1 → (dest) |
影響フラグ | Z |
サイクル | 1 |
機械語 | 00 1010 dfff ffff |
実行内容 | fregの内容に1を加算し、その結果を、d=0ならWregに、d=1ならfregに上書きする。 |
DECFSZ
意味 | Decrement f, skip if 0 |
書式 | [label] DECFSZ f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | (f) - 1 → (dest):skip if result=0 |
影響フラグ | なし |
サイクル | 1 2(スキップ時) |
機械語 | 00 1011 dfff ffff |
実行内容 | fregの内容に1を減算し、その結果を、d=0ならWregに、d=1ならfregに上書きする。 また、もし結果がd=0であるなら、次の命令をNOPに変えて実行する。 したがってスキップ時は2サイクル命令になる。 |
INCFSZ
意味 | Increment f, skip if 0 |
書式 | INCFSZ |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | (f) + 1 → (dest):skip if result=0 |
影響フラグ | なし |
サイクル | 1 2(スキップ時) |
機械語 | 00 1111 dfff ffff |
実行内容 | fregの内容に1を加算し、その結果を、d=0ならWregに、d=1ならfregに上書きする。 また、もし結果がd=0であるなら、次の命令をNOPに変えて実行する。 したがってスキップ時は2サイクル命令になる。 |
ビット操作命令・IF文・CASE文
指定レジスタの特定のビットを0や1にする命令。
BCF
意味 | Bit Clear f |
書式 | [label] BCF f,b |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | 0 → f<b> |
影響フラグ | なし |
サイクル | 1 |
機械語 | 01 00bb bfff ffff |
実行内容 | fレジスタの第bビット目を0にする。 フラグの変化は無い。 |
BSF
意味 | Bit Set f |
書式 | [label] BSF f,b |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | 1 → f<b> |
影響フラグ | なし |
サイクル | 1 |
機械語 | 01 01bb bfff ffff |
実行内容 | fレジスタの第bビット目を1にする。 フラグの変化は無い。 |
BTFSC
意味 | Bit Test f, Skip if Clear |
書式 | [label] BTFSC f,b |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | skip if (f<b>)=0 |
影響フラグ | なし |
サイクル | 1 2(スキップ時) |
機械語 | 01 10bb bfff ffff |
実行内容 | fregの第bビット目が0だったら、次の命令をNOPに変えて実行する。 したがって、スキップ時は2サイクル命令になる。 |
BTFSS
意味 | Bit Test f, Skip if Set |
書式 | [label] BTFSS f,b |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | skip if (f<b>)=1 |
影響フラグ | なし |
サイクル | 1 2(スキップ時) |
機械語 | 01 11bb bfff ffff |
実行内容 | fregの第bビット目が1だったら、次の命令をNOPに変えて実行する。 したがって、スキップ時は2サイクル命令になる。 |
巡回シフト命令
8ビットのデータをビット単位でシフトする命令。キャリービットも含めてシフトする。
演算結果によって、STATUSレジスタのCフラグが変化する。
演算結果によって、STATUSレジスタのCフラグが変化する。
RLF
意味 | Rotate Left f through Carry |
書式 | [label] RLF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | 0≦n≦6の時 f<n> → d<n+1> n=7の時 f<7> → C C → d<0> |
影響フラグ | C |
サイクル | 1 |
機械語 | 00 1101 dfff ffff |
実行内容 | fregの内容を1ビット、キャリも含めて左に移動する。 その結果を、d=0ならWregに、d=1ならfregに上書きする。 |
RRF
意味 | Rotate Right f through Carry |
書式 | [label] RRF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | 0≦n≦6の時 f<n> → d<n-1> n=7の時 f<0> → C C → d<7> |
影響フラグ | C |
サイクル | 1 |
機械語 | 00 1100 dfff ffff |
実行内容 | fregの内容を1ビット、キャリも含めて右に移動する。 その結果を、d=0ならWregに、d=1ならfregに上書きする。 |
SWAPF
意味 | Swap nibbles in f |
書式 | [label] SWAPF f,d |
オペランド | f:レジスタアドレス(0~127) d:格納先(0または1) |
実行内容 | f<3:0> → f<7:4> f<7:4> → f<3:0> |
影響フラグ | なし |
サイクル | 1 |
機械語 | 00 1110 dfff ffff |
実行内容 | fregの内容の上位と下位4ビットの入替を行い、その結果を、d=0ならWregに、d=1ならfregに上書きする。 |
ジャンプ命令・サブルーチン
プログラムの流れを強制的に変更する命令。
GOTO
意味 | Go to address |
書式 | [label] GOTO a |
オペランド | a:リテラルデータ(0~2047) |
実行内容 | a → PC<10:0> (PCLATH<4:3>) → PC<12:11> |
影響フラグ | なし |
サイクル | 2 |
機械語 | 10 1aaa aaaa aaaa |
実行内容 | 無条件で指定番地へジャンプする。 11ビットのリテラルアドレスをPCレジスタに上書きし、さらにPCの上位にPCLATHの内容を上書きすることでジャンプする。 PCLATHにPageを指定しておくことで、全Page範囲にジャンプできる。 |
CALL
意味 | Call subroutine |
書式 | [label] CALL a |
オペランド | a:リテラルデータ(0~2047) |
実行内容 | (PC) + 1 → スタック a → PC<10:0> (PCLATH<4:3>) → PC<12:11> |
影響フラグ | なし |
サイクル | 2 |
機械語 | 10 0aaa aaaa aaaa |
実行内容 | サブルーチンをコールする。 まず戻り番地(PC+1)をスタックに格納し、11ビットのリテラルアドレスをPCレジスタに上書きし、さらにPCの上位にPCLATHの内容を上書きすることでジャンプする。 PCLATHにPageを指定しておくことで、全Page範囲にジャンプできる。 |
RETURN
意味 | Return from subroutine |
書式 | [label] RETURN |
オペランド | なし |
実行内容 | スタック → PC |
影響フラグ | なし |
サイクル | 2 |
機械語 | 00 0000 0000 1000 |
実行内容 | サブルーチンから無条件復帰する。 スタックに格納されていた最新の戻り番地をPCレジスタに上書きすることでジャンプする。 |
RETFIE
意味 | Return from interrupt |
書式 | [label] RETFIE |
オペランド | なし |
実行内容 | スタック → PC 1 → GE |
影響フラグ | なし |
サイクル | 2 |
機械語 | 00 0000 0000 1001 |
実行内容 | 割込処理から復帰する。 スタックに格納されていた最新の戻り番地をPCレジスタに上書きすることでジャンプし、同時に、グローバル割込ビット(GIE)に1をセットして割込を許可する。 |
RETLW
意味 | Return with literal in W |
書式 | [label] RETLW k |
オペランド | k:リテラルデータ(0~255) |
実行内容 | k → Wreg スタック → PC |
影響フラグ | なし |
サイクル | 2 |
機械語 | 11 01xx kkkk kkkk |
実行内容 | サブルーチンから復帰する。 その時、Wregにリテラルデータを持って戻る。 まず8ビットのリテラルデータをWregにロードし、次にスタックに格納されていた最新の戻り番地をPCレジスタに上書きすることでジャンプする。 |
その他
特殊な動作命令。主に周辺への制御を行う。
CLRWDT
意味 | Clear Watchdog Timer |
書式 | [label] CLRWDT |
オペランド | なし |
実行内容 | 0 → (WDT prescaler) 1 → TO 1 → PD |
影響フラグ | TO、PD |
サイクル | 1 |
機械語 | 00 0000 0110 0100 |
実行内容 | ウォッチドッグタイマをリセットし、さらに連動するプリスケーラもゼロクリアする。 ステータスビットのTOとPDを1にセットする。 |
NOP
意味 | No Opreration |
書式 | [label] NOP |
オペランド | なし |
実行内容 | なし |
影響フラグ | なし |
サイクル | 1 |
機械語 | 00 0000 0xx0 0000 |
実行内容 | 何もせず次へ進む。 |
SLEEP
意味 | Go into standby mode |
書式 | [label] SLEEP |
オペランド | なし |
実行内容 | 0 → WDT 0 → WDT prescaler 1 → TO 1 → PD |
影響フラグ | TO、PO |
サイクル | 1 |
機械語 | 00 0000 0110 0011 |
実行内容 | パワーダウンステータスビット(PD)をリセットし、タイムアウトステータスビット(TO)をセットする。 さらにウォッチドッグタイマをリセットする。 その後、オシレータを停止させてプロセッサをスリープモードにする。これでリセット後の処理と区別することができる。 |
このページに関するコメント, 意見は以下にどうぞ.