PICマイコンはいずれも入出力ピンを内蔵しており、汎用の入出力ピンとして
内蔵モジュール用のピンとして使われます。
注意が必要なことは、アナログ入力があるPICマイコンの場合には、
デフォルトがアナログ入力モード
になっていますので、デジタルモードで使う場合には、必ずANSELxレジスタで
デジタルピンと設定してから使う必要があることです。
【標準入出力回路構成】
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と変化する
ことになって区別がつきます。
【出力の時の動作】
発光ダイオードをPICで点灯制御するような出力制御の場合には、下図のように
接続します。
こうすると、出力が「1」の時には、トランジスタPがOn、NがOffとなるので、電流が
(1)の向きに流れようとします。しかし、発光ダイオードの反対側の端子は抵抗を
介して同じ電源Vssに接続されていて、同電位となるため、電流を流すことが
できなくなります、このため、発光ダイオードには電流が流れず消灯します。
逆に、出力が「0」の時には、トランジスタNがOn、PがOffとなるため、電流が(2)
の向きに流れようとします。このときには、電源Vddから抵抗と発光ダイオードを
経由して電流が流れることになりますので、発光ダイオードが点灯することに
なります。
このとき流れる電流は、(Vdd-発光ダイオードの順電圧)÷抵抗 で決定されます。
【プログラムによる制御方法】
入出力ピンに関連するレジスタは下図のようになります。結構たくさんのレジスタが関連
しています。(XはA、B、C、・・・です),
入出力ピンをデジタルモードで使う手順は次のようにします。
@ デジタルモードの設定 ANSELxレジスタ
A 入出力モードの設定 TRISxレジスタ
B プルアップの設定 WPUxレジスタ
デジタルの入出力の制御はレジスタへの書き込みを行うことで実現できます。
プログラムで入出力ポートに相当するレジスタに書き込めば、実際の出力が
出ることになります。例えば、C言語で書くと下記のようになります。
ANSELB = 0; //すべてデジタル
TRISB = 0; //全て出力モード
LATAB = 0x65; //01100101を出力する
入力の場合には下記のようになります。
ANSELB = 0; //すべてデジタル
ANSELC = 0;
TRISC = 0x0F; // RC0-RC3が入力
TRISB = 0; //ポートBすべて出力
if(PORTCbits.RC0 == 1) //Offの場合
LATBbits.LATB0 ^= 1; //ポートBの1ビット目反転
else
LATBbits.LATB1 ^= 1; //ポートBの2ビット目反転
【プルアップ】
PICの入出力ピンの中にはプルアップ抵抗を内蔵しているものがあります。
このプルアップを使うためには有効化する必要があります。
この手順は次のようにします。
@ WPUxレジスタでプルアップするピンを指定する
A OPTION_REGのWPUENビットを0にしてプルアップを有効化する
実際の記述例は下記のようになります。
ANSLEB = 0; //すべてデジタル
TRISB = 0x0F; // RB0-RB3を入力とする
WPUB = 0x0F; // RB0-RB3をプルアップする
OPTION_REGbits.nWPUEN = 0; //プルアップ有効化
【状態変化割り込みの使い方】
入力ポートの一部のピンは状態変化検出機能があり、立ち上がりまたは
立下りの変化があったときに割り込みを発生させることができます。
この機能に関連するレジスタは下図のようになります。xはA,B,C,・・・です。
このレジスタを使って状態変化割り込みを有効化する手順は次のようにします。
@ 検出するピンを指定する、立ち上がりか立下りか、両方かを指定する
IOCxPとIOCxNレジスタで指定します。
A 割り込みを許可する
INTCONレジスタのIOCIEビット、PEIEビット、GIEビットをセットする
B 割り込みフラグ(IOCF)で割り込みを確認する
実際の記述例は下記のようになります。
ANSELB = 0; //すべてデジタル
TRISB = 0x0F; //RB0-RB3を入力ピンにする
IOCBP = 0x0F; //立ち上がり検出有効化
IOCBN = 0x0F; //立下り検出有効化
INTCONbits.IOCIE = 1; //状態変化割り込み許可
INTCONbits.PEIE = 1; //周辺一括割り込み許可
INTCONbits.GIE = 1; //全体割り込み許可
【ピン切り替え設定】
F1ファミリの中には特定のピンの機能を割り付けで変更できるものがあります。
この変更はレジスタ設定で行います。関連するレジスタは下記となります。
このレジスタから、汎用入出力ピンとして使えるピンがモジュールのピンを
切り替えると変わってしまいますから注意が必要です。