このページではPIC16F84Aを使うときに必要なポートの動作の仕様を説明します。
I/Oポートの仕様
PICが外部の回路と連携した動作をするために入出力ポートを使用します。PIC16F84Aには合計で13本の入出力ピンがあります。それらは5本と8本の組に分けられ、5本の組をAポート、8本の組をBポートと言っています。AポートにはPORTAレジスタが対応しており、BポートにはPORTBレジスタが対応しています。各レジスタは8ビットで構成されていて、ビット毎に入出力ピンが対応しています。ですから、PORTAはビット0からビット4までの5ビットが使用され、ビット5からビット7までの3ビットは使用されていません。PORTBは8ビット全てがそれぞれ入出力ピンに対応しています。各ピンを入力として使用するか出力として使用するかはTRISAレジスタ(PORTA用)およびTRISBレジスタ(PORTB用)で指定します。TRISxの設定が"0"の場合は出力用、"1"の場合は入力用になります。この指定はビット毎に行えるので、各ピンを独立して入力または出力に設定できます。AポートおよびBポートの制御はPORTAレジスタおよびPORTBレジスタ単位で行われます。すなわち、Aポートの場合は5本同時に、Bポートの場合は8本同時に行われます。出力動作の制御はWレジスタ(8ビット)に出力したい内容を設定し、それをMOVWF命令でPORTAレジスタまたはPORTBレジスタに書き込むことにより行います。制御はPORTAまたはPORTBレジスタ単位で行われるので入力用に設定したビットにもデータ設定は行われます。けれども実際の出力は出力用に設定したピンだけが制御され、入力用に設定したピンには影響を与えません。入力動作の制御はPORTAまたはPORTBレジスタの内容をMOVF命令でWレジスタに取り込むことにより行います。この場合、出力用に設定したピンの状態は読み込み動作をした直前の書き込み動作での状態になります。これは出力ラッチレジスタが出力状態を保持しているためです。ソフトウェアを作るときにはどのピンを入力設定にしたかを考慮して、入力ピンの状態だけを使うようにする必要があります。 AポートとBポートは回路および機能が若干異なります。また、Aポートの中でもRA4ピンはTMR0のクロック入力としても使用できるようになっています。Bポートの場合はRB4からRB7は入力信号の変化を監視できる機能を持たせています。さらにRB0は外部割り込み機能を持たせています。この辺は頭の中が混乱します。これらの機能は便利な機能ですが、必ずしも使う必要はありません。「何かそんな機能があったな」程度で頭の隅に残して置いて、必要になったときにじっくり考えた方が良いと思います。 以下に各ポート回路の概要を説明します。 Aポート( RA0-RA3 )の仕様 左の図はAポートのRA0,RA1,RA2およびRA3の回路ブロックを表しています。 データの出力に関わる部分は出力データ・ラッチ・レジスタとCMOSで構成されるドライブ回路です。CMOSの回路は出力をドライブする機能以外に該当するピンが入力設定の場合にしている場合、ピンに出力情報を出さないようにブロックする機能も持っています。
CMOS(Complementary-Metal Oxide Semiconductor)とは相互補完MOSでPチャネルMOSFET(P-FET)とNチャネルMOSFET(N-FET)が組み合わされています。
TRISAレジスタで各ピンのモードを指定します。TRISAレジスタの設定値はTRISラッチレジスタに記録されます。出力データ・ラッチ・レジスタの反転出力()とTRISラッチレジスタの出力(Q)はOR回路を通してP-FETに入力されています。出力データ・ラッチ・レジスタの反転出力()とTRISラッチレジスタの反転出力()はAND回路を通してN-FETに入力されています。
入力回路は常にピン回路に接続されています。ですから、ピンが出力モード指定になっていても、入力回路は動作しています。入力信号はTTLバッファーを通して入力データ・ラッチ・レジスタに取り込まれます。 出力および入力タイミング 出力データ・ラッチ・レジスタへの入力データ、TRIS・ラッチ・レジスタへの設定データおよび入力データ・ラッチ・レジスタの出力データはデータ・バスを通してデータの授受が行われます。データ・バスは8本あり、ピンとのデータの授受は同時(パラレル)に行われます。また、データ・バスは各レジスタに共通で使われるので、各レジスタへの制御信号のタイミングにより情報の授受が制御されます。
TRIS・ラッチ・レジスタの内容を読み出す時にはゲート付きインバータが使われています。RD TRISが"1"になるとTRIS・ラッチ・レジスタの内容がデータ・バスに伝えられます。 Aポート( RA4 )の仕様 Aポートの中でもRA4は特殊なポートになっています。下の図はRA4の回路ブロックを表しています。他のポートとの違いは出力用のドライバFETがN-FETのみであることと、入力回路に使用しているバッファがヒステリシス特性のあるシュミットトリガタイプであることです。 回路的には以上の差ですが、用途の違いとして入力モードの場合、TMR0のクロックタイミングパルスの入力に使用します。入力のバッファにシュミットタイプバッファを使用しているので、外部信号のエッジ(立ち上がり、立ち下がり)がクリアでない場合でも、ある程度Hレベル/Lレベルの判断をすることができます。 出力ドライバのP-FETが無いので、Hレベルを入力するためには外部の回路でプルアップ(抵抗器を通してVDDに接続)する必要があります。出力モードではオープンドレーンタイプになるので、外部回路の設計に都合がよい場合があります。 Bポート( RB0-RB3 ) の仕様 Bポートの出力回路構成はAポートとは異なっています。出力回路ではFETを使わずにゲート回路でモードの切り替えを行っています。Bポートの特徴は入力モードの時にプルアップ機能を備えていることです。プルアップと言うのは入力ポートをVDD側に吊ることです。このようにすると、入力がオープンの場合でも、入力ポートはHレベルになります。通常の回路では抵抗器を使用してプルアップしていますが、この回路ではFETが使われています。FETは完全なON状態でなく弱いプルアップ(Weak pull-up)になっています。このプルアップ機能が回路動作に影響する場合には使わないようにすることができます。 RB0は外部割り込みの入力ピンとしても使用するようになっていて、シュミットタイプのバッファを介して内部回路に接続されています。 TRISが"0"の場合、出力モードになります。出力ゲートの制御入力にはインバータがあるので、TRIS・ラッチ・レジスタの出力が"0"(Lレベル)の場合にゲートが開きます。プルアップ用のNANDゲートの入力はLレベルのため、出力はHレベルになります。そのため、プルアップ用のP-FETはOFF状態になり、プルアップはされません。 TRISが"1"の場合、入力モードになります。出力ゲートは閉じられ、I/Oピンと切り離されます。プルアップ用のNANDゲートのTRIS・ラッチ側はHレベルであるため、RBUPの設定によりプルアップするか、しないかが決まります。RBPUはOPTION-REGレジスタのビット7で、"0"で「プルアップする」、"1"で「プルアップしない」になります。"0"の場合にはP-FETのゲートがLレベルになり、P-FETはON状態になります。"1"の場合はその逆です。 RBPUはBポート全体のプルアップ状態を指定します。各ピン毎には設定できません。 Bポート( RB4-RB7 ) の仕様 RB4からRB7は入力信号の変化を検出する機能が備えられています。この機能はキーを押したときに割り込み処理をさせるなどに使用できます。変化の検出は4本のピンの変化をまとめて検出しています。ですから、特定のピンだけの変化を検出することはできません。この機能はピンを入力モードにしたときだけ働きます。変化の検出には入力データ・ラッチ・レジスタに加えてラストルック・データ・ラッチ・レジスタを使い、それらの出力を排他論理和(Exclusive OR :XOR [エクスクルーシブ・オアーと読みます])回路を使用しています。 XOR回路の入力と出力は下図のようになります。 入力変化検出回路の動作は以下のようになります。 PORT読み込み(RD Port)がLレベルからHレベルに変化するとインバータを通して入力データ・ラッチ・レジスタに入力データが読み込まれます。このときにはラストルック・データ・ラッチ・レジスタへの読み込みは、まだ、行われません。次にRD PortがHレベルからLレベルに変化すると入力データがラストルック・データ・ラッチ・レジスタに読み込まれます。 入力に変化がなければそれぞれのレジスタの出力は同じなので、XORの出力はLレベルです。 次の読み込みタイミングまでの間に入力データが変化したとします。 RD PortがLレベルからHレベルになると、入力データが入力データ・ラッチ・レジスタに読み込まれます。このときラストルック・ラッチ・レジスタの内容は、まだ、変化していません。そのため、XORの2本の入力には異なる状態が入力され、Hレベルが出力されます。このHレベルが割り込み信号のトリガになります。 RD PortがHレベルからLレベルになるとラストルック・ラッチ・レジスタにも入力データが読み込まれ、両レジスタの出力は同じになるので、XORの出力はLレベルになります。 RD Portの信号がHレベルからLレベルになる前に入力データが変化した場合には、ラストルック・ラッチ・レジスタに入力データが読み込まれます。この時点では、まだ、入力データ・ラッチ・レジスタには変化が読み込まれていないため、両レジスタの出力の状態は異なり、XORにはHレベルが出力され、割り込みが発生します。 XORの出力は次のRD Portに読み込みパルスが入るまで継続します。この継続が割り込み動作に影響するかどうか分かりません。割り込みをソフトで処理してRBIFビットをクリアしてもXORの出力がHレベルであると再度割り込みが発生するかもしれません。または、内部の回路でガードされている可能性はあります。 |