Verstehen, wie PIC GPIO funktioniert

Ich versuche ein bisschen zu verstehen, wie der IO-Pin funktioniert. Als Beispiel habe ich diesen PIC genommen . Das Bild der IO-Pins sieht so aus:

Geben Sie hier die Bildbeschreibung ein

Was bedeutet das Symbol in Gelb? Bedeutet dies, dass Q den Wert von D nur bei fallender Taktflanke annimmt?

Ich glaube, ich verstehe, wie die rote Verbindung funktioniert. wenn D = 1, dann haben wir, nachdem D zu Q übertragen wurde, Q = 1, also Q' = 0 (Q' ist Q-Bar, es ist einfacher zu schreiben). Beim Push-Pull ist das Gate des P-MOS also 0 und das Gate des N-MOS ist 0, also haben wir VDD am I / O-Pin. Wenn D = 0, Q = 0, also Q' = 1 und das Gate des P-MOS und N-MOS 1 sind, haben sie VSS am I / O-Pin. Ich habe auch mehr oder weniger verstanden, wie der untere Teil (für die Eingabe) funktioniert. Aber es gibt viele Dinge, die ich nicht verstehe:

Was ist der Zweck der blauen Verbindungen?

Was genau ist der Datenbus? Ich dachte, die Daten wurden in das LATA-Register geschrieben und in das PORTA-Register rot.

Wie genau legen die D-Latches die richtigen Werte an den E/A-Port?

Antworten (2)

Was bedeutet das Symbol in Gelb? Bedeutet dies, dass Q den Wert von D nur bei fallender Taktflanke annimmt?

Angesichts Ihrer Fragestellung denke ich nicht, dass es darauf ankommt.

Die Taktsignale sind in diesem Datenblatt nicht speziell definiert, obwohl Sie daraus schließen können, dass sie von der internen Systemuhr abgeleitet sind, die die CPU-Zustandsmaschine antreibt. Sie zeigen eine fallende Flanke, die Ihnen nicht viel sagt, außer dass sie wahrscheinlich durch eine niedrige Flanke ausgelöst wird, aber ich denke, Sie können dieses Detail beim Schreiben von Code einfach ignorieren.

(Ich habe immer festgestellt, dass diese Diagramme genauer sind als der Text. Wenn Text und Diagramme nicht übereinstimmen (und manchmal nicht übereinstimmen), dann war das Diagramm (meiner Erfahrung nach) immer korrekt und der Text war falsch. Also ich glaube wirklich, dass sie dazu neigen, die Diagramme genau zu halten.)

Wenn Sie die Pins des externen Ports mit einem Oszilloskop untersuchen und auch die Taktflanken beobachten (wenn Sie einen Pin-Modus auswählen, der es Ihnen ermöglicht, sie zu sehen), können Sie diese Flanke möglicherweise mit dem in Verbindung bringen, was Sie auf dem Oszilloskop sehen. Und das kann für Sie wichtig sein, wenn Sie mehr über die Phasenverzögerungen der I/O-Pin-Ausgangsphasen im Verhältnis zu den Taktzyklen wissen möchten.

Was genau ist der Datenbus?

Es ist ein interner Bus innerhalb der CPU. Interne Busse erhalten Namen wie RBUS oder QBUS. Sie bedeuten etwas für einen Designer. In Ihrem Fall können Sie einfach davon ausgehen, dass es sich um einen 8-Bit breiten Datenbus handelt, der an der fallenden Flanke der CLK-Eingänge gültig ist, die Sie mit Ihrem gelb markierten Symbol für "niedrige Flanke" sehen.

Angenommen, Sie haben eine Anweisung, die in PORTA oder PORTB oder PORTC usw. schreibt. Keine bitmodifizierende Anweisung, sondern eine, die nur einen ganzen 8-Bit-Wert an einen Port schreibt. Dann werden diese Daten auf den Datenbus gelegt und dann wird entweder WR LATA, WR LATB oder WR LATC ebenfalls aktiv, indem HI auf LO getrieben wird, um den Wert in dem entsprechenden Port-Latch zwischenzuspeichern.

Das Diagramm zeigt Ihnen nur eines der Datenbits des Datenbusses. Sie sollten geistig verstehen, dass dieses Diagramm 8 Mal gilt – einmal für jeden gültigen PORTA-Pin. (Das Gleiche würde auch für PORTB usw. gelten.) Es gibt also 8 dieser D-Flops für jeden Port. Und nur eine der WR LAT*-Leitungen wird aktiviert (indem Sie auf LO gehen), abhängig von Ihrer Befehlsdecodierung, wenn Sie einen Wert schreiben.

Notiere dass der Q wird über einen Tristate-Puffer zu diesem Datenbus zurückgeführt. Wenn also der Prozessor den Wert lesen möchte, der zuletzt in diesen Port-Latch geschrieben wurde (insgesamt 8 Bit, aber wie ich bereits darauf hingewiesen habe, sieht man hier nur eines der D-Flops und nicht alle), dann aktiviert er das NICHT WR LATA-Linie, überhaupt. Stattdessen lässt es WR LATA inaktiv und aktiviert stattdessen RD LATA, was den Tri-State-Puffer aktiviert, der dann den Datenbus mit dem Wert von den 8 D-Flops für PORTA treibt. Auf diese Weise kann der Prozessor den Latch lesen, anstatt darauf zu schreiben.

Wie genau legen die D-Latches die richtigen Werte an den E/A-Port?

Es gibt vier Fälle, die sich aus den vier möglichen Kombinationen dieser beiden D-Flops ergeben:

D A T A P M Ö S T R ICH S 0 1 0 Ö F F Ö F F 1 Ö N Ö F F N M Ö S T R ICH S 0 1 0 Ö N Ö F F 1 Ö F F Ö F F

Die obige Tabelle wurde entwickelt, indem die ODER- und UND-Gatter untersucht wurden, die die PMOS und NMOS ansteuern, die Sie in der Nähe des E / A-Pin-Pads sehen. (Der PMOS ist aktiv, wenn sein Gate LOW ist. Der NMOS ist aktiv, wenn sein Gate HIGH ist.)

Wie Sie jetzt leicht sehen können, sind sowohl PMOS als auch NMOS mit deaktiviert T R ICH S = 1 , unabhängig vom Wert des zwischengespeicherten Datenbits. Dies muss der Fall sein, wenn der Pin als Eingang fungieren soll. Andernfalls würde einer der PMOS- oder NMOS-Transistoren den Ausgangspin ansteuern, und dies würde die Verwendung des Pins als Eingang völlig durcheinander bringen.

Wenn sowohl der PMOS- als auch der NMOS-Transistor ausgeschaltet sind, ist es jetzt möglich, den Pin entweder als Daten (über den "TTL-Eingangspuffer") oder als analog zu lesen, den TTL-Eingangspuffer zu umgehen und direkt zu einem ADC-Eingang oder LVD-Modul zu gehen.

Außerdem können Sie jetzt sehen, ob T R ICH S = 0 dann wird der eine oder andere der PMOS- oder NMOS-Transistoren aktiv sein, abhängig vom Wert des zwischengespeicherten Datenbits. Wenn die Daten "0" sind, dann ist der NMOS aktiv. Wenn die Daten "1" sind, dann ist das PMOS aktiv.

In keinem Fall werden PMOS und NMOS gleichzeitig aktiv sein.

Um Ihre Frage zu den blauen Verbindungen zuerst zu beantworten, enthält das TRIS-Register eine „1“ für den TRI-Status des Ausgangs (weder der P- noch der N-Kanal-Transistor ist eingeschaltet). Damit beide ausgeschaltet sind, benötigt das P-Kanal-Gatter eine 1 und das N-Kanal-Gatter eine 0. Die Logik der UND- und ODER-Gatter bestimmt, dass diese Bedingung besteht, wenn das TRIS-Flip-Flop 1 ist. Wenn es 0 ist, spiegeln die Gates beide den /Q-Ausgang des Datenregisters (des oberen Flipflops) wider - da die Transistoren einen Inverter bilden, bedeutet dies, dass der Ausgangspin den Datenregisterzustand widerspiegelt.

Die Flipflops werden an der abfallenden Flanke flankengetriggert, sodass die Flipflops den Datenbuswert an der abfallenden Flanke ihrer jeweiligen Takte annehmen.

Die Steuersignale und Datenbussignale werden von der CPU-Steuerlogik gesteuert, während die TRISA- und Port/Latch-Schreibbefehle ausgeführt werden. Der richtige Wert erscheint auf dem Datenbus, die Taktflanke tritt auf und das Latch wird geschrieben. Dies findet im Allgemeinen am Ende des Q4-Zyklus (letzter Teil des Anweisungszyklus) statt. Siehe zum Beispiel das Midrange-Referenzhandbuch :

Geben Sie hier die Bildbeschreibung ein

Da Lesevorgänge viel früher im Befehlszyklus (Ende des Q1-Zyklus) stattfinden, hatte es möglicherweise keine Zeit, den Status zu ändern, wenn Sie das Portregister schreiben und dann unmittelbar nach seiner Änderung lesen. Dies kann subtile Fehler verursachen, wenn Sie nicht ausschließlich in das LATA-Register anstatt in PORTA schreiben. Und das Laden des Ausgangs kann ähnliche Auswirkungen auch bei günstigerem Timing haben, je nachdem, was mit dem Pin verbunden ist. Dies ist als "Lesen-Ändern-Schreiben"-Problem bekannt.

Geben Sie hier die Bildbeschreibung ein

Schöne Erklärung. Ich sehe jetzt, dass wir einen CMOS-Inverter erhalten, wenn Q von TRISA 0 ist, und wenn Q 1 ist, erhalten wir, dass beide Transistoren nicht leiten (aber was passiert dann? Bekommen wir irgendwie eine hohe Impedanz an diesem Pin?). Sollte der Wert aus dem Tris-Register nicht auch zum D und dann zum Q gehen, wie ich es mit dem grünen Pfeil gezeichnet habe? Denn wenn wir (WR)TRIS=1 setzen, erhält der CMOS-Inverter einen Ausgang, und wenn wir (WR)TRIS=0 setzen, erhalten wir einen Eingang, wie Sie erklärt haben.
Vielleicht habe ich es falsch verstanden und es funktioniert so: Unabhängig davon, ob wir in LATA oder TRISA schreiben wollen, schreiben wir den Wert, den wir schreiben wollen, in den DATA-Bus. Dann wählen wir, ob wir dies in LATA oder TRISA schreiben wollen, indem wir jeweils entweder WR LATA oder WR TRISA auswählen, ist es richtig? Das würde also bedeuten, dass, wenn ich als Endbenutzer LATA0 = 1 schreibe, eine 1 in den Datenbus geschrieben und dann die WR-LATA0-Flanke getaktet wird, sodass die '1' in das Q des LATA0-Flip-Flops eingefügt wird?
Ja, die Schreibvorgänge in LATA und TRISA finden zu unterschiedlichen Zeiten statt - verursacht durch unterschiedliche Anweisungen.