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
>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.
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.
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.
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.
@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
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:
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...
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 ...
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.
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.
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.
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...
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.
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...
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.
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".
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.
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.
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...