【概要】
PICは入出力に関する回路を内蔵しており、PICの外にでているピンは直接
入出力が可能な入出力ピンとなっています。
しかも、1ピン毎に入力か出力かプログラムで自由に設定することが出来る
ため非常に便利に使うことが出来ます。
ここではそれらの入出力ピンの内部回路構成などハードウェアを中心に説明
します。
【標準入出力回路構成】
PICは、プログラムで入出力が自由に設定できる入出力ピンをもっています。
そしてこれらの入出力ピンをレジスタに割り振って制御するため、8ピンごとに
まとめて入出力ポートと呼んでいます。
これら入出力ピンの1ピン当たりの標準的な回路構成は下図のようになって
います。
図でTRIS Latchが入出力のモードを決めるTRISレジスタで、このLatchのQ=1
の時には入力モードに、Q=0の時には出力モードになります。
入力モードの時には、出力ドライブの相補型のMOSトランジスタであるPとNが
両方ともOFFとなって出力回路は無関係となり、TTL バッファを通ってI/O pinの
データが読み込まれます。
そして"RD PORT"信号のタイミングでラッチされてPORTレジスタがセットされる
ことになり、その出力がData Busに乗せらてプログラムで読み込まれます。
出力モードの時には、Data Busの1、0が"WR PORT"信号のタイミングで出力用
"Data Latch"にラッチされ、その出力にしたがって、Dataが1なら出力トランジスタ
PがONとなって、I/OpinにはVdd電圧が出力され負荷に電流を供給します。
Dataが0なら出力トランジスタNがONとなり出力電圧VssとしてI/O pinに現れ、負荷
から電流を取り込みます。
【入力の時の動作】
実際の入出力の動作を具体的な例で説明すると、例えばスイッチのON/OFFの
状態を読み込みたいというときには、下図のように接続します。
スイッチの片方をマイナス電源Vss(通常はグランド)に接続し、もう片方を入出力
ピンに接続します。さらに入出力ピンのところには、抵抗を介して電源Vddに接続
します。こうすると、スイッチがOFFの時には、抵抗を通して電源電圧が加わるので
入出力ピンは、ほぼ電源電圧になります。スイッチをONにすると、入出力ピンが
Vssつまりグランドに接続されたことになりますので、0Vになります。
これで、入出力ピンの電圧がスイッチのOn/Offによって、Low/Highと変化する
ことになって区別がつきます。
そして入出力ピンが入力モードに設定されると、上図のTTLゲート側を通って
入力命令のタイミングで入力用ラッチに読み込まれます。
【出力の時の動作】
発光ダイオードをPICで点灯制御するような出力制御の場合には、下図のように
接続します。
こうすると、出力が「1」の時には、トランジスタPがOn、NがOffとなるので、電流が
(1)の向きに流れようとします。しかし、発光ダイオードの反対側の端子は抵抗を
介して同じ電源Vssに接続されていて、同電位となるため、電流を流すことが
出来なくなります、このため、発光ダイオードには電流が流れず消灯します。
逆に、出力が「0」の時には、トランジスタNがOn、PがOffとなるため、電流が(2)
の向きに流れようとします。このときには、電源Vddから抵抗と発光ダイオードを
経由して電流が流れることになりますので、発光ダイオードが点灯することに
なります。
このとき流れる電流は、(Vdd-発光ダイオードの順電圧)÷抵抗 で決定されます。
これで出力データの1、0により発光ダイオードに流れる電流の向きが(1)、(2)の
ようになって、結果的に発光ダイオードの電流のOn/Offを行うことになるので、
発光ダイオードが点灯/消灯することになります。
【プログラムによる制御方法】
前項の発光ダイオードの制御を実際にプログラムで行うときには、下図のように、
レジスタへの書き込みを行うことで実現できます。
つまり、プログラムでWレジスタから入出力ポートに相当するレジスタに書き込めば、
実際の出力が出ることになります。
これをアセンブラ命令で書くとPORTBの例で下記のようになります。
BSF STATUS,RP0 ;バンク1に切替へ
CLRF TRISB ;全て出力モード
BCF STATUS,RP0 ;バンク0に戻る
MOVLW 0x65 ;01100101を出力する
MOVWF PORTB ;実際に出力実行
【入出力ピンの電気的特性】
この入出力ピンのDC特性は下表のようになっています。入力も出力もいずれの
場合にもスレッショルドとなる電圧は、電源電圧であるVddによって値が変わります
ので、5V以外の電源で動作させる時には注意が必要です。
L/H
項 目
最小値
最大値
Low
I/O Ports TTLバッファ
I/O Ports Schmitt Trigger
MCLR、OSC1(RCモード)
OSC1(XT,HS,LPモード)Vss
−
Vss
Vss0.15Vdd
0.8
0.2Vdd
0.3VddHigh
I/O Ports TTLバッファ
I/O Ports Schmitt Trigger
MCLR
OSC1(RCモード)
OSC1(XT,HS,LPモード)0.25Vdd+0.8
0.8Vdd
0.8Vdd
0.9Vdd
0.7VddVdd
Vdd
Vdd
Vdd
Vdd(条件) 4.5V<Vdd<5.5V
表中で、入力がシュミットトリガタイプになっている入出力ピンは、入力のスレッショルド
電圧に0.1V程度のヒステリシス特性があり、電圧がゆっくりと変動する入力信号に対し
ても安定にHigh/Lowを検出できるようになっています。
特にタイマでカウント動作をさせるような場合には、外部の入力信号が多少なまって
いるような信号でも正しくカウントさせることが出来ます
【入出力ポートを使うときの注意】
入出力ポートを使う際にはいくつかの注意事項があります。もう少し入出力ポートの
動作を詳しく見てみましょう。
(1) 電源投入時の誤動作対策
まず、入出力ポートは電源投入またはリセット直後はすべて入力モードとなります。
従って、出力ピンとして使う場合には、リセットした直後出力がハイインピーダンス状態
となりますから、接続されている相手がそのハイインピーダンス状態で不安定動作しない
ように対策しておく必要があります。
この対策としては、トランジスタの負荷のような時には、下図のように、使うピンを外部で
プルアップかプルダウンすることです。電源投入直後のハイインピーダンス状態を、この
対策でHighかLowかどちらかに一意的に決めることが出来ますから誤動作を避けることが
出来ます。
PICの出力ピンがハイインピーダンス
状態(つまり入力モード)の時には
抵抗10KΩがトランジスタのベースを
グランド電位とするので、トランジスタ
はOffの状態を維持し、負荷には何も
影響を与えません。
(2)連続出力命令による誤動作対策
次に実際の入出力が制御されるタイミングを詳しく見ると、入出力命令を繰り返し
実行する場合に、命令サイクルの細部で問題が起きることがあります。
まず、出力と入力の信号が出るタイミングを詳細にみると下図のようになります。
つまり、ポートへの出力は実際には命令実行の最後である次の命令の最初の
クロック(Q1)の立ち上りで出力されます。
そして、もし次の命令も入出力命令の時には、ポートの読み込みがQ2クロックの
立ち上りで行われます。
結果的に、この最初の命令の出力と次の命令の入力の間は1クロック分しか無い
ことになり、20MHzクロックの場合にはわずかに50nsecとなってしまいます。
この時、問題になるのは、BSF、BCFなどのビット操作の命令の場合で、この命令
の実際の動作は、一度ポートレジスタのすべてのビットの現在状態を読み込み、
指定ビットのみを変更して再度ポートレジスタに上書きするという操作を行います。
このように連続してビット操作命令を実行すると、図の下側のコメントのように、
前の方の出力は命令実行タイミングの最後で行われ、入力は次の命令の最初で
行われますので、出力ピンの負荷に何らかの容量性の要素があって信号の立ち
上りが遅いと、まだ前の命令による出力が完全に落ち着く前に次の命令で読み込
みを実行してしまうため、0を1と間違って読み込んでしまう可能性があります。
この対策としては、ビット操作命令で連続して同じポートに出力する場合には、
間にNOP命令など他の命令を最低1個挿入するようにします。
(3) 入出力ドライブ電流と最大消費電力
もう一つの問題は、ポートのドライブ能力の問題です。
ここで入出力ピンのドライブ能力を確認しておきましょう。データシートでは入出力ピン
のドライブ能力は下表となっています。
項 目
ドライブ能力
備 考
最大消費電力 1W
パッケージ当たり 最大電源供給電流 250mA
Vdd端子より供給 1ピン最大供給電流 25mA
Highの時 1ピン最大吸収電流 25mA
Lowの時 ポート最大供給電流 200mA
A,B,C各ポート毎
この表からわかることは、まず、1ピン当たりのドライブは最大25mAまで出来ますが、
同時にドライブできるのは、200mA/25mA=8ピン ということで、最大電流(25mA)の
負荷をドライブすると8ピン同時にドライブ可能ということになります。
しかもポート当りに200mAですから全ポートがドライブ可能ということになります。
しかし全体の消費電力からみると、5V電源とすれば、1W/5V=200mAとなって
しまいますから、同時にドライブできる最大は全体で8ピンまでということになります。
つまり複数のポートを最大ドライブで動かすことは出来ないことになります。
さらに入出力ポート以外の消費電力も少しありますから、8ピン全部を同時に最大
電流でドライブするというのは、ちょっと厳しい条件となってしまいます。
これらも含めて、入出力ピンの合計最大ドライブ電流が200mAを超えないように
注意する必要があります。