Unterschied zwischen dem Lesen von PORT und PIN

Was ist der Unterschied zwischen dem Lesen von PORTA und PINA? Was ist die Beziehung zwischen einem Port und seinen Pins? Ich bin wirklich verwirrt !!! Beispiel zum Lesen von PORT: (Lesestift ist hier nicht nützlich)

Assembly 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
Sollen wir unsere Kristallkugeln benutzen, um herauszufinden, welchen Mikrocontroller (und für den Code: welche Programmiersprache) Sie verwenden??
Entschuldigung, es ist bearbeitet.
Ist das dein eigener Code oder stammt das aus einem Beispiel? Wenn es ein Beispiel ist, woher kommt es? Warum sagen Sie "Lesestift ist hier nicht nützlich"?
Ich habe es zuvor in AVR Studio getestet. Glaubst du, IN R17, PINB ist richtig?

Antworten (3)

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 Mehrzweck-Eingangs-/Ausgangsports.

Hier ist ein vereinfachtes Schema der Elektronik im AVR, die mit einem einzelnen Pin verbunden ist ( hier finden Sie vollständige 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 beim Quadrat ganz links (das die physische Verbindung zur Außenwelt darstellt) können Sie drei Pfade sehen:

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

+1 Es ist auch erwähnenswert, dass, wenn die Ports als Eingänge konfiguriert sind, das Schreiben von 1 auf ein beliebiges Bit von PORT den internen Pull-up-Widerstand an diesem Pin aktiviert.
Wann sollte ich PORT lesen?
Sie lesen von PIN. Das Lesen von PORT wird Ihnen nichts Nützliches geben.
@user -- Das Lesen von PORT gibt Ihnen den Zustand der Pull-up-Widerstände (ob der Pull-up für diesen Pin aktiviert ist oder nicht), aber wie Matt Young erwähnt, ist das nicht so nützlich.
Ich habe ein Lesebeispiel für PORT hinzugefügt
@Hanna - das sehe ich, aber (1) warum willst du PORT lesen? und (2) in welcher Sprache ist dieses Fragment geschrieben?
Ich werde den vollständigen Code und die Beschreibung einfügen

Ich stimme der Antwort von DrFriedParts vollständig zu, möchte jedoch hinzufügen, dass Sie tatsächlich nachlesen können PORT, ob der Port/Pin als OUTPUT High oder Low 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 Zustand der Ausgangs-/Eingangs-Pullups weiterzugeben, wie im folgenden Szenario

Vielleicht schreibt ein Teil Ihres Programms etwas an 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: Nachdem Sie an geschrieben PORThaben, wissen Sie, was der Wert von PORTist.

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

Für Ihre Zwecke ist das Lesen von PORT tatsächlich sinnvoll: Die fraglichen Pins sind Ausgangspins, und Sie möchten einfach den zuletzt geschriebenen Wert lesen, umschalten und zurückschreiben. Sie verwenden also das Portregister als ein Byte von extern beobachtbarem RAM.

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

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