PIC18Fxxxxの入出力ピンの使い方


【入出力ピンの強化ポイント】

 PIC18Fxxxxシリーズになって、入出力ピンの構造に強化が加えられています。
その強化ポイントは下記のようになっています。

(1) ビット操作命令を連続で使っても誤動作しないように、LATxレジスタを追加した。

(2) クロックのピンOSC1、OSC2を汎用の入出力ピンRA7、RA6として使えるようにした。

(3) RB3ピンがCCP2のサブ出力ピンとしても使えるようにした。

(4) PORTBがアナログ入力もできるように拡張された。

(5) PORTC、PORTDに拡張PWMの出力が追加された。
 

【LATxレジスタの追加】

 これはもともとあった出力ラッチをレジスタとして読めるようにして、ビット操作命令
のときの事前読み出しを、直接入出力ピンから入力しないで、この出力ラッチからと
することにより、外部回路の影響を無くしました。
これで、連続でビット操作命令を繰り返しても、出力が誤動作することはなくなりました。
全ポートが修正追加されています。

 この出力ラッチレジスタは、もともとあったData Latchレジスタに、読み込み用のゲート
を追加して、「LATx」レジスタとして各ポート毎に読み込みができるようにしたものです。
これを図で表すと、例えばPORT Aは下図のブロック図となり、もともとのData Latchに
付属する入力用ゲートが追加されています。


この一番上にあるゲートが追加
されたゲートでLATAとして内容
を読み出すことができるように
した。


(注)リセット後のデフォルトでは
 PORTA、PORTEはアナログ入力
 モードとなっています。
 従って、ディジタル入出力で使う
 時には、ディジタルモードに変更
 する必要があります。

 PORTBをアナログ入力にするには
 CONFIG3HのPBADENビットの設定
 が必要です。


このLATxレジスタの追加によりポートへの出力の仕方が追加になります。

(1) 入出力ピンへの出力
  PIC18シリーズになって、入出力ピンへの出力方法は2種類となりました。
  PORTつまり入出力ピンへの出力は、これまでと同じで、Data Latchレジスタ
  への出力となります。
  この出力が実際に入出力ピンに反映されるかどうかは、TRISxレジスタの
  入出力モードに依存します。
  
  別に追加された方法で、LATxレジスタを指定して出力すると、PORTへの出力と
  全く同じように動作します。
  それが外に出るかどうかは、やはりTRISxレジスタが出力モードになっていれば
  出力されます。
  アセンブラ命令では下記のようになり、全く同じ動作をします。

    MOVWF  PORTB   ;LATBレジスタに書き込まれる

    MOVWF  LATB   ;LATBレジスタに書き込まれる


(2) 入出力ポートからの入力
  PIC18シリーズになって、入出力ポートからの入力の方法も2種類となりました。
  ひとつは、従来と同じようにPORTxレジスタからの直接読み込みで、これは実際
  のピンの状態を直接入力します。
  もうひとつの入力は、LATxレジスタからの入力で、これは、実際のピンの状態に
  かかわらず、Data Latchの現在状態を入力します。
  アセンブラ命令では下記のようになります。

    MOVF  PORTB,W  ;実際の入出力ピンの状態読み込み

    MOVF  LATB,W   ;Data Latchの読み込み

(3) ビット操作命令の連続実行
  ビット操作命令は、一度現在状態を読込んでから、指定ビットのみ変更して
  書き戻すという処理をしています。PIC16シリーズではこの最初に読込む時、
  直接ピンの状態を読込んでいたため、容量性負荷の場合には、誤入力をする
  ことがあり、連続実行はしない方が良いとされていました。
  しかし、PIC18シリーズでは、ビット操作命令をPORTレジスタでは無く、LATxレジ
  スタから行うことで、現在状態をLATxレジスタから読込みます。従ってこの時には
  外部負荷の影響を受けることは無い為、連続実行も全く問題無く出来ます。

    BSF  LATB,5  
    BSF  LATB,7
    BCF  TRISB,1

【OSC1、OSC2を汎用の入出力ピンに】

 クロック発振用のピンにはOSC1とOSC2の2ピンが用意されていますが、クロック
発振モードによってはOSC1,OSC2を使いません。
そこでこの空いたピンを汎用入出力ピンとして使えるようにして自由度を上げました。
クロックの発振モードで下記2つの場合には、OSC1,OSC2ピンは汎用の入出力ピンと
なります。

   ECIO :外部クロックモード →  OSC2がRA6となる
   RCIO :外部RC発振モード →  OSC2がRA6となる
   INTIO1:内部発振モード   →  OSC1がRA7となる
   INTIO2:内部発振モード   →  OSC1がRA7に、OSC2がRA6になる

【RB3ピンをCCP2出力にも切り替えられる】

 CCP2の出力ピンは通常はRC1ピンとなっていますが、これをコンフィギュレーション
ビットの、CCP2MXビットをイネーブルとすることでRB3に変更することが出来ます。
これで、タイマー1の発振素子用にRC1/T1OSI/CCP2ピンを使っても、CCP2をRB3で
使うことでタイマ1とCCP2を同時に使うことができます。
また、ポートC側を有効に使いたい時にも、CCP2をポートBで扱うことが可能となり
ます。

【ポートBにアナログ入力を拡張】

ポートBのRB0-RB4に対して、アナログ入力機能が追加され、AN8−AN12のチャネル
として使うことができます。
これで大幅にアナログ入力のチャネルが拡張されました。
このポートBをアナログ入力にするためには、コンフィギュレーションでCONFIG3Hの
PBADENビットをセットする必要があります。さらにADCON1でアナログ入力にする
ことが必要です。

【拡張PWMの機能追加】

CCPのPWM機能が強化拡張され、直接Hブリッジのトランジスタの制御ができるピン
ができました。
これをポートCとポートDに拡張しました。

ピン 名称 機  能
RC2 P1A Half BridgeまたはFull Bridge
の時に、PWM信号が出力され
正転、逆転の制御と速度制御
が可能なフルブリッジドライバを
直接制御できる。
RD5 P1B
RD6 P1C
RD7 P1D

【アセンブラ使用例】

アセンブラで入出力を行う際に使う命令は下表のようなものがあります。

命令 書  式 使用例と機能
MOVWF  MOVWF f,a
  f:レジスタアドレス
  a:アクセスバンク指定(0か1)
Wレジスタの内容をファイルレジスタfに
コピーする。aが0ならアクセスバンク。
fにPORTxを指定すると出力する。

fにTRISxを指定するとモード設定となる。
MOVFF  MOVFF fs,fd
  fs:コピー元レジスタアドレス
  fd:コピー先レジスタアドレス
fsレジスタからfdレジスタにコピー。
fdにPORTxを指定すると出力する。

fsにPORTxを指定すると入力になる。
BCF  BCF f,b,a
  f:レジスタアドレス
  b:ビットアドレス
  a:アクセスバンク指定
fレジスタのbビット目を0にする。
fにPORTxを指定すれば1ビットの
出力となる。
BSF  BSF f,b,a
  f:レジスタアドレス
  b:ビットアドレス
  a:アクセスバンク指定
fレジスタのbビット目を1にする。
fにPORTxを指定すれば1ビットの
出力となる。
BTG  BTG f,d,a
  f:レジスタアドレス
  d:格納先(0か1)
  a:アクセスバンク指定
fレジスタのbビット目の0,1を反転する。
fにPORTxを指定すれば1ビットの
出力となる。
MOVF  MOVF f,d,a
  f:レジスタアドレス
  d:格納先
  a:アクセスバンク指定
d=0なら、fレジスタからWレジスタに
コピーする。
fにPORTxを指定すれば8ビットの入力
となる
BTFSS  BTFSS f,b,a
  f:レジスタアドレス
  b:ビットアドレス
  a:アクセスバンク指定
fレジスタのbビット目が1なら
次の命令をスキップする。
fにPORTxを指定すれば1ビットの入力
となる。
BTFSC  BTFSC f,b,a
  f:レジスタアドレス
  b:ビットアドレス
  a:アクセスバンク指定
fレジスタのbビット目が0なら
次の命令をスキップする。
fにPORTxを指定すれば1ビットの入力
となる。


《プログラム例》
実際にアセンブラで入出力を行った例です。
各ポートの入出力を行う前に、入出力のモード設定をしておく必要があります。
特に、PORTAとPORTEは、デフォルトのモードがアナログ入力モードになって
いるので、ディジタル入出力を行うためには、ADCON1レジスタでディジタル
モードにしてから、TRISレジスタで入出力モードを設定する必要があります。


下記は単純にディスクリートのPORTAにある4個の発光ダイオードを点滅させる
プログラムです。PORTBのRB0の入力の0,1により点滅の方法が変わります。

まずコンフィギュレーションの設定と変数定義、メイン部分です。コンフィギュレーション
のレジスタがたくさんあるので、この部分が結構長くなりますが、毎回ほとんど同じ
なのでコピーして使います。
短いプログラムの場合には、ジャンプ命令に、BRAやRCALLを使うと、1ワード命令
なのでプログラムサイズを小さくすることができます。
ただし、現在地±1Kワードの範囲しかジャンプできないので注意が必要です。





次はループタイマのサブルーチン部です。




上記プログラムのソースファイルは下記でダウンロードできます。
単なるテキストファイルですので、そのままお使いください。

  ★ 標準入出力サンプルプログラム(stdio01.asm)


【CCSのC言語での入出力】

CCSのPCHでの入出力関数は下表のようになっています。

関数名 書式とパラメータ 使用例と機能
set_tris_x() set_tris_x(value)
 valueは8ビットのint
 xはa,b,c,d,eのいずれか

set_tris_b(0x0F);
 TRISxレジスタにvalueの値を設定する
 各ビットが各ピンに対応する

  0:出力モード  1:入力モード

output_low()

output_low(pin)
 pinは標準ヘッダファイルで定義された記号

output_low(PIN_A0);
 指定された出力ピンをLow出力にする

output_high()

output_high(pin)
 pinは標準ヘッダファイルで定義された記号

output_high(PIN_B1);
 指定された出力ピンをHigh出力にする

output_float()

output_float(pin)
 pinは標準ヘッダファイルで定義された記号

output_float(PIN_A0);
 指定ピンを入力モードにする

output_bit()

output_bit(pin, value)
 
pinは標準ヘッダファイルで定義された記号
 valueは0か1

output_bit(PIN_A0,1);
 指定ピンに0か1を出力する

output_x()

output_x(value)
 valueは8ビットのint
 xはa,b,c,d,eのいずれか

output_b(0xF0);
 指定ポートに指定データを出力する
 8ビットの同時出力が可能

input()

value = input(pin)
 valueはint
 pinは標準ヘッダファイルで定義された記号

if (input(PIN_A0)){
 指定したピンを入力 Lowなら0(FALSE) Highなら1(TRUE)を返す

input_x()

value = input_x()
 valueはint型
 xはa,b,c,d,eのいずれか

data = input_b();
 指定ポートから8ビットを同時に読み込みint型で返す

port_b_pullups()

port_b_pullups(value)
 valueはTRUEかFALSE

PORT Bのプルアップ抵抗を接続する(TRUE)/しない(FALSE)


《プログラム例》
 C言語の場合の入出力モードの設定は、Cコンパイラが自動的に追加して
 くれますので、明確に記述追加する必要はありません。








  トップページへ