PIC18系の概要

8ビットのCPUにタイマー・ADコンバータ・IOポート等のIOを内蔵しています。DIPパッケージがあるので自作向けです。またアドレスバス及びデータバスは外部に出すことはできません。
ハーバードアーキティクチャを採用しておりプログラム用とデーター用のメモリは別空間となっており同時アクセスが可能です。また直接プログラム用メモリを読み出す命令はありません。(テーブル命令は除く)
アキュムレータ(ワーキングレジスタと命名されている)は1個でレジスタにあたるものはありません。代わりにメモリ空間を256バイト単位で切り替えて使用します。(レジスタファイルと命名されている。FSR0,FSR1,FSR2を使用すると12bit空間を間接アドレッシングできる。一部の命令は直接12bitアドレスの指定が可能)
命令はパイプライン処理で実効され基本的に1サイクル(4クロック)で1命令を実行できます。
スタックはメモリ空間に設けられず専用のスタックエリアに設けられます。(31個)
8bitデータのみが扱え、16bit、32bitデータを使用する場合は、8bitの命令を組み合わせて処理します。
外部クロックは最大48MHz(又は64MHz)で内部動作は4分の1である12MHz(又は16MHz)単位(1サイクル)で命令が実行できます。命令のバンド幅 12M(又は16M)ワード/s
命令長は1ワード(ビット長は PICのシリーズにより異なる)が基本ですが分岐命令・拡張命令では2ワードもあります。
アーキティクチャはRISCであり、移動・演算はワーキングレジスタを経由しないと実行できません。
例えばレジスタファイル内でデータを移動する場合も一度ワーキングレジスタを経由しなければなりません。したがって1つの命令が高速でも前後に移動命令が必要となります。ただしリードモディファイ動作でも1サイクルで動作可能です。movff命令はソースとディスティネーションそれぞれに12bitアドレスを直接指定できます。(一部動作に制限があります。)
PIC18F/LF1XK50 日本語データーシート
8ビット以上のデータを扱う命令はないが、レジスタの配置をみるとリトルエンディアンである。

PIC18 XC8 C言語のDelay値の計算 2014/02/17

周辺モジュールの設定例(設定値の計算)

Javascriptを用い必要な設定値を計算できます。
Timer0の設定例 2014/02/17
Timer1/3/5の設定例 2014/02/17
Timer2/4/6の設定例 2014/02/17
EUSARTボーレートの設定例 2014/02/17
PWM設定例 2014/02/17

番外編 H8/3048

16bit CPUですが、レジスタは32bit 8本です。32bitレジスタは分割して最大16bit*16本、最大8bit*16本と86系のような使い方ができます。
バイトは配置及びアドレッシングモードなどは68系に近いと思います。アキュムレータとレジスタに区別はありません。
最大クロック16MHzで基本的に2クロックで2バイトをアクセスできます。バンド幅 16MB/s
データの配置はビッグエンディアンであり、やはり68系に似通っている(Z80や86系ではリトルエンディアン)
アセンブラではソースを先にデスティネーションを後に書く。(Z80や86系では逆)
データバースは16bitとなっています。命令は、掛け算・割り算・ビット操作を行う命令も持っています。アドレス空間は24bit持っており、リニアにアクセスできます。内臓ROM128k、内臓RAM 4k、周辺IOは,パラレルポート、シリアルポート2本、タイマー5本、プログラムタイミングコントローラ出力16本、10ビットのADコンバーター入力8本、8ビットDA出力2本、DRAMリフレッシュ機能、DMA、ウォッチドッグタイマー等をもっています。詳しくはHITACHのホームページを見てください
いろいろ便利なワンチップマイコンですが、フラッシュメモリの書き込み回数が100回程度と少ないのがネックです。
ただし、小さいプログラムならRAM上で実行できるので考え方しだいである。

ピン配置の例

ROM

PIC18F14K50 PIC18F46K22
RROM(byte) 8192 65536

RAM(PIC18F14K50)

RAM容量

PIC18F14K50 PIC18F46K22
RAM(byte) 768(256*3バンク) 3896(256*15バンク+56(038h))

メモリマップ

バンク ファイル PIC18F14K50 PIC18F46K22
0 00 GPR 00~5Fはアクセスバンクで指定可能 GPR 00~5Fはアクセスバンクで指定可能
FF
1 00 GPR GPR
FF
2 00 DPRAM
(USB)
GPR
FF
3~E 00 GPR
FF
F 00 GPR
37
38 SFR 60~FFはアクセスバンクで指定可能
52
53 SFR 60~FFはアクセスバンクで指定可能
FF

アドレッシングモード

リテラル,即値 オペランドの値そのものを使用
直接 オペランドの値で示されるアドレスのメモリの内容やレジスタの内容が対象
間接 ファイルセレクトアドレスで示されるアドレスのメモリ内容が対象

アクセスバンクはbank0の00h~5fhとbank15の60h~ffhアドレスをアクセスバンクを指定することによりバンク切り替えなしにアクセスすることができます。

INDFn FSRn
POSTDECn [FSRn--]
POSTINCn [FSRn++]
PREINCn [++FSRn]
PLUSWn  [FSRn+WREG]
拡張命令

ADDFSR f,k   FSRf+=k
SUBFSR f,k   FSRf-=k

STATUS
C キャリーフラグ 1:オーバーフロー
DC オーバーフローフラグ 演算結果の下位4bitからのオーバーフロー 1:オーバーフロー
Z ゼロフラグ 1:ゼロ
OV 符号付き演算のオーバーフローフラグ 1:7bitを超えた
N 演算結果の負のフラグ 1:負 0:正

標準命令セット

Z80 vs PIC18 vs H8/3048との基本的な命令の速度比較 2016/12/04

命令 概要 Z80 10MHz PIC18 48MHz H8/3048 16MHz 8086 10MHz 68000 16MHz
発表 1976年 Z80A(2.5MHz) 1994年 1978年 8086(5MHz) 1980年 68000(4MHz)
1バイト移動 アキュムレータ→レジスタ LD A,B
4クロック 400ns
MOVWF レジスタファイル,W
4クロック 83ns
MOV R0L,R1L
2クロック 125ns
MOV BL,AL
2クロック 200ns
MOVE.B D1,D0
4クロック 250ns
1バイト移動 レジスタ1→レジスタ2 LD C,B
4クロック 400ns
MOVF レジスタファイル1,W
MOVWF レジスタファイル2,W

8クロック 167ns
MOV R0L,R1L
2クロック 125ns
MOV BL,AL
2クロック 200ns
MOVE.B D1,D0
4クロック 250ns
1バイト移動 アキュムレータ→メモリ
アドレスが8bitで収まる範囲
LD (nn),A
13クロック 1300ns
MOVWF レジスタファイル,W
4クロック 83ns
MOV R0L,@8ビットアドレス:8
4クロック 250ns
1バイト移動 アキュムレータ→メモリ
全アドレス
LD (HL),A
7クロック 700ns
MOVWF INDF1
4クロック 83ns
MOV.B @ER1,R0L
4クロック 250ns
MOV [BX],AL
9クロック 900ns
MOVE.B (A0),D0
8クロック 500ns
1バイト定数設定 定数→アキュムレータ LD A,n
7クロック 700ns
MOVLW 定数
4クロック 83ns
MOV 定数,R0L
2クロック 125ns
MOV AL,012h
4クロック 400ns
MOVE.B #10,D0
8クロック 500ns
1バイト定数設定 定数→レジスタ LD B,n
7クロック 700ns
MOVLW 定数
MOVWF レジスタファイル
8クロック 167ns
MOV 定数,R0L
2クロック 125ns
MOV BL,012h
4クロック 400ns
MOVE.B #10,D0
8クロック 500ns
2バイト移動 レジスタ1,2→レジスタ3,4 LD SP,HL
6クロック 600ns
MOVF レジスタファイル1,W
MOVWF レジスタファイル3,W

MOVF レジスタファイル2,W
MOVWF レジスタファイル4,W

16クロック 333.3ns
MOV R0,R1
2クロック 125ns
MOV AX,BX
2クロック 200ns
MOVE.W D1,D0
4クロック 250ns
1バイト演算 演算→アキュムレータ ADD A,B
4クロック 400ns
ADDWF レジスタファイル
4クロック 83ns
ADD.B R0L,R1L
2クロック 125ns
ADD AL,BL
3クロック 200ns
ADD.B D0,D1
4クロック 250ns
2バイト演算 演算→アキュムレータ ADD HL,BC
11クロック 1100ns
MOVF f1,W
ADDWF f2
MOVF f1+1,WREG
ADDWFC f2+1
16クロック 333.3ns
ADD.W R0,R1
2クロック 125ns
ADD AX,BX
3クロック 200ns
ADD.W D0,D1
4クロック 250ns
1バイト演算 乗算→アキュムレータ MULWF レジスタファイル
4クロック 83ns
MULXU.B R0L,R1
14クロック 875ns
MUL CL
70~77クロック 7~7.7μs
MULU.W D0,D1
最大70クロック 最大4.375μs
2バイト演算 乗算→PROD マニュアルより
28クロック 583ns
MULXU.W R0,ER1
22クロック 1375ns
MUL CX
118~133クロック 7~13.3μs
MULU.W D0,D1
最大70クロック 最大4.375μs
無条件分岐 JP nn
10クロック 1000ns
GOTO アドレス
8クロック 167ns
JMP @24bitアドレス
6クロック 375ns
JMP 8bit
15クロック 1.5μs
JMP 16bit
10クロック 625ns
サブルーチンコール CALL nn
17クロック 1700ns
CALL アドレス
8クロック 167ns
JSR @24bitアドレス
5クロック 312.5ns
CALL 16bit
19クロック 1.9μs
JSR 32bit
20クロック 1.25μs
ビットセット アキュムレータ SET A,5
8クロック 800ns
BSF WREG,5
4クロック 83ns
BSET R0L,5
2クロック 125ns
BSET #1,D0
最大12クロック 750ns
スタックへプッシュ 16bit PUSH HL
10クロック 1000ns
FSR2をスタックとして使用
movf f1,W
movwf POSTDEC2
movf f2,W
movwf POSTDEC2
16クロック 333.3ns
MOV.W R0,@-ER7
6クロック 375ns
PUSH AX
10クロック 1μs
MOVE.W D0,-(A7)
8クロック 500ns
メモリインクリメント メモリ INC (HL)
11クロック 1100ns
INCF レジスタファイル
4クロック 83ns
MOV.B @ER1,R0L
INC.B #1,R0L
MOV.B R0L,@ER1
10クロック 625ns
INC [BX]
20クロック 2μs
ADDQ.B #1,(A0)
12クロック 750ns
間接アドレッシングモード (HL),(BC),(DE),(IX+d8),(IY+d8) INDFn,POSTDECn,POSTINCn,PREINCn,PLUSWn @ERn
@-ERn,@ERn+
@(d16,Ern)
@(d24,Ern)
(BX),(SI),(DI)
(BX+SI),(BX+DI),(BP+SI),(BP+DI)
(BX+SI+d8),(BX+DI+d8),(BP+SI+d8),(BP+DI+d8),(SI+d8),(DI+d8),(BP+d8),(BP+d16)
(BX+SI+d16),(BX+DI+d16),(BP+SI+d16),(BP+DI+d16),(SI+d16),(DI+d16),(BX+d16)
(An),(An)+,-(An)
d16(An)
d8(An,Dn),d8(An,An)
d16(PC)
d8(PC,Dn),d8(PC,An)

PIC18の場合、必ずオペランドの片方は原則としてワーキングレジスタでなければならない。メモリを伴ってもサイクル数が増えない利点がある。
PIC18の場合、読み込み後に演算を行い書き戻す命令(例えば +1など)でも読み込みだけを実行する命令と実行速度が変わりません。Z80やH8では読み込みと書き込みサイクルが別々に発生するので遅くなります。
2byteや4byteを扱う場合、PIC18系が不利になります。