Forum: Mikrocontroller und Digitale Elektronik was ist ein port latch


von Sascha (Gast)


Lesenswert?

Hi,
Was ist ein port latch? Die Frage kam mir auf, als ich die Register für 
Pins bei einem dspic30f4012 beschreiben wollte. Dort gibt es einen 
Unterschied zwischen PORT-Register und LAT-Register.

Auszug aus Datenblatt:

The differences between the PORT and LAT registers can be summarized as 
follows:
• A write to the PORTx register writes the data value to the port latch.
• A write to the LATx register writes the data value to the port latch.
• A read of the PORTx register reads the data value on the I/O pin.
• A read of the LATx register reads the data value held in the port 
latch.

Also beim schreiben sehe ich keinen Unterschied. beim lesen ja.
- data value on the I/O pin: ist ja wahrscheinlihc der zustand des pins 
(also high oder low)
aber was ist port latch? dort wird ja ein wert gehalten. welcher wert 
ist das denn? und wie kommt der dahin?

Sascha

von spontan (Gast)


Lesenswert?

>aber was ist port latch? dort wird ja ein wert gehalten. welcher wert
>ist das denn? und wie kommt der dahin?

Vielleicht so?

>• A write to the LATx register writes the data value to the port latch.

von Sascha (Gast)


Lesenswert?

Aber wird der pin dann beim beschreiben auch high bzw. low? muss ja, da 
es beim port auch so ist.
Dann verstehe ich den unterschied zwischen port und latch nicht so 
wirklich.

von g a s t (Gast)


Lesenswert?

Ist wohl nicht die korrekte Beschreibung, aber zumindest für das 
Verständnis sollte sie reichen:

Das PORTx Register ist sozusagen der Pin an deinem IC.
Mit dem Latch (einer Art Zwischenspeicher) kannst du dem PORT einen Wert 
zuweisen.

Du hast einen Eingang:
Lesen des PORT-Registers tut genau das, was du willst. Nämlich den Wert 
an dem Pin auslesen.
Ein Lesen des Latches gibt dir den Wert zurück der dem PORT einmal 
zugewiesen wurde.

Schreiben:
Der IO-Pin kann den Wert natürlich nicht direkt Speichern. Das Register 
ist quasi eine Art Mapping auf den HW Pin. Also musst du den Wert an 
eine Stelle schreiben, die ihn speichern und dem HW-Pin zuweisen kann. 
Also in das Latch (den Zwischenspeicher). Hättest du kein Latch müsste 
dein Programm dem PORT jeden Takt den Wert neu zuweisen.

So habe ich mir das mal vorgestellt.

Mit etwas mehr Zeit und einem Datenblatt kann man bestimmt noch eine 
genauere (korrektere) Beschreibung machen.

von Little B. (lil-b)


Lesenswert?

Das PORT Register ist das Input Data Register
Das LATCH Register ist das Output Data Register

von Stefan F. (Gast)


Lesenswert?

Ein Latch ist ein D-Flipflop.

von Volker S. (vloki)


Lesenswert?

Wie oben schon beschrieben enthält (speichert) das LATCH den Zustand der 
am Pin anliegen soll, wenn dieser als Ausgang konfiguriert ist.
-> FIGURE 8-1: BLOCK DIAGRAM OF A DEDICATED PORT STRUCTURE

Bei manchen Controllern kann man dieses LATCH auch lesen, bei anderen 
nicht.

Die Lesemöglichkeit für das Latch kann helfen den R-M-W 
(read-modify-write) Effekt in den Griff zu bekommen.

Beim R-M-W handelt es sich um folgendes Phänomen:
Stellen wir uns vor, zwei Pins an einem Port sollen in aufeinander 
folgenden Befehlen getoggelt werden.
Um den ersten Pin zu toggeln wird der Port gelesen, das Bit für den Pin 
getoggelt und das Ergebnis an den PORT (LATCH) zurück geschrieben. Alles 
gut ;-)
Folgt jetzt der zweite Befehl sehr schnell und ist der Level am Pin 
aufgrund irgendwelcher Umstände (kapazitive Last ...) noch nicht auf dem 
neuen Level, dann wird dieser "falsch" eingelesen.
Das toggeln des zweiten Pins im zweiten Befehl funktioniert wieder wie 
gewünscht, aber das toggeln des ersten wird bei Rückschreiben quasi 
wieder rückgängig gemacht.
Es sieht dann möglicherweise so aus als wäre der erste Befehl nie 
ausgeführt worden.
Wenn man anstatt des PORTS das LATCH liest (indem die Zustände stehen 
die man an den Ausgangspins haben will) dann kann das nicht passieren.

: Bearbeitet durch User
von Ottmar K. (wil1)


Lesenswert?

@Sascha

Ich zitiere: 
[http://www.sprut.de/electronic/pic/fallen/fallen.html#inout]

"Beim anfänglichen Lesen des Ports liest der Prozessor nicht etwa das 
Portregister (z.B. PORTA oder PORTB) aus, sondern liest die momentanen 
Pegel an den Pins des Ports ein. Bei Pins, die auf Output eingestellt 
sind macht das keinen Unterschied, wohl aber für Port-Pins, die auf 
Input eingestellt sind. Deren Bits im Port-Register können dadurch 
unbeabsichtigter Weise verändert werden. Nach dem Umschalten auf Output, 
haben diese Pins dann einen anderen Pegel als beabsichtigt."

Das Latchregister enthält jedoch den tatsächlich programmierten Wert 
(High/Low).

mfG Ottmar

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefan Us schrieb:
> Ein Latch ist ein D-Flipflop.
Naja, das möchte ich aber dringend bezweifeln.
Aber ich würde auch sagen, dass der Begriff "LATCH" im hier durchgängig 
falsch verwendet wird. Ein D-Flipflop ist flankengesteuert. Ein Latch 
ist pegelgesteuert. Das ist ein signifikanter Unterschied!

Zurück zum Thema. Ein IO-Port ist üblicherweise so aufgebaut:
1
 Pin  <-------------------------------------------------.
2
 Register <-------------------.       __________        |
3
                 ______       |      | Tristate |       |
4
 Dout >---------|D    Q|------o------| Buffer   |-------o------- Pin
5
 Sysclk >-------|>     |             |__________|
6
 WriteEnable >--|WE____|                  |
7
                                          |
8
 HiZ >------------------------------------'
Es kann also nur das Register (=LATCH) beschrieben werden. Und danach 
kann der Zustand des Registers oder der des Pins zurückgelesen werden. 
Denn der Pin könnte ja abhängig vom Tristate-Signal ein Eingang sein...

: Bearbeitet durch Moderator
von Volker S. (vloki)


Lesenswert?

Ottmar K. schrieb:
> Bei Pins, die auf Output eingestellt
> sind macht das keinen Unterschied, wohl aber für Port-Pins, die auf
> Input eingestellt sind.

Wenn die Pins auf Input gestellt sind* dann ist der Inhalt des 
zugehörigen LATCHbits doch völlig bedeutungslos. (Es wäre egal ob er 
sich ändert)


* und das sich auch nicht ändert (immer Input bleibt)
und das Bit der LATCH-Speicherstelle nicht aus irgendwelchen
Gründen für irgendwas ganz anderes verwendet wird ...

von Peter D. (peda)


Lesenswert?

Auch bei Bitbefehlen wird immer das ganze Byte gelesen, das Bit geändert 
und das Byte zurück geschrieben.
Dabei kann es passieren, daß gerade als Eingang geschaltete Pins 
ungewollt umschalten. Setzt man sie dann später auf Ausgang, ist das 
Malheur da.
Um das zu vermeiden, macht man die Bitbefehle auf das Latch, 
unbeeinflußt vom gerade außen anliegenden Pegel.

von Sascha (Gast)


Lesenswert?

Aha,
ja, ich denke ich habe es halbwegs verstanden. Danke euch für eure 
hilfe.

von DJ T. (Gast)


Lesenswert?

Man könnte dazu neigen, sich einen I/O-Pin so vorzustellen:
- Man stellt ein, ob es ein Eingang oder ein Ausgang ist
- Wenn es ein Ausgang ist, kann man den Pin beschreiben.
- Wenn es ein Eingang ist, kann man den Pin auslesen.


In der Realität ist es aber etwas anders (wie man an Lothars Bild 
sieht):
- Das Portlatch ist ein Speicherglied. Dies kann man grundsätzlich immer 
schreiben und lesen.
- Den tatsächlichen Zustand des Pins kann man grundsätzlich immer lesen.
- Der Inhalt des Portlatches und der tatsächliche Zustnd des Pins müssen 
nicht zwangsläufig übereinstimmen.
- Der Konfiguration Ausgangstreiber bestimmt, ob er den Pin aktiv treibt 
(gemäß desInhalt des Portlatches) oder ob das Portlatch abgekoppelt ist.

Dadurch kann man tolle Dinge machen, z.B.
- Überprüfen, ob ein Ausgangspin tatsächlich den vorgegebenen Zustand 
annimmt
- einen Open-Collector-Ausgang realisieren (I2C-Bus)
- einen bidirektionalen Pin haben (I2C-Bus)
etc.

von Volker S. (vloki)


Lesenswert?

DJ Tobsen schrieb:
> - Das Portlatch ist ein Speicherglied. Dies kann man grundsätzlich immer
> schreiben und lesen.

Nö, lesen kann man es nicht bei jedem Controller.

von DJ T. (Gast)


Lesenswert?

Volker SchK schrieb:
> Nö, lesen kann man es nicht bei jedem Controller.
Nämlich?

von Volker S. (vloki)


Lesenswert?

ALLE älteren 8bit PICs kleiner PIC18.

z.B. PIC16Fxxx (mit weniger als vier Stellen am Ende)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

DJ Tobsen schrieb:
> Das Portlatch ist ein Speicherglied.
Und schon lange kein richtiges "Latch" mehr, sondern seit Ende des 
letzten Jahrtausends schon immer ein D-Flipflop. Aus diesem Grund 
schreiben halbwegs vernünftige Datenblattschreiber dann auch 
"Portregister" ins Datenblatt...

von Dieter Werner (Gast)


Lesenswert?

Nun dann schau dir mal einen 8051 an, der kann Pin und Latch nicht 
getrennt ansprechen.
Da liest man immer den Pin und um die R-M-W Problematik zu umgehen muss 
man die Ausgabedaten in einer RAM Zelle zwischenspeichern.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dieter Werner schrieb:
> Nun dann schau dir mal einen 8051 an, der kann Pin und Latch nicht
> getrennt ansprechen.
Der kann aber auch keine '1' ausgeben.
Eine '1' ist da nur ein Pullup, deshalb kennt der 8051 auch Pin 
Datenrichtungsregister. Ja, damals(tm) hat man schon noch so vor sich 
hingemurkst...

von Dieter Werner (Gast)


Lesenswert?

Lothar Miller schrieb:
> Der kann aber auch keine '1' ausgeben.

Im Prinzip schon, das macht er aber nur einen Taktzyklus lang (oder so 
ähnlich). Danach schaltet er auf den "weak" pullup.

von Peter D. (peda)


Lesenswert?

Dieter Werner schrieb:
> Nun dann schau dir mal einen 8051 an, der kann Pin und Latch nicht
> getrennt ansprechen.
> Da liest man immer den Pin und um die R-M-W Problematik zu umgehen muss
> man die Ausgabedaten in einer RAM Zelle zwischenspeichern.

Nö.
Die RMW-Befehle lesen immer das Latch (CLR, SETB, ANL, ORL, XRL, JBC).
Es gibt keine "R-M-W Problematik".

von Peter D. (peda)


Lesenswert?

Lothar Miller schrieb:
> Eine '1' ist da nur ein Pullup, deshalb kennt der 8051 auch Pin
> Datenrichtungsregister. Ja, damals(tm) hat man schon noch so vor sich
> hingemurkst...

Ich fand das sehr elegant. I2C oder 1-Wire wurden dadurch sehr einfach.
Durch den strong pullup bei der 0->1-Flanke war er auch nicht 
störempfindlicher, als andere MCs.

von DJ T. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Der kann aber auch keine '1' ausgeben.
> Eine '1' ist da nur ein Pullup, deshalb kennt der 8051 auch Pin
> Datenrichtungsregister. Ja, damals(tm) hat man schon noch so vor sich
> hingemurkst...

Weshalb man damals(tm) ja auch immer gegen Masse geschaltet hat. 
Interessanterweise bin ich diese Angewohnheit bis heute nicht 
losgeworden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

DJ Tobsen schrieb:
> Interessanterweise bin ich diese Angewohnheit bis heute nicht
> losgeworden.
Viele Enable-Signale an ICs wie z.B. WRn, OEn, CSn usf. und sind noch 
solche Altlasten aus der TTL-Zeit. Auch die AVRs tragen mit ihren 
Pullups noch eine kleine Huldigung der negativen Logik in sich.

Peter Dannegger schrieb:
> Ich fand das sehr elegant.
Klar, was man hat hat man. Ich habe auch Tricks damit gemacht.
> I2C oder 1-Wire wurden dadurch sehr einfach.
Heute nehme ich den einen oder 2 Pins lieber extra in die Hand und habe 
dafür an den restlichen Ports eine definierte '1' wenns drauf ankommt...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.