目次PIC入門


PIC16F84Aのハードウェア




PICを使うためにはその機能を理解する必要があります。
PIC16F84Aは RISC(Reduced Instruction Set Computer)と言われる方式が採られています。リスクと読みます。
これは縮退命令セットを使用したコンピュータで命令の数は35種類だけになっています。

詳しい仕様は PIC16F84Aのデータシート(英文) を参照して下さい。

日本語で書かれた PIC16F84の資料(3.14MB) を入手することができます。
PIC16F84Aと比べて最大クロック周波数が10MHzであるだけで、他の仕様はほとんど同じです。
ちなみにPIC16F84Aの最大クロック周波数は20MHzです。私は価格がほとんど同じなのでPIC16F84Aを使いました。

PIC16F84A-20/Pというもので、秋月電子通商で1個 380円 でした。クロック発振用のセラミック発振子(レゾネータ)も売っています。
3.58MHz, 4MHz, 4.19MHz, 8MHz, 10.0MHz, 12.0MHz, 20.0MHzの種類があり、1個 40円 でした。
( 2000年4月時点 )

ハードウェアの詳細は以下のページも参考にして下さい。
詳細仕様 (1) 各種レジスタ
詳細仕様 (2) I/Oポート
詳細仕様 (3) タイマー
詳細仕様 (4) プログラム書き込み( ICSP )






ピン接続
OSC1/CLKIN 発振クリスタル入力
外部クロック入力
OSC2/CLKOUT 発振クリスタル出力
クロック出力の場合にはOSC1の1/4の周波数
MCLR(inv) マスターリセット入力
Lレベルでリセット状態
RA0 - RA3入出力ポート
RA4/T0CKI 入出力ポート
タイマー(TMR0)のクロックパルス入力
RB0/INT 入出力ポート
外部割り込み信号入力ポート
RB1 - RB7入出力ポート
VSS接地
VDD電源入力(+2.0V 〜 +5.5V)











PIC16F84Aのブロック図

手のマークのポインタになった部分をクリックするとその部分の説明のページにジャンプします。




















フラッシュ・プログラムメモリー

プログラムを格納するメモリでフラッシュメモリが使われています。1ワードは14ビットで構成されていて1024ワード(1Kワード)実装されています。フラッシュメモリは電源を切っても記憶している内容が消えません。また、ライターという書き込み装置を使用して書き換えることができます。ただ、書き換えられる回数が制限されていて約1000回です。
プログラムメモリーの一部は用途が決められています。
リセット処理先頭メモリ ( 0000h )
電源投入時、WDT(Watchdog Timer)タイムアウトその他の要因でリセットがかかった場合、リセット後にプログラムはこの位置から走り始めます。
割り込み処理先頭メモリ ( 0004h )

タイマーのタイムアウト割り込み、外部からの割り込みなどがあった場合、プログラムはこの位置から走り始めます。
コンフィギュレーションワード ( 2007h )

このメモリではPICの基本動作を指定します。パワーアップタイマーの要否、ウォッチドクタイマーの要否、クロック発振器のタイプなどを設定します。
この領域は通常のプログラム領域より後ろにあり、プログラムで設定することはできません。プログラムをフラッシュメモリに書き込むときにライターを使用して書き込みます。
コンフィギュレーションワード内容の詳細は「PIC16F84Aの詳細仕様(1)」のコンフィギュレーションワードの項目を参照して下さい。
RAM(Random Access Memory)ファイルレジスタ

このメモリは2つの領域に分けて使用されます。このメモリはバンクという管理構造を採っていて実際のメモリ容量はバンクあたり80バイト(00h-4Fh)あります。PIC16F84Aの場合、バンクは2つあります。
各バンクの最初の12バイト(00h-0Bh)はSFR(Special Function Registers)と呼ばれ、PICの動作状態、入出力ポートの状態、その他の状態を記録するために使用されます。各々の用途は決められています。
13バイト目以降の68バイト(0Ch-4Fh)はGPR(General Purpose Registers:汎用レジスタ)と呼ばれ、プログラムを実行する途中の結果とか状態を一時的に記録させることができます。
SFRは各バンクで異なる内容が管理され、16種類のレジスタがあります。ただ、SFRの一部は両方のバンクとも同じ内容ですので24種類ではありません。また、GPR領域はバンク切替を行っても内容が全く同じなので、実質68バイトの容量です。
電源が切れると内容は消えてしまします。書き換える回数に制限はありません。
EEPROM(Electrically Erasable Programmable Read Only Memory)

このメモリは電源を切っても内容を保持するタイプのメモリです。このメモリの内容はプログラムによって書き換えることができます。メモリ容量は64バイトです。
このメモリは書き換え回数が制限されています。約100万回までです。ですから、プログラムの実行途中のデータなどを格納するために使用することはできません。変更頻度の少ないデータに限定されます。100万回というのは多いようですが、プログラムの実行速度から見ればあっという間に100万回になってしまいます。
記憶した内容は約40年間保持できるそうです。このICが出来てからまだ40年経ってはいませんが。












SFRレジスタ

SFR(Special Function Registers)はバンク切替を行うことにより16種類のレジスタを指定することができます。
下の図はRAMファイルレジスタを表しています。バンク切替により160バイトになっています。ただし、左矢印の内容はどちらのバンクでも同じです。SFRの一部がバンク切替によって内容が変わります。灰色の部分はメモリが無い部分です。
各々のSFRは以下の機能を持っています。
INDF:間接アドレスによるレジスタの内容
TMR0:タイマーカウンター
PCL:プログラムカウンターの下位8ビット
STATUS:演算結果の各種フラッグ
FSR:間接アドレス用レジスタ
PORTA:PORTAデータ入出力
PORTB:PORTBデータ入出力
EEDATA:EEPROM用データ
EEADR:EEPROM用アドレス
PCLATH:プログラムカウンターの上位5ビット
INTCON:割り込み制御
OPTIN_REG:各種モード設定
TRISA:PORTAのモード設定
TRISB:PORTBのモード設定
EECON1:EEPROM用制御レジスタ
EECON2:EEPROM書込制御レジスタ

各レジスタの詳細は「PIC16F84Aの詳細仕様(1)」のSFRの項目を参照して下さい。
プログラムカウンター

フラッシュメモリーに書かれているプログラムの読み出しアドレス(フェッチ・アドレス)を示すカウンターです。13ビットのカウンターです。通常は1つの命令が実行される都度1つカウントアップして次の命令の位置を示しています。ただし、ジャンプ命令等が実行されると、このカウンターの内容がジャンプ先のアドレスに書き換えられます。
8レベルのハードウェアスタック

スタックというのはプログラムの戻り番地を格納するメモリです。
例えば、同じ処理を何カ所かで行う場合、その処理をサブルーチンという形で作り、最後をRETURN命令にします。処理をサブルーチン化することによりメモリの使用量を節約できます。そのサブルーチンを使うプログラムではCALL命令を使用してサブルーチンにジャンプします。この時、スタックに戻り番地が格納されます。この動作をプッシュ(PUSH)と呼ぶこともあります。サブルーチンでの処理が終わりRETURN命令が実行されるとスタックに書かれている戻り番地にジャンプします。この動作をポップ(POP)と呼ぶこともあります。このようにすれば、複数の箇所にサブルーチンのCALL命令が書かれていても、サブルーチンにジャンプした元のプログラム(サブルーチンをコールしたプログラムと言います)に戻ることができます。
スタックが8段あるということは、サブルーチン内で他のサブルーチンをコールし、さらにその先でサブルーチンコールをするということを最初のサブルーチンコールを含めて8回まで行えることになります。9回目のサブルーチンコールをすると1段目の位置に戻り番地が書かれてしまいます。8回を越えることはできません。サブルーチンは必ずRETURN命令でコール元に戻らなければなりません。JUMP命令で戻ってはいけません。メインルーチンではスタックに戻りアドレスが書かれていない状態にします。
インストラクションレジスタ

プログラムカウンターで指定されるプログラムの命令(インストラクション)はこのレジスタに読み込まれます。この動作をフェッチ(Fetch)と言います。
インストラクションデコード・制御

インストラクションレジスタにフェッチされた命令はここで解析され、命令内容に応じた動作が行われます。
マルチプレクサおよび算術演算部

マルチプレクサ(Multiplexer)および算術演算部(ALU:Arithmetic Logic Unit)はコンピュータでの計算動作を行うところです。これが無いとコンピュータとは言えません。
Wレジスタ

ワークレジスタと言われるもので、算術演算部で行われる計算動作の結果を一時的に保管するために使用されます。計算動作には必須のレジスタです。このレジスタに格納された内容を各種レジスタに格納して他の処理に活用したり、I/Oポートに出力したりします。
STATUSレジスタ

算術演算部での計算結果の状態(ゼロまたは正または負)、タイマーのタイムアウト状態、ファイルレジスタのバンク切替指定などを格納するレジスタです。
レジスタ内容の詳細は「PIC16F84Aの詳細仕様(1)」のSTATUSレジスタの項目を参照して下さい。
FSRレジスタ

FSR(File Select Register)はRAMファイルレジスタのアドレスを間接アドレス方式で指定する場合に使用します。間接アドレス方式以外に直接アドレス方式があります。直接アドレス方式は命令コードでレジスタのアドレスを直接指定する方法です。この場合、アドレス指定ビットは7ビットで0から127までのアドレスを指定することができます。この指定範囲は一つのバンク分で、バンクを切り替えるのにはSTATUSレジスタのRP0ビットと組み合わせる必要があります。FSRは8ビットなので、バンク分も含めて一度に指定できます。PIC16F84Aでは80(50h)から127(7Fh)にはメモリはありません。
実際の使用方法はファイルレジスタにテーブルなどように連続したデータ領域を作った場合のアドレス指定に使用すると便利です。連続して書き込みまたは読み出しを行う時にFSRを一つづつ更新するようにすると処理が簡素化されます。
アドレス・マルチプレクサ

命令のオペコード(7ビット)とSTATUSレジスタのRP0ビットを組み合わせる直接アドレス方式とFSRを使用した間接アドレス方式のどちらかを識別し、RAMレジスタファイルのアドレスを決定します。
EEDATA

EEPROMにデータを書き込むとき、または読み出しを行うときに使用するレジスタです。
EEADR

EEPROMのアドレスを指定するレジスタです。8ビットで構成されているので、0から255までのアドレスを指定することができます。PIC16F84AではEEPROMは64バイトしか実装されていませんので6ビットしか使用できません。
ソースプログラムでEEPROM内のデータを設定するときにはメモリアドレスとして2100hを指定します。
プログラムの処理でEEPROMにデータを書く場合にはEECON2レジスタに55hとAAhを順番に設定する処理が必要です。
タイマー

PIC16F84AにはTMR0という8ビットのタイマーが一つ実装されています。入力パルスを256カウントするとタイムアウトし、SFRのINTCONレジスタのT0IFビットが"1"になります。タイムアウトしたときに割り込みを発生させることができます。割り込みとはその時点で行っている処理を一時中断させて、タイムアウトの処理を行わせることです。割り込みを発生させるためにはSFRのINTCONレジスタのGIFビットおよびT0IEビットを"1"にする必要があります。
タイマー動作の詳細は「PIC16F84Aの詳細仕様(3)」のタイマーの項目を参照して下さい。
I/Oポート

入出力兼用のピンが13本あります。各々のピンを入力に使用するか出力に使用するかはプログラムで設定できます。兼用と言っても同時ではありません。どちらかの指定をして使用します。
13本のピンは5本と8本のグループに分かれていて5本の方をAポート、8本の方をBポートと言っています。制御のタイミングの制限はありますが、13本それぞれを制御することができます。
入出力ポート動作の詳細は「PIC16F84Aの詳細仕様(2)」の入出力ポートの項目を参照して下さい。
タイミング・ジェネレーション

動作速度を決定するクロックパルスを発生させます。発振に使用するインバータを内蔵しているので、水晶発振子またはセラミック発振子と発振用コンデンサを接続するだけで動作させることができます。安定度の高い発振をさせる場合には水晶を使いますが、通常はセラミック発振子と発振用コンデンサを一つのモジュールにしたレゾネータという部品を使用すると回路が単純になります。外部からクロックを入力することもできます。
PIC16F84Aではパイプラインアーキテクチャを使用して4つのクロックパルスで1つの命令(1サイクル)を実行します。ただし、プログラムの走行アドレスを変更するジャンプ命令は2サイクル(8パルス)必要になります。20MHzのパルス周期は1/20MHzで50ナノ秒ですから、通常の命令の実行時間は200ナノ秒になります。 1秒間に500万の命令を実行することができます。
PIC初期化回路

PIC16F84Aの初期化をするために各種の制御回路が内蔵されています。

POW ONタイマー電源投入時に電圧が安定するまで動作を制限するためのタイマーです。
OSCスタートタイマー電源投入時にクロックが安定するまで動作を制限するためのタイマーです。
POW ONリセット電源投入時にPICの内部回路を初期化します。
Watchdogタイマー
このタイマーはPICのソフトウェアの正常動作を監視するためのタイマーです。
ソフトウェアでは定期的にこのタイマーをクリアする処理をする必要があります。タイマーがタイムアウトするとPICがリセット状態になり電源投入直後の状態に戻ります。ソフトウェアに不具合(バグと言います。虫のことです。害虫です。)があった場合に異常動作を復旧させるために使用します。バグが無くなるわけではありません。