2010-04-12 4 views
21

Ich habe schon das Datenblatt gelesen und google aber ich verstehe immer noch etwas nicht.Unterschied zwischen PORT und LATCH auf PIC 18F

In meinem Fall, habe ich PIN RC6 ein PIC18F26K20 in INPUT-Modus:

TRISCbits.TRISC6 = 1;

Dann lese ich den Wert mit PORT und LATCH und ich habe einen anderen Wert!

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

v1 gibt mir 0, wobei v2 1.

Ist gibt es normal? In diesem Fall müssen wir PORT verwenden und in diesem Fall LATCH?

Antwort

29

Der Latch ist der Ausgang Latch, auf die Werte geschrieben werden. Der Port ist die Spannung am eigentlichen Pin.

Es gibt einige Situationen, in denen sie unterschiedlich sein können. Der, den ich am häufigsten angetroffen habe, ist, wenn du einen Pin (versehentlich) kurzgeschlossen hast. Wenn Sie den Latch hoch setzen, wird der Latch hoch angezeigt, aber der Port wird niedrig gelesen, da die Spannung am Pin immer noch ungefähr Masse ist.

Eine andere Situation, die zu dem führt, was Sie beschrieben haben, ist, wenn der Port-Pin nicht korrekt konfiguriert wurde. Ich (und alle, mit denen ich zusammenarbeite) habe viele Stunden damit verbracht, herauszufinden, warum unser PIC nicht den Erwartungen entspricht, um schließlich herauszufinden, dass wir die analogen Module zum Beispiel abgeschalten haben. Stellen Sie sicher, dass Sie die Sektion I/O Ports -> PORT?, TRIS? Und LAT? registriert im Datenblatt. Sie können weitere Informationen in der Microchip wiki page erhalten, die erklärt, dass Sie den falschen Wert sofort lesen, nachdem Sie einen Ausgang auf einen Pin geschrieben haben, der an eine kapazitive Last angeschlossen ist.

Das Wiki-Seite auch erklärt:

Ein Lesen des Port Latchregisters gibt die Einstellungen der Ausgangstreiber, während ein Lesen des Port-Register gibt die Logikpegel an den Stiften gesehen.

Auch hier ist ein Ausschnitt aus der I/O-Ports Abschnitt auf der 18F14K50 (was sollte der gleiche wie der Rest der 18F-Serie sein):

Jeder Port verfügt über drei Register für seine Operation. Diese Register sind:

  • TRIS-Register (Datenrichtungsregister)
  • PORT-Register (liest die Werte auf die Stifte der Vorrichtung)
  • LAT-Register (Ausgangslatch)

In den meisten Fällen schreiben Sie in den Latch und lesen vom Port.

+0

Also, wenn die PIN im INPUT-Modus ist, was soll ich verwenden? VERRIEGELN oder PORT? Und wenn die PIN im OUPUT-Modus ist, was soll ich verwenden? VERRIEGELN oder PORT? – acemtp

+0

@acemtp: Antwort aktualisiert. –

10

Hier ist eine nützliche Zusammenfassung aus dem Datenblatt.

11.2.3 LAT Register
Die LATx mit einer I/O-Pin zugeordnet Register eliminiert die Probleme, die mit Read-Modify-Write-Anweisungen auftreten könnten. Ein Lesen des LATx-Registers gibt die Werte zurück, die in den Port- -Ausgangsverriegelungen anstelle der Werte an den I/O-Pins gehalten werden. Eine Lese-Modifizier-Schreib-Operation an dem LAT-Register , die einem I/O-Port zugeordnet ist, vermeidet die Möglichkeit, die Eingangspinwerte in die Port-Latches zu schreiben. Ein Schreiben in das LATx-Register hat die gleiche Wirkung wie ein Schreiben in das PORTx-Register.

  • Ein Schreib an den Port Verriegelung nach PORTx Register schreibt den Datenwert:

    Die Unterschiede zwischen dem Hafen und LAT Register können wie folgt zusammengefasst werden.

  • Ein Schreiben in das LATx -Register schreibt den Datenwert in den Port-Latch.
  • Ein Lesevorgang des PORTx -Registers liest den Datenwert auf dem I/O-Pin.
  • Ein Lesevorgang des LATx -Registers liest den in gehaltenen Datenwert des Port-Latchs.
+0

Danke für die Antwort. Ich lese das Datenblatt und diesen Teil, aber es beantwortet nicht die Frage: Wenn ich den Stift (Eingabemodus) lesen muss, sollte ich Latch oder Port verwenden und wenn ich den Pin schreiben (Ausgabemodus) sollte ich Benutzer Latch oder Hafen. – acemtp

3

Ja, es ist normal, PORTx und LATx zu lesen und gelegentlich finden sie unterschiedliche Werte.

Wenn Sie lesen möchten, ob eine externe Hardware einen Pin high oder low steuert, müssen Sie den Pin in den Eingabemodus (mit TRIS oder dem DIR-Register) setzen und PORTx lesen. Dieser Wert zeigt an, ob die tatsächliche Spannung am Pin hoch oder niedrig ist.

Wenn Sie einen Pin hoch oder niedrig steuern möchten, müssen Sie den Pin auf den Ausgang setzen (mit TRIS oder dem DIR-Register); Sie sollten das Bit in das LATx-Register schreiben.

(Schreiben, das Bit des PORTx Register kann scheint, das Richtige zu tun., Dass der Stift wird - schließlich - hoch oder niedrig gehen, wie befohlen, aber es gibt viele Fälle - wie wenn ein anderer Stift an diesem Port ist mit einem Open-Collector-Bus verbunden - das Schreiben auf ein Bit des PORTx-Registers wird den Zustand der anderen Pins an diesem Port durcheinander bringen, was zu schwierig zu debuggenden Problemen führt.

Open Circuits: read before write

3

Meine Empfehlung ist es, den PORT-Wert als schreibgeschützt zu betrachten. Die LAT-Werte können gelesen oder geschrieben werden, aber der gelesene Wert ist der letzte geschriebene Wert, nicht der Eingangswert des Pins.

Bei älteren PICs waren die LATx-Werte nicht vorhanden; Die einzige Möglichkeit, in einen Port zu schreiben, war über die PORTx-Register. Seltsamerweise unterstützten einige der wirklich alten PICs, zurück von den Tagen von General Instruments (Pre-Microchip), LATx, aber Microchip fügte dieses Feature erst in der PIC18x-Reihe hinzu.

10

Ich werde my answer aus der Elektrotechnik anpassen.

Lassen Sie uns das Bild von der manuellen verwenden:

Generic I/O Port Operation

Wenn Sie ein Bit in einem I/O-Pin schreiben, sind Sie dieses Bit von Datenbus zum Datenregister Speichern (D-FlipFlop). Wenn TRISx dieses Bits 0 ist, werden Daten von Q des Datenregisters in dem I/O-Pin sein. Schreiben in LATx oder PORTx ist das gleiche. Siehe unten in rot:

Generic I/O Port Operation Write

Auf der anderen Seite, von LATx lesen unterscheidet sich von PORTx lesen. Wenn Sie von LATx lesen, lesen Sie, was im Datenregister steht (D-FlipFlop). Siehe Bild unten in grün:

Generic I/O Port Operation Read LATx

Und wenn Sie von PORTx lesen, werden Sie den tatsächlichen I/O-Pin-Wert zu lesen. Siehe unten in Blau:

Generic I/O Port Operation Read PORTx

PIC verwendet Read-Modify-Write-Operationen zu schreiben und dies kann ein problem sein, so verwenden sie diese Schattenregister zu vermeiden.

0

Ich habe kürzlich erfahren, dass das Schreiben auf PORTx Ri (z. B. PORTC RC1) von PIC18F14K50 unwirksam ist, wenn ein anderer PORTx Rj (z. B. PORTC RC0) bereits gesetzt wurde. Ich habe einen Blick in das Oszilloskop auf PORTx Ri beobachtet, aber ich konnte die Ausgabe nicht aufrechterhalten. Dieses Problem ist verschwunden, sobald ich auf LATx schrieb.

LATx-Schreiben ist auf PIC18 obligatorisch und PORTx-Schreiben ist nicht zulässig.

Verwandte Themen