山本ワールド
PIC18系の概要
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ビット以上のデータを扱う命令はないが、レジスタの配置をみるとリトルエンディアンである。
周辺モジュールの設定例(設定値の計算)
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系が不利になります。