上が開発用のPIC16C54JWで、これだけは窓付きセラミックパッケージなので高価です。しかし、下の2種類なんかは1個単位の購入でも500円前後で手に入るでしょう。中段はクロック発振回路がプログラマブルなもので、下段はクロック発振回路が水晶発振子用に固定されているものです。ROMはすべて紫外線消去型で、窓付きパッケージは紫外線照射で消去可能ですが、プラスチックパッケージのものはプログラムを1回書き込んでしまうと消去できません。
      RA2 1     18
RA1
      RA3 2     17
RA0
    T0CKI 3     16 OSC1/CLKIN
MCLR*/VPP 4     15 OSC2/CLKOUT
      VSS 5     14
VDD
      RB0 6     13
RB7
      RB1 7     12
RB6
      RB2 8     11
RB5
      RB3 9     10
RB4
ピン配置はこのようになっていて、RA0 - RA3とRB0 - RB7の合計12本の端子が、各ピン独立に入出力方向を設定できる入出力ポート端子です。残りの6本の端子のうち、2本が電源、2本がクロック発振回路用の端子で、さらにリセット端子と内蔵タイマ・カウンタの入力端子があります。
この他、ウォッチドッグタイマが内蔵されて、プログラムの暴走対策に使用できるようになっています。
プログラム用のメモリは12 bit幅のメモリが512 Word内蔵されていて、データ用のメモリは8
bit幅で25 Byteあります。メモリを外部に増設する機能はなく、その結果、プログラムカウンタは9
bit幅と半端なサイズになっています。サブルーチン呼出用のスタックは2レベルが内蔵されていているだけと、プログラムメモリの規模に合わせて限定されています。さらにアキュムレータというか演算を行なうためのテンポラリレジスタとしてWレジスタがあり、あとはデータメモリと同じアドレス空間にある入出力用などのレジスタ群が少々あるだけです。
そのデータメモリ空間のアドレスマップを以下に示します。
 
| アドレス | 名称 | 意味 | 
| 00 | INDF | 間接参照レジスタ | 
| 01 | TMR0 | タイマ・カウンタのデータレジスタ | 
| 02 | PCL | プログラムカウンタの下位8 bit | 
| 03 | STATUS | フラグ類が集められたステータスレジスタ | 
| 04 | FSR | ファイル選択レジスタ(データメモリ用のポインタレジスタ) | 
| 05 | PORTA | ポートAの入出力レジスタ | 
| 06 | PORTB | ポートBの入出力レジスタ | 
| 07 - 1F | GPRF | 汎用レジスタファイル(RWM群) | 
INDFはFSRと組み合わされて使用されます。INDFへの読み書きはFSRにセットされているアドレスによって決まるデータメモリへの読み書きとして扱われます。命令のアドレッシングモードは絶対参照のみで、インデックスアドレッシングなどはありませんから、配列的なデータ操作などはすべてFSRを介してINDFを読み書きすることによって実行します。
TMR0とPORTA, PORTBは内蔵I/Oへの操作用です。ポートAは4 bitしかありませんので、上位4
bitは無効となっています。
PCLはプログラムカウンタの下位8 bitで、このレジスタに書き込むと分岐命令と等しい効果があります。ただし、プログラムカウンタは9
bitあり、最上位の1 bitだけはレジスタに納めきれていませんので、PCLへの書き込みと同時にリセットされることになっています。たとえば、プログラムカウンタが00から0FFHまでの間にあるなら、このレジスタへの加算操作は相対分岐命令となります。
STATUSレジスタにはLSBから順にC(キャリー)、DC(補助キャリー)、Z(ゼロ)の演算結果に影響を受けるフラグと、PD*(パワーダウン)とTO*(タイムアウト)というリセット直後の状態検出用フラグが納められています。上位3
bitは未使用で、任意の状態にセットできますが、将来、プログラム規模が大きくなったときに別のチップに移行する際、そのチップで使用される可能性があるために、使用しないように勧告されています。
GPRFは普通にいうRWMで、プログラムの変数を格納するのに使用されます。GPRFだけで25
Byteあります。
このほかにプログラムからアクセス可能だけれどもアドレスを割り当てられていない特殊レジスタとして、WレジスタとOPTIONレジスタ、TRISレジスタ群が存在します。
Wレジスタは一般のプロセッサではアキュムレータの役割に近い作業用レジスタです。加減算などはWレジスタとデータメモリ空間のレジスタとの間で実行されるようになっています。ただ、単純にアキュムレータと呼べないのは、Wとレジスタ間演算の結果をWに入れるだけでなく、Wを変化させずにレジスタ側に結果を書きこむことも可能なので、W以外のレジスタもアキュムレータの役割を持たせられるからでしょう。
OPTIONレジスタはタイマやウォッチドッグタイマなどの機能を設定するためのレジスタで、専用のOPTION命令で設定を行います。
TRISレジスタはI/Oポートの入出力方向を設定するレジスタで、PIC16C54の場合にはPORTA用とPORTB用のふたつのTRISレジスタがあります。専用のTRIS命令で設定します。
命令体系の紹介として、機械命令だけ、簡単に並べておきます。
  命令       #     
opcode      CDZ
ADDWF  f, d  1  0001 11df ffff  ***
ANDWF  f, d  1  0001 01df ffff   
*
CLRF   f     1  0000 011f ffff   
1
CLRW         1  0000
0100 0000    1
COMF   f, d  1  0010 01df ffff   
*
DECF   f, d  1  0000 11df ffff   
*
DECFSZ f, d  2? 0010 11df ffff
INCF   f, d  1  0010 10df ffff   
*
INCFSZ f, d  2? 0011 11df ffff
IORWF  f, d  1  0001 00df ffff   
*
MOVF   f, d  1  0010 00df ffff   
*
MOVWF  f     1  0000 001f ffff
NOP          1 
0000 0000 0000
RLF    f, d  1  0011 01df ffff  *
RRF    f, d  1  0011 00df ffff  *
SUBWF  f, d  1  0000 10df ffff  ***
SWAPF  f, d  1  0011 10df ffff
XORWF  f, d  1  0001 10df ffff   
*
BCF    f, b  1  0100 bbbf ffff
BSF    f, b  1  0101 bbbf ffff
BTFSC  f, b  2? 0110 bbbf ffff
BTFSS  f, b  2? 0111 bbbf ffff
ANDLW  k     1  1110 kkkk kkkk   
*
CALL   k     2  1001 kkkk kkkk
CLRWDT       1  0000 0000 0100
GOTO   k     2  101k kkkk kkkk
IORLW  k     1  1101 kkkk kkkk   
*
MOVLW  k     1  1100 kkkk kkkk
OPTION       1  0000 0000 0010
RETLW  k     2  1000 kkkk kkkk
SLEEP        1  0000 0000
0011
TRIS   f     1  0000 0000 0fff
XORLW  k     1  1111 kkkk kkkk   
*
命令のオペランド部にfとあるのは、データメモリ空間に割り当てられたレジスタを意味します。dは方向フラグで、0で結果がWレジスタに、1で結果がfで指定されたレジスタに、書き込まれます。省略した場合は1と解釈されます。bはビット操作命令におけるビット番号を表します。kは定数かアドレスラベルです。
#の欄は命令実行サイクル数です。1サイクルか2サイクルのどちらかです。2?となっているのは、命令実行条件によって1サイクルになるか2サイクルになるか決まる命令です。
オペコード欄のdは方向フラグがそのまま入ります。fffffはレジスタの絶対アドレスが入ります。PIC16C54のデータメモリ空間は5
bitで表現できますから、1 word命令の中に埋めこめます。bbbはビット番号で、kkkkkkkkなどは定数です。CALL命令のアドレスオペランドは8
bitですが、GOTO命令は9 bitになっているなど、微妙な違いはありますけど。
CDZの欄はフラグ変化を意味する欄です。Cはキャリー、DはDCの補助キャリー、Zはゼロフラグです。空白は変化しないことを、*は命令の実行結果によって変化することを、1は必ず1になることを意味します。
Return to IC Collection