PIC (コントローラ)

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機能 令長12、14ビットコアシリーズの特徴 CPUの内蔵レジスタはWレジスタ（アキュムレータ）一つしかない。データメモリ空間にはSFR (Special Function Register) とGPR（General Purpose Register。いわゆるRAM）が混在している。一般的にはマイクロコントローラの周辺機能のレジスタをSFRと呼ぶが、PICにおいてはプログラムカウンタやステータスレジスタ、インデックスレジスタなど、一般的にはCPU内蔵レジスタとなっているものまでがSFRとしてデータメモリ空間上に存在している。 データメモリ空間は「レジスタファイル」と呼ばれ、アドレス0x00-0x7F（命令長12ビットコアの場合0x00-0x1F）をレジスタのような感覚で高速にアクセスできるようになっているが、この範囲を超えるアドレスはバンク切り替えでアクセスする必要があり、リニアなメモリアクセスに難がある。 GOTO、CALL命令のアドレス指定部が限られているため、一定サイズ以上のプログラムはページ切り替えを必要とする。 定数テーブルは作れないので（コード空間とデータ空間が分離されているハーバードアーキテクチャであり、ROMはすべてコード空間に存在するため）、リテラルをWレジスタに返すリターン命令 (RETLW) を並べて代用する。 一般的なCPUのようなジャンプ先を指定できる条件ジャンプ命令を持っておらず、あるのは「ビットテスト結果で次の命令をスキップ」するBTFSC, BTFSS命令だけである。これらとGOTO命令等を組み合わせて条件分岐せざるを得ないため、直感的でないコーディングを強要される。 命令長12ビットコアは割り込み機構を持っていない。割り込み機構がある14ビットコアでも、割り込み時の自動コンテキスト保存は一切行われないためプログラムで対応する必要がある。 スタックは一般的なCPUのようにデータメモリ空間を使用するのではなく、RETURN系命令の戻り先を積むための専用メモリが用意されている（ハードウェアスタック）。段数は命令長12ビットコアでは2レベル・命令長14ビットコアでは8レベルと限られているのであまり深いネストはできない。 古い品種ではGPIO出力・入力共にPORTnレジスタを使用する。PORTnレジスタは読み込むとポートの入出力設定に関わらず常にピンの状態が読み込まれる。このためリードモディファイライトには注意が必要であったが、比較的新しい品種ではGPIO出力ラッチレジスタLATnが新設され、この問題に対応している。 Enhancedミッドレンジコア(命令長14ビット)シリーズの特徴 後述の命令長16ビットコアの登場後、その機能を一部取り込んで新たに投入された拡張版の命令長14ビットコアアーキテクチャ。命令数の増加・コードメモリ／データメモリのリニア化・スタックの倍増（16レベル）・割り込み時のハードウェアによるコンテキスト保存などが強化されている。 命令長16ビットコアシリーズの特徴 命令長12, 14ビットシリーズをベースに、アーキテクチャを高級言語向きに改良するなど、より汎用マイコンらしく拡張されている。 コードメモリのページ切り替えは必要なくなった。 データメモリもバンクを意識することなくリニアにアクセスできる命令が拡張された。 コードメモリ空間をデータとして読み出すための命令が追加された。 ハードウェアスタックは32レベルに拡張された。 最大CPUクロックは品種によるが40-64MHz（1命令実行サイクルに4クロックを要する点は命令長12, 14ビットコアシリーズと同様） 命令長12ビット、14ビットコアの品種ではプログラムメモリ容量をワード(命令長)単位で表記していたが、命令長16ビットコアの品種では基本的にバイト（8ビット）単位で表記し、ワード単位表記も併記される形になったので注意が必要である。すなわちプログラムメモリ32KBの品種では、16384命令までのプログラムが格納可能となる。 ベースラインシリーズ（命令12ビット長コア） PIC10系 このシリーズは全て6ピンである（表面実装パッケージの場合。DIPの場合はNC2ピンを加えて8ピンとしている） 10F200 10F202 等 PIC12系 PIC12は初期からある8ピンのシリーズである。初期の品種は12ビットコアだが、その後14ビットコア・Enhancedミッドレンジ（拡張版命令14ビット長コア）の品種も加わっている。 12C508,509 初期の、プログラムメモリにワンタイムPROM（1回のみ書き込み可能）を使用した品種。開発用の紫外線消去窓付きの品種(CE)もあった。 12F508,509 12C508,509のフラッシュ版 ミッドレンジシリーズ（命令14ビット長コア） PIC12系 12F629 発振回路 (4MHz) を内蔵し単独動作可能な8PinのPIC 12F675 12F629にA/Dコンバータを追加 12F683 CCPを搭載・内部クロック8MHz PIC16系 16F84A 多数のPIC入門書で取り上げられた定番機種（だが、周辺機能はGPIOとタイマしかない）。 16F648A 16F84Aに多彩な機能を追加搭載、発振回路(4MHz)内蔵したため単独動作で実験できるため扱いやすい、CCP・USARTを搭載 16F88 18PinのPICでは最も多機能な機種、A/Dコンバータ搭載、内蔵クロック8MHz搭載（16F84Aの後継） 16F877A 40pinとI/Oの数も多く機能も16F88以上、プログラムメモリも8Kワードで大容量 16F887 16F877Aの改良版。発振回路を内蔵し、A/Dコンバータのピン数が増えている。 16F876A 16F877Aの28pin版 16F886 16F887の28pin版 16F1827 16F88の後継 Enhancedミッドレンジシリーズ（拡張版命令14ビット長コア） PIC12系 12F1571 等 PIC16系 16F19xx 等 16F1455 14ピンながらUSB（デバイス）モジュールを備える。 ハイエンドシリーズ（命令16ビット長コア） 2016年6月現在、このシリーズに属する物はPIC18シリーズのみである PIC18系, PIC18 Kシリーズ, PIC18 Jシリーズ PIC18 Kシリーズは低消費電力・高パフォーマンスアプリケーションに対応したシリーズと位置づけられている（反面、チップトータルでのポート駆動能力は他品種に比べて低い場合がある）。 PIC18 Jシリーズは高機能シリーズとなっており、最大のものは100ピンパッケージで外部メモリバスインタフェイスを備える。 18F4520 40Pin。プログラムメモリは32KB(16Kワード)、RAMは約1.5KB 18F2550 28Pin。USB（デバイス）モジュールを内蔵 18F4550 18F2550の40Pin版 18F2620 28Pin。8722と同じRAM容量をもつ 18F4620 18F2620の40Pin版 18F8722 80Pin TQFPパッケージ、プログラムメモリは128KB、RAMも約4KBと大容量 18F14K50 20Pin。USB（デバイス）モジュールを内蔵。手頃なピン数で手軽に扱えるUSBマイコンとして近年よく利用されている。 18F2480 28Pin。自動車の車載ECU間及び診断用コネクタなどとの通信に使用されるCANインタフェイスを実装したECANモジュールを備える。 ELM Electronics社のELM327（英語版）というOBD2（標準化された診断用コネクタ）-非同期シリアル変換チップは、18F2480にファームウェアを書き込んだ製品である（低消費電力版ELM327Lは18F25K80を使用）。ELM327とBluetooth (SPP) モジュールを組み合わせドングル状にしたOBD2-Bluetoothアダプタもまた通称ELM327と呼ばれている。ELM Electronics社は当初コードプロテクトをかけずにチップを出荷してしまったため、デッドコピー品が大量に出回ってしまっている。 2001年にマイクロチップ社はdsPICシリーズを発表し、2004年後半に出荷を開始した。 マイクロチップ社による本格的な16ビットのマイクロコントローラである。 PIC24は一般的な目的用であり、dsPICはDSPの能力を追加したものである。 PIC24　　　このシリーズにはプログラムメモリ256KB、RAM32KBといった大容量なものもある PIC24F系　　　最大16MIPS PIC24H系　　　最大40MIPS PIC24E系　　　最大70MIPS 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レジスタであるといえるだろう。 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書き換えおよびデバッグ リアルタイムトレース 2013年11月、マイクロチップ社はMIPS M14KコアをベースとしたPIC32MZシリーズのマイクロプロセッサを発表した。 PIC32MZシリーズの特長: 200 MHz動作、および330 DMIPS、3.28 CoreMark/MHzのパフォーマンス 2MBのフラッシュメモリおよび512KBのRAM 新しい周辺サポート。ハイスピードUSBおよび暗号化エンジン、SQI SCENIX SXシリーズ - SCENIX（現在はUbicom）のCPUで、ミップス・テクノロジーズをスピンオフしたチームが開発した。PICとバイナリ互換で命令を4倍速にし、さらに50MHzや75MHzと高クロック化されている。PIC12相当のものとPIC16相当のものがある。 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は多種の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命令がない。全てのレジスタはアドレスを持つ ソフトウェアはすべてのサブルーチンスタックを利用できる。スタックがいっぱいのときに割り込みはマスクされ、その関数が抜けるときに初めて実行される MPLAB XC Compiler Windows版 (x86/x64)、Linux版 32-Bit and Linux 64-Bit (Requires 32-Bit Compatibility Libraries)、Mac版 (10.X) のコンパイラが無料で提供されており、それぞれ、MPLAB XC8 Compiler、MPLAB XC16 Compiler、MPLAB XC32 Compilerの3種のコンパイラで、発売中のすべてのPICマイクロコンピュータに対応している。統合開発環境であるMPLAB Xに統合して使用される。マイクロチップ・テクノロジー社が公開しているライブラリやサンプルコードをそのまま利用できる利点がある。最適化機能に制限のないPRO版と、最適化機能が制限されたFree版、Standard版があるが、個人レベルでの使用ではFree版で必要・十分な機能を得られる。Free版は、PRO版と全く同じデバイスとコマンドをサポートし、使用時間とメモリ使用量にも制限はない。ほとんどの用途で十分なコード最適化機能を備えた、機能に制限のないライセンスで使うことができる。 CCS PIC C Compiler 対象となるPICの種類（ビット数）および開発環境のオペレーティングシステムにより製品が分かれている。初期のバージョンは専用のIDEが付属していたが、最近のバージョンではMPLABに統合して使用するようになっている。 HI-TECH PIC C Compiler MPLABに統合するほかEclipseをベースとした独自のIDEで使用できる。出力可能な容量が制限された PICC Lite は無償で使用できる。 mikroElektronika mikroC for PIC SDカードやキャラクタLCDを含む多くのライブラリが標準でついている。独自のIDEになっている。対応するシリーズは12, 16, 18シリーズのほぼ全て。PIC24やdsPICシリーズは別製品になっている。無償バージョンでは出力が2Kワードに制限されるが、その範囲内であれば有償版と同じライブラリがつかえる。また、Basic版とPascal版も販売されている。HI-TECHのコンパイラと違い、include文が不要だったり、大文字と小文字は区別しないなどの違いがある。 SDCC (Small Device C Compiler) 小型デバイス向けのフリーのCコンパイラ。PICを含む複数のデバイスに対応しており、マルチプラットフォームで動作する。