Was ist der Unterschied zwischen dem Lesen von PORTA und PINA? Wie ist die Beziehung zwischen einem Port und seinen Pins? Ich bin wirklich verwirrt !!! Beispiel für das Lesen von PORT: (Lesestift ist hier nicht nützlich)
Montage f = 1 MHz ATmega8 Ich muss PORTB alle 1 ms ergänzen. (Dutycycle = 50%)
LDI R16,$FF
OUT DDRB,R16
MAIN: LDI R16,00
DELAY:CPI R16,200
BREQ LOOP
INC R16
RJMP DELAY
loop:IN R17,PORTB
COM R17
OUT PORTB,R17
OUT R17,PORTB
RJMP MAIN
Antworten:
PORT ist der OUTPUT-Puffer, PIN ist der INPUT-Puffer.
Wenn Sie den Pin auf eine "hohe" oder "niedrige" Spannung setzen möchten, schreiben Sie in das PORT-Register.
Wenn Sie wissen möchten, welche Spannung derzeit an einem Pin anliegt, lesen Sie das PIN-Register.
Die Bits dieser Register repräsentieren die entsprechenden Pins des Allzweck-Eingangs- / Ausgangsports.
Hier ist ein vereinfachtes Schema der Elektronik im Innern des AVR an einen angeschlossenen einzigen Stift (geht hier für die kompletten Datenblätter).
Dieser Schaltungsblock wird für jeden Pin wiederholt. Acht davon bilden einen Port (z. B. Port A).
Beginnend am Feld ganz links (das die physische Verbindung zur Außenwelt darstellt) sehen Sie drei Pfade:
Es ist zu beachten, dass einige oder alle dieser Schaltungen umgangen werden können, wenn der Pin mit einem internen Peripheriegerät geteilt wird. Zum Beispiel der Analog-Digital-Wandler (ADC).
quelle
Ich stimme der Antwort von DrFriedParts vollständig zu, aber ich möchte hinzufügen, dass Sie tatsächlich lesen können
PORT
, um herauszufinden, ob der Port / Pin als OUTPUT hoch oder niedrig konfiguriert ist (wennDDR
=1
, Port / Pin als Ausgang konfiguriert) oder ob der interne Pullup-Widerstand ist aktiviert (wennDDR
=0
, Port / Pin als Eingang konfiguriert). Auf diese Weise kann ein Port-Port (auf ziemlich dumme Weise) als allgemeiner Speicher verwendet werden oder um Informationen über den Status der Ausgabe- / Eingabe-Pullups zu übergeben, wie im folgenden SzenarioMöglicherweise schreibt ein Teil Ihres Programms etwas in Ports oder aktiviert / deaktiviert Pullups, und der andere Teil des Programms liest
PORT
, um herauszufinden, wie es konfiguriert ist. LesenPORT
unmittelbar nach dem SchreibenPORT
macht keinen Sinn: WennPORT
Sie an geschrieben haben , wissen Sie, was der Wert vonPORT
ist.quelle
Für Ihre Zwecke ist das Lesen aus PORT tatsächlich sinnvoll: Die fraglichen Pins sind Ausgabepins, und Sie möchten einfach den zuletzt geschriebenen Wert lesen, umschalten und zurückschreiben. Sie verwenden das Portregister also als Byte des extern beobachtbaren RAM.
Auf der anderen Seite könnten Sie für diese spezielle App einfach den Wert in einem Register behalten und müssten nicht einmal das PORT-Register zurücklesen.
quelle