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.
Das PORT Register ist das Input Data Register Das LATCH Register ist das Output Data Register
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
@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:
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
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.
Aha, ja, ich denke ich habe es halbwegs verstanden. Danke euch für eure hilfe.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.