PIC(ピック、Peripheral Interface Controller)とは、マイクロチップ・テクノロジー社 (Microchip Technology Inc.) が製造しているマイクロコントローラ(制御用IC)製品群の総称である。

## 概要

コンピュータの周辺機器接続の制御用として1975年にジェネラル・インストゥルメント (General Instrument Corporation) 社により開発された。1985年にPICの事業部門が独立してマイクロチップ社となり現在に至る。

PICにはCPU、メモリ (RAM, ROM)、I/Oなどが1チップに収められており、ROMに書き込まれたプログラムにより制御される。回路構成が容易かつ安価で、他のマイクロコントローラと比べて圧倒的にインターネット上で情報を得やすく、関連書籍も豊富で、PICそのものの入手性も良いため電子工作愛好家の間で人気がある。

## 特徴

命令語長を揃え命令数を抑えたRISCライクな構造になっているほか、コードエリアとデータエリアが分離されたハーバード・アーキテクチャをとり、コードエリアとデータエリアとでバス幅をそれぞれ最適化しているのが特徴である。「ビットコア」とはコードメモリの1命令のビット数を指す。たとえば命令長12ビットコアの場合はコードエリアのバス幅は12ビット・データエリアのバス幅は8ビットとなっている。またコード・データそれぞれのアドレス空間も必要十分なサイズに抑えられている。

大半の命令が1サイクルで実行されるが、シリーズにより1サイクルあたりのクロックは異なる。8ビット系PIC (PIC10/12/16/18系) は4クロックが1サイクル、PIC24/dsPIC系は2クロックが1サイクル、MIPSアーキテクチャコアのPIC32系は1クロックが1サイクルである。

大多数の品種で、動作用のクロック発振回路を内蔵しており単独で動作することが可能だが、高精度を要する場合のために外付けの水晶等を使用する発振回路も内蔵し、また外部オシレータからのクロック入力による動作も可能になっている。

プログラムコード用の内蔵メモリとしては、古くはワンタイムROM、EPROM(紫外線消去)品があったが、現在では大多数がフラッシュROM品となっている。
多くの品種で、不揮発性のデータ保存用としてEEPROMが内蔵されている。

バスは多くの品種で外部に出力されていないが、PIC18シリーズの多ピン(100ピン等)の品種などでは外部バスが用意されているものもある。

パッケージは長方形のDIPタイプから小型の表面実装タイプのものまでさまざま豊富な形態で供給されている。ピン数のバリエーションも豊富で、下は6ピンのもの(俗に米粒PICと呼ばれる)から存在する。GPIOポートのほか、タイマやA/Dコンバータなどを内蔵するもの、シリアルコントローラ (USART, IIC) やUSBコントローラを内蔵している製品もある。

多くの品種でGPIOポートには1ピンあたり25mAまで流せる出力回路が採用されており、LED等を直接駆動することができる。ただし1ポート及び1素子当たりの合計の出力電流には制限がある。

なおPICの開発元であるMicrochip社は、ディスコン(廃番、生産停止)にしない事を会社の方針としており、古いチップも入手可能である。
そのため、設計の古いものや機能の劣るものも存在し、そのことが他社との比較において誤解され、性能的に不利であるという誤った解釈をされる理由ともなっている。
一方で、存在する過去の使用例や作例の蓄積が時間を経た現在でも有効に活用できるというメリットは大きく、チップが入手できないために見つけた作例が実際には生かせないというケースはまれである。

開発環境は、Microchipからは、古くはアセンブラのみが無償で提供されていたが、現在ではMPLAB Xという統合開発環境とCコンパイラ (XC) が無償で配布されている(無償版では最適化などに機能制限があるもののコードサイズ制限などはない)。MPLAB X は NetBeans IDEをベースにしている。
もちろん現在でもアセンブラも利用可能であり、サードパーティー製の開発環境も古くから何種類か発売されている。

PIC内蔵のプログラムメモリに書き込みを行うためのライタは、初期のものはDIPのゼロプレッシャソケットを備え、PICチップをライタに装着して書き込むものが一般的であったが、現在ではMicrochipから廉価な純正ライタのPICKitシリーズが発売されているのでこちらを用いるのが一般的となっている。PICKitを使用した書き込みは、回路上に用意した5ピンのICSP (In-Cirtuit-Serial-Programming) コネクタ経由で行うため、いちいち基板からPICを着脱する必要がない(ということはソケットを使わない表面実装タイプのPICの場合でも使用できる)。またPICKitは書き込みのみならずICD (In-Circuit-Debug) 対応の品種であればデバッガとしても使用できる(ただし小ピン品種でICDをサポートしているPICはあまり無い)。

日本では、電子工作雑誌で紹介されたり、秋葉原などにある電子パーツ店では独自に企画したライタなどのキットが販売され、PICチップやライタ、開発環境が入手しやすいため普及した。また1995年ごろから、ソニー PlayStationのCD-ROMコピープロテクトを、ハードウェアに細工して回避する手段が流行した。このための追加部品を通称MODチップというが、これにはPIC12C508等がよく使用された。アンダーグラウンドでは数千円で売られていたMODチップが、自分でPICにプログラムを書き込めば数百円で作れるため、これを糸口として普及が進んだ側面もある。

PICマイクロコンピュータの入手性は他のマイクロコンピュータと比べて格段に良く、特にDIPパッケージと呼ばれる扱いやすいパッケージの豊富さから、日本でのアマチュア電子工作においてはゆるぎない人気を維持している。PICは電子部品を扱う複数の会社がキットで提供しているため、電子工作でよく使われている。今まで専用のLSIやICなどで構成されていた回路をPICに置き換えている電子工作キットなどもある。

近年では後発のAtmel AVRマイコンとそれを利用したArduinoや、ARMアーキテクチャを採用した32ビット級マイクロコントローラが台頭しているなど、ライバルも多い。(なおAtmel社は2016年1月、Microchip社に買収された)。

PICは(特に初期の12ビットコア・14ビットコアは)制限が多くプログラミングしにくいアーキテクチャであったが、その後、高級言語(C言語)でも扱いやすくなるような機能拡張が行われたシリーズも増えている。

## 機能

すべてのPICに搭載されている機能(\*の付いた副機能のみ非搭載機種もある)

- 発振回路
  - 外部発振回路
    - 水晶振動子発振
    - 外部からクロックを供給
    - RC発振\*
  - 内部発振回路\*(RC発振回路・4-16MHz程度)
  - 高精度(誤差±1-5%程度)内部発振回路\* (品種によっては工場出荷時に校正値がプログラムフラッシュの特定アドレスに書き込まれているため、これを消去してしまわないよう注意が必要)
  - PLL回路(クロックソースを3逓倍あるいは4逓倍できる)\*
- リセット(プログラムの先頭に戻る)
  - RESET端子によるもの
  - ウォッチドッグタイマ(WDT)\*によるもの
- 割り込み
  - 外部割込み
    - ピン変化\*
    - INTピン
  - 内部割込み
    - AD変換完了\*
    - EEPROMにライト完了\*
    - タイマのオーバーフロー(桁あふれ)
- スリープ(動作を停止し低消費電力となる)

一部品種に搭載されている機能

- CCP機能(キャプチャ、コンペア、PWMの頭文字)
  - キャプチャ
  - コンペア
  - PWM(オンとオフの割合でモーターの速度制御やLEDの明るさ制御ができる)
- タイマー(カウントアップ)
- AD変換(アナログ→デジタル変換)
- DA変換(デジタル→アナログ変換)
- コンパレータ(比較)
- シリアル通信
  - USB(18Fシリーズ以上の一部)
  - SPI
  - I2C
  - USART
  - CAN
- パラレル通信
- WDT - フリーズ・暴走を回避する為の監視タイマ
- JTAGプログラミング(24FとdsPIC33Fシリーズのみ)
- USB On-The-Go機能

## PICの種類

### 8bit PICシリーズ(データメモリが8ビット幅)

- データメモリ空間は「レジスタファイル」と呼ばれ、アドレス0x00-0x7F(命令長12ビットコアの場合0x00-0x1F)をレジスタのような感覚で高速にアクセスできるようになっているが、この範囲を超えるアドレスはバンク切り替えでアクセスする必要があり、リニアなメモリアクセスに難がある。

### PIC24とdsPIC

2001年にマイクロチップ社はdsPICシリーズを発表し、2004年後半に出荷を開始した。

マイクロチップ社による本格的な16ビットのマイクロコントローラである。
PIC24は一般的な目的用であり、dsPICはDSPの能力を追加したものである。

1. PIC24   このシリーズにはプログラムメモリ256KB、RAM32KBといった大容量なものもある
   - PIC24F系   最大16MIPS
   - PIC24H系   最大40MIPS
   - PIC24E系   最大70MIPS
2. dsPIC   命令24ビット長・データ長16ビットのCPUコアと、DSPを内蔵
   - dsPIC30F系   最大30MIPS
   - dsPIC33F系   最大40MIPS
   - dsPIC33E系   最大70MIPS

それでいてそれ以前のPICアーキテクチャに類似しているにもかかわらず、飛躍的に拡張されている:

- すべてのレジスタは16ビット幅
- 命令実行サイクルがこれまでのPICアーキテクチャの4クロックサイクルから、2クロックサイクルに短縮された
- データアドレス空間は64KBに拡張される
- 最初の2KBは周辺機器コントロールレジスタとして予約される
- データバンク切り替えはRAMが62KBを超えるまで必要ない
- 「fオペランド」による直接的なアドレス指定は13ビットに拡張される (8KB)
- 16W レジスタが、レジスタ間命令用に利用できる(ただしfオペランドとは常にW0が参照される)
- プログラムカウンタは22ビット(ビット22:1が有効で、bit0は常に0)
- 命令は24ビット幅
- 命令はバイト (B=1) および16ビット形態 (B=0) をとる
- スタックはRAMの中にとられる(W15がスタックポインタ); ハードウェアスタックは存在しない
- W14はフレームポインタ
- ROMに格納されたデータは直接参照できる(プログラム空間が読める)
- 異なる割り込みソースからの割り込みベクタがサポートされる

いくつかの特長:

- ハードウェア積和演算
- バレルシフタ
- ビット反転
- 16x16ビットの1サイクルでの積算およびその他のDSP命令
- ハードウェア除算支援(16/32ビット除算で19サイクル)
- ループ処理に対するハードウェア支援(ゼロオーバーヘッドループ)
- ダイレクトメモリアクセス

dsPICではマイクロチップXC16コンパイラ(C30と呼ばれる)を使用することでC言語でプログラミングできる。これはGCCの一種である。

プログラム用ROMは24ビット幅である。ソフトウェアは16ビット幅でこのROMにアクセスできる。16ビット2ワードとして読み込むと、1ワード目は16ビット、2ワード目は8ビットであり、上位8ビットは0が設定される。プログラムカウンタは23ビット幅であるが、最下位ビットは常に0であり、実質的には22ビットである。

命令は大きく2種類ある。
一つはクラシックなPIC命令であり、W0および指定されたfレジスタ(例えば最初の8KBのRAM)の間の処理である。出力先はビット設定により選択され、処理結果として書き換えられる。Wレジスタはメモリマップである。つまりfオペランドはあらゆるWレジスタであるといえるだろう。

### PIC32MX

2007年11月、マイクロチップ社は新しい32ビットマイクロコントローラであるPIC32MXファミリーを発表した。
最初のラインナップは業界標準であるMIPSアーキテクチャを採用している。
この製品はMicrochip MPLAB C Compiler for PIC32 MCUsによってプログラムを作成できる。このコンパイラはGNUコンパイラコレクションの派生である。
最初の18モデル(PIC32MX3xxおよびPIC32MX4xx)は既存の16ビット製品であるPIC24FxxGA0xxファミリーとピン配置および周辺サポートに互換性があり、同じソフトウェアライブラリやハードウェアの装置が使用できる
今日では28ピンのより小さなQFNパッケージが出荷されており、ハイパフォーマンス向けにイーサネット、CAN、USB On-The-Goのサポートが含まれる製品もある。ミッドレンジの32ビットマイクロコントローラのすべてのファミリーが利用可能である。

PIC32アーキテクチャはマイクロチップ社のポートフォリオにいくつかの新しい特長をもたらしている:

- 最大512KBのフラッシュメモリ
- 1つのインストラクションは1クロックで実行される
- キャッシュメモリのある初めてのプロセッサ
- RAMから実行可能になった
- フルスピード対応のUSBデバイスまたはOTGホストとなれる二役のサポート
- JTAGにフル対応および2ワイヤーによるROM書き換えおよびデバッグ
- リアルタイムトレース

### PIC32MZ

2013年11月、マイクロチップ社はMIPS M14KコアをベースとしたPIC32MZシリーズのマイクロプロセッサを発表した。

PIC32MZシリーズの特長:

- 200 MHz動作、および330 DMIPS、3.28 CoreMark/MHzのパフォーマンス
- 2MBのフラッシュメモリおよび512KBのRAM
- 新しい周辺サポート。ハイスピードUSBおよび暗号化エンジン、SQI

## PIC互換

1. SCENIX SXシリーズ - SCENIX(現在はUbicom)のCPUで、ミップス・テクノロジーズをスピンオフしたチームが開発した。PICとバイナリ互換で命令を4倍速にし、さらに50MHzや75MHzと高クロック化されている。PIC12相当のものとPIC16相当のものがある。

## クローン製品

### ELAN Microelectronics

ELAN Microelectronics Corp. ELAN社は13ビット命令長のPICライクなマイクロコントローラーを発表している。 この命令セットは14ビット命令セットのミッドレンジにもっとも互換性があるが、レジスターアドレスが6ビットであり(16個の専用目的のレジスタおよび48バイトのRAM)10ビット(1024ワード)のプログラム空間である。10ビットのプログラムカウンターはR2としてアクセスできる。

下位のビットのみが読み込み可能であり、上位のビットが書き込みやクリアができる。
TBL命令の例外によって、あらかじめ保存された下位バイト8-9が書き換えられる。(原文:which modifies the low byte while preserving bits 8 and 9.) 7つの即時積算命令が14ビットのPICの同等命令に対応する。オペコードを示すビットが3ではなく4ビットあるが、それらはそこだけではなく、追加されるソフトウェア割り込みに割り当てられている。

いくつかの雑多な命令が追加されており、述語の変更であるが、(PICオプションレジスタはコントロールレジスタと呼ばれる; PIC 1-3はTRISレジスター、5-7はI/Oコントロールレジスタ)明らかに同等である。

いくつかのモデルはほかのPICにあるような複数のROMやRAMバンクを持つ。

### Holtek

Holtekは多種のPICライクなマイクロコントローラーを発表しており、HT37、HT4x、HT56、HT6x、HT82、HT95ファミリーなどである。
14ビットのミッドレンジのPICマイクロコントローラーに似ているが、正確なクローンではない。
ステータスレジスタは算術的なオーバーフローフラグを持ち、いくつかの追加命令を含み、2ポインタを使用する非直接的なレジスタを含む。

3種類の命令幅がある:

- 14ビット命令セット、11ビットROMアドレス(2Kx14ビット)および7ビットRAMアドレス
- 15ビット命令セット、12ビットROMアドレス(4Kx15ビット)および8ビットRAMアドレス
- 16ビット命令セット、13ビットROMアドレス(8Kx16ビット)および8ビットRAMアドレス。いくつかの拡張ROMおよびRAMをバンクとして利用できる

基本的な14-bit PIC命令セットにない命令は:

- キャリーを足したり引いたりする命令
- キャリーを無視して右や左にビットローテート
- 0かどうかテストしてスキップする(インクリメントやデクリメントを伴わない)
- すべてのビットを1にする(CLR命令が全てを0にするように)
- ROMからテーブル読み込み
- CLRWDT1およびCLRWDT2命令はウォッチドッグタイマーをリセットするために使われる。

オリジナルのPICとの特筆すべき差異:

- 引き算はアキュムレータから引かれる
- TRIS/OPTION命令がない。全てのレジスタはアドレスを持つ
- ソフトウェアはすべてのサブルーチンスタックを利用できる。スタックがいっぱいのときに割り込みはマスクされ、その関数が抜けるときに初めて実行される