Unterschied zwischen dem Lesen von PORT und PIN

9

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
Hanna
quelle
Sollen wir mit unseren Kristallkugeln herausfinden, welchen Mikrocontroller (und für den Code: welche Programmiersprache) Sie verwenden?
Wouter van Ooijen
Entschuldigung, es ist bearbeitet.
Hanna
Ist das Ihr eigener Code oder stammt dies aus einem Beispiel? Wenn es ein Beispiel ist, woher kommt es? Warum sagst du "Lesestift ist hier nicht nützlich"?
Angelatlarge
Ich habe es schon einmal in AVR Studio getestet. Glaubst du, in R17 ist PINB korrekt?
Hanna

Antworten:

13

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).

Geben Sie hier die Bildbeschreibung ein

Beginnend am Feld ganz links (das die physische Verbindung zur Außenwelt darstellt) sehen Sie drei Pfade:

  1. Der oberste Pfad ist der per Software wählbare Pull-up-Widerstand
  2. Der mittlere Pfad wird verwendet, wenn der Pin als Ausgang konfiguriert ist
  3. Der niedrigste Pfad wird verwendet, wenn der Pin als Eingang konfiguriert ist

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).

DrFriedParts
quelle
+1 Es ist auch erwähnenswert, dass, wenn die Ports als Eingänge konfiguriert sind, das Schreiben von 1 in ein beliebiges Bit von PORT den internen Pull-up-Widerstand an diesem Pin aktiviert.
Matt Young
Wann sollte ich PORT lesen?
Hanna
Sie lesen von der PIN. Das Lesen von PORT bringt Ihnen nichts Nützliches.
Matt Young
@user - Wenn Sie von PORT lesen, erhalten Sie den Status der Pull-up-Widerstände (unabhängig davon, ob der Pull-up für diesen Pin aktiviert ist oder nicht), aber wie Matt Young erwähnt, ist dies nicht allzu nützlich.
DrFriedParts
Ich habe ein Beispiel für das Lesen von PORT
Hanna
4

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 (wenn DDR= 1, Port / Pin als Ausgang konfiguriert) oder ob der interne Pullup-Widerstand ist aktiviert (wenn DDR= 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 Szenario

Mö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. Lesen PORTunmittelbar nach dem Schreiben PORTmacht keinen Sinn: Wenn PORTSie an geschrieben haben , wissen Sie, was der Wert von PORTist.

Angelatlarge
quelle
Können Sie mir einen besseren Code geben? Und warum antwortet PINB in ​​R17 dort nicht?
Hanna
Aus Ihrer Frage geht nicht hervor, was Sie versuchen zu tun. Können Sie das in Ihrer Frage klarstellen: Was ist das Ziel dieses Code-Snippets? Versuchen Sie nur, einen Port mit einer bestimmten Frequenz und einem bestimmten Arbeitszyklus umzuschalten?
Angelatlarge
ja !!! nur das
Hanna
1

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.

Mikrotherion
quelle
Warum ist das Lesen der PIN falsch?
Hanna
Der Wert, den Sie von der PIN zurückerhalten, hängt im Prinzip davon ab, was extern an der PIN angebracht ist, und in Ihrer speziellen Anwendung interessiert Sie nur der Wert, den Sie zuvor selbst geschrieben haben (dies ist natürlich ziemlich untypisch für I) / O-Stifte). In der Praxis würde ich jedoch erwarten, dass die Werte von PORT und PIN hier identisch sind (haben Sie es versucht?).
Microtherion
Ja, ich habe es schon einmal in AVR Studio getestet. Ich denke, was Sie gesagt haben, ist wahr. Wir müssen nur den Portwert ergänzen ...
Hanna