2022.10.5
前へ
次へ
ホームページトップへ戻る


PIC−USBIO using BASIC

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第68回]



●PICUSBIO−03(17)LATレジスタ

Timer0の説明の途中ですが今回はLATレジスタついて書くことにします。
LATレジスタはPIC18FでI/Oポートに追加されたレジスタです。
それ以前のPIC16Fなどにはありません。
PIC18F以前のPICのI/OポートはTRISレジスタとPORTレジスタだけでした。
下はPIC16F628AのData Sheetからのコピーです。

[出典]Microchip Technology Inc. PIC16F628A Data Sheet

右側にPORTAのビット0(RA0)のブロック図があります。
一番上にPORT出力ラッチがあってその下にTRISラッチがあって一番下にPORT入力バッファがあります。
そしてこの部分がPIC18Fでは下のように変わっています。
下はPIC18F14K50 Data Sheetからのコピーです。

[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet

PIC18F14K50にはPORTA、PORTB、PORTCの3つのI/Oポートがあります。
上では3つのI/Oポートについて共通する基本的な機能について説明をしています。
I/Oポートには次の3つのレジスタがあります。
TRISレジスタ(方向制御レジスタ)
PORTレジスタ(ピンの電圧レベルを読み込む)
LATレジスタ(出力ラッチ)

TRISレジスタはPIC18Fよりも前のPIC16Fなどと同じ使い方(方向制御レジスタ)です。
PORTレジスタのところが変わっています。
PIC16FなどではRD DATAもWR DATAも同じPORTレジスタに対して行なっていましたがPIC18FではPORTレジスタは主にRD DATAのためのレジスタになっています。
図ではWR LAT or Portと書かれていますからPIC16Fなどと同じようにWR DATAに対してもData Latchが使われます。
見たところ DATA出力については WR PORTとしてもWR LATとしても同じように見えます。
そしてRD Portのところもよく見るとTRISレジスタによってPortが出力に設定されているときはData Latchからの出力がREADされるようになっていますからその部分もPIC16Fなどと変わらないように見えます。
PIC16Fなどでは出力に設定したポートに対してREADを実行すると出力ラッチの内容が読み込まれます。
そこのところはPIC18Fも同じです。
PIC18FがPIC16Fなどと異なっているのは出力に設定したPORTに対してREAD PORTではなくてREAD LATを実行したときです。
その場合には信号ラインがI/O端子から切り離されてData Latchからの出力が直に読み込まれます。
出力に設定されているPORTに対してREAD PORTを実行するとInput Bufferを経由してData BufferとI/O端子がつながった状態の信号が読み込まれます(この動作はPIC16Fなどと同じです)。
READ LATとREAD PORTのどこが違うのかということなのですが、前者は外部端子の外側にある回路の影響を受けないのに対して後者はその影響をもろに受けてしまう点にあります。

わかりやすい例としてPORTCの8ビット全部が出力に設定されているとして、そのうちの特定の1ビット(前回のプログラム例ではRC5)のみを1または0にする場合を考えます。
PICのアセンブラ命令では
bsf PORTC,5
bcf PORTC,5
という命令になります。
命令の動作、意味から考えるとPORTCのビット5の出力だけを1または0にするという動作のようですが、実際の動作としてはビット5だけではなくて8ビットポートの全ビットが出力し直されます。
動作としては先にPORTCの全ビットを読み込んでそのうちのビット5のみを1または0に直したのちにもう一度全ビットを出力します。
この動作のことを”Read Modify Write”といいます。
普通はこの動作で何も問題はありません。
ところが上の例でRC5以外の出力端子に比較的大きなコンデンサがついているとか何か容量性の負荷がかかっているような場合に(仮にRC0に大きな容量の負荷がかかっているとします)、PORTCに対してデータ(たとえば00000000)を出力した直後に特定のビットを変化させる命令(たとえば上記のbsf PORTC,5)を実行すると出力ラインの容量負荷のためにまだRC0は0になりきっていないうちに”Read Modify Write”が実行されてしまうことになります。
その結果RC0が不安定な状態で読み込まれてしまいRC0は本来変化しないはずなのに1が出力されてしまう可能性があります。
このことは命令の実行速度と出力端子の状態が影響しますからたとえ出力端子に容量負荷がかかっていてもその容量が充電(または放電)されてしまうだけの十分な間隔をおいてビットセット、リセット命令が実行されれば上記のような問題は発生しません。
前回のプログラム例の場合USB経由(HID通信)でPORTにアクセスしていますからそのアクセス間隔は問題になるほど速くはありません。
前回の例でLATCの代わりにPORTCを使っても問題はありませんと書いたのはそういう理由からです。
PICUSBIO用のBASICインタプリタでは普通にPORTCを使っても全く大丈夫ですが前回は参考例としてLATCを使ったプログラムを紹介しました。

参考までに下はPIC18F14K50のData SheetのPORTC部分のコピーです。

[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet

最下行のRB<7:0>はRC<7:0>のミスプリントだと思います。

PIC−USBIO using BASIC[第68回]
2022.10.5upload

前へ
次へ
ホームページトップへ戻る