web-dev-qa-db-ja.com

PIC 18FのPORTとLATCHの違い

私はすでにデータシートとグーグルを読んでいますが、まだ理解できません。

私の場合、PIN INPUTモードのPIC18F26K20のRC6を設定します。

TRISCbits.TRISC6 = 1;

次に、PORTとLATCHで値を読み取りましたが、異なる値があります!

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

v1は私に0を与え、v2は1を与えます。

普通ですか?どの場合にPORTを使用し、どの場合にLATCHを使用する必要がありますか?

24
acemtp

ラッチは、値が書き込まれるoutputラッチです。ポートは実際のピンの電圧です。

それらが異なる場合があるいくつかの状況があります。私が最も頻繁に遭遇したのは、(偶然に)接地されたピンがある場合です。ラッチをハイに設定すると、ラッチはハイになりますが、ピンの電圧はまだほぼグラウンドなので、ポートはローになります。

説明したことにつながるもう1つの状況は、ポートピンが正しく構成されていない場合です。私(および私が働くすべての人)は、PICが期待どおりに動作しない理由を解明するために何時間も費やしました。セクションI/Oポート-> PORT?、TRIS ?、およびLAT?を確認してください。データシートに登録します。 Microchip wiki page で詳細情報を入手できます。これは、容量性負荷に接続されたピンに出力を書き込んだ直後に誤った値を読み取ることについて説明しています。

このwikiページでは次のことも説明しています。

ポートラッチレジスタの読み取りは出力ドライバの設定を返し、ポートレジスタの読み取りはピンで見られる論理レベルを返します。

また、18F14K50のI/Oポートセクションからの抜粋もあります(18Fシリーズの他の部分と同じであるはずです)。

各ポートには、その動作用に3つのレジスタがあります。これらのレジスタは次のとおりです。

  • TRISレジスタ(データ方向レジスタ)
  • PORTレジスタ(デバイスのピンのレベルを読み取ります)
  • LATレジスタ(出力ラッチ)

そのため、ほとんどの場合、ラッチに書き込み、ポートから読み取ります。

32
Mark Rushakoff

私は適応します 私の答え 電気工学から。

マニュアルの写真を使用してみましょう。

Generic I/O Port Operation

I/Oピンにビットを書き込むと、このビットはデータバスからデータレジスタに保存されます( D-FlipFlop )。このビットのTRISxが0の場合、データレジスタのQからのデータはI/Oピンにあります。 LATxまたはPORTxへの書き込みは同じです。以下の赤を参照してください。

Generic I/O Port Operation Write

一方、LATxからの読み取りは、PORTxからの読み取りとは異なります。

LATxから読み取るときは、データレジスタの内容を読み取ります( D-FlipFlop )。以下の緑色の写真を参照してください。

Generic I/O Port Operation Read LATx

PORTxから読み取る場合、実際のI/Oピン値を読み取っています。以下の青を参照してください。

Generic I/O Port Operation Read PORTx

PICはread-modify-writeを使用して操作を書き込みます。これは 問題 になる可能性があるため、このシャドウレジスタを使用して回避します。

16
Daniel Grillo

これはデータシートからの有用な要約です。

11.2.3 LATレジスタ
I/Oピンに関連付けられたLATxレジスタは、読み取り-変更-書き込み命令で発生する可能性のある問題を排除します。 LATxレジスタの読み取りは、I/Oピンの値ではなく、ポート出力ラッチに保持されている値を返します。 I/Oポートに関連付けられたLATレジスタの読み取り-変更-書き込み操作により、入力ピンの値がポートラッチに書き込まれる可能性が回避されます。 LATxレジスタへの書き込みは、PORTxレジスタへの書き込みと同じ効果があります。

PORTレジスタとLATレジスタの違いは、次のように要約できます。

  • PORTxレジスタへの書き込みは、データ値をポートラッチに書き込みます。
  • LATxレジスタへの書き込みは、データ値をポートラッチに書き込みます。
  • PORTxレジスタの読み取りは、I/Oピンのデータ値を読み取ります。
  • LATxレジスタの読み取りは、ポートラッチに保持されているデータ値を読み取ります。
10
blak3r

はい、PORTxとLATxを読んで、それらが異なる値を持っていることが時々あります。

一部の外部ハードウェアがピンをHighまたはLowに駆動しているかどうかを読み取るには、ピンを(TRISまたはDIRレジスタを使用して)入力モードに設定し、PORTxを読み取る必要があります。その読み取りは、ピンの実際の電圧が高いか低いかを示します。

ピンをハイまたはローに駆動する場合、ピンを出力に設定する必要があります(TRISまたはDIRレジスタを使用)。 LATxレジスタにビットを書き込む必要があります。

(そのビットをPORTxレジスタに書き込むと、seemが正しいことを行うことができます。そのピンは、最終的にはコマンドどおりにハイまたはローになります。そのポート上の他のピンがオープンコレクタバスに接続されている場合など、PORTxレジスタの1ビットへの書き込みがそのポート上の他のピンの状態を台無しにし、デバッグが困難な問題)。

開回路:書き込み前に読み取り

4
David Cary

私の推奨事項は、PORT値を読み取り専用と見なすことです。 LAT値は読み取りまたは書き込みが可能ですが、読み取られる値は、ピンの入力値ではなく、最後に書き込まれた値になります。

古いPICでは、LATx値は存在しませんでした。ポートに書き込む唯一の方法は、PORTxレジスタを使用することでした。奇妙なことに、一般的な機器(Microchip以前)時代からの非常に古いPICの一部はLATxをサポートしていましたが、MicrochipはPIC18xラインまでその機能を追加しませんでした。

3
supercat

LATx:を使用して、出力ピンに書き込みます。

PORTx:を使用して、入力ピンを読み取ります。

LATxレジスタを持つすべてのPICの場合、すべてのINPUTはPORTxからでなければならず、すべてのOUTPUTはLATxでなければなりません。これにより、単一のポートのビット。

1
Mike

私は最近、別のPORTx Rj(たとえばPORTC RC0)が既に設定されている場合、PIC18F14K50のPORTx Ri(たとえばPORTC RC1)への書き込みが無効になることを経験しました。 PORTx Riのオシロスコープでピークを観察しましたが、出力を維持できませんでした。この問題は、私がLATxで書いているとすぐに消えました。

LATxの書き込みはPIC18では必須に見え、PORTxの書き込みは禁止されています。

0
frva