【入出力ピンの強化ポイント】
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か1output_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かFALSEPORT Bのプルアップ抵抗を接続する(TRUE)/しない(FALSE)
《プログラム例》
C言語の場合の入出力モードの設定は、Cコンパイラが自動的に追加して
くれますので、明確に記述追加する必要はありません。