Forum: Mikrocontroller und Digitale Elektronik Unklarheiten bei PIND und PORTD


von Mathias O. (m-obi)


Lesenswert?

Hallo,

ich bin gerade ein wenig durcheinander (ich hoffe das liegt nicht an dem 
Bier ;) ). Wenn ich einen Ausgang toggle und er es so toggelt, dass der 
Ausgang aus ist. Warum ist dann das Bit in PIND gesetzt?
1
PORTD ^= (1 << PD5);
2
if (PIND & (1<<PD5)) {
3
  uart_puts_P("LED AVR 0 aus");
4
} else {
5
  uart_puts_P("LED AVR 0 an");
6
}

von Magic S. (magic_smoke)


Lesenswert?

PIN ist immer der messbare Zustand eines Pins als Eingang, PORT ist der 
Zustand, den ein "Beinchen" annehmen soll wenn er als Ausgang geschaltet 
ist.

von jgdo (Gast)


Lesenswert?

Vielleicht ist einfach die LED aus, wenn auf dem Pin 5V anliegen, und 
an, wenn 0V anliegen.

von Mathias O. (m-obi)


Lesenswert?

Warum wird denn dann PIN verändert wenn man bei PORT einen Ausgang 
schaltet?

von Sepp (Gast)


Lesenswert?

Mathias O. schrieb:
> Warum wird denn dann PIN verändert wenn man bei PORT einen Ausgang
> schaltet?

Irgendwie ist die Frage schon die Antwort...

PORT ändert den Pin, was wiederum über PIN "messbar" ist.

von Nobby Nic (Gast)


Lesenswert?

Weil PIN immer den aktuellen Stand des Ports ausgibt. Tut's das nicht, 
ist was kaputt ;-)

von Mathias O. (m-obi)


Lesenswert?

Hab jetzt nochmal genau geschaut.
1
if (PIND & (1<<PD5)) {
2
  uart_puts_P("vorher LED AVR 0 aus ");
3
} else {
4
  uart_puts_P("vorher LED AVR 0 an ");
5
                                }
6
PORTD ^= (1 << PD5);
7
if (PIND & (1<<PD5)) {
8
    uart_puts_P("nachher LED AVR 0 aus");
9
} else {
10
        uart_puts_P("nachher LED AVR 0 an");
11
}
Wenn ich den Code ausführe kommt "vorher an" und "nachher an", obwohl er 
beim toggle den Ausgang gesetzt hat. Beim nächsten mal dann wenn er den 
Ausgang zurücksetzt kommt "vorher aus" und "nachher aus".
Also schreibt er erst den Port nach einen Zyklus und nicht direkt bei 
der Ausführung des Befehls?
Ich dachte halt, dass er das sofort macht. Daher hab ich mich gewundert. 
Aber jetzt ergibt es alles wieder einen Sinn.
Das ist aber nur beim toggeln so. Bei PORTD |= (1 << PD6); oder PORTD &= 
~(1 << PD5); nwird es sofort ausgeführt und nicht erst am Ende des 
Zyklus.

von Gerald G. (gerald_g)


Lesenswert?

Füge einmal nach dem togglen:
asm volatile ("nop");
ein.

von Rainer V. (rudi994)


Lesenswert?

In 8-Bit AVR Datasheets, die ich so kenne, steht unter Kap. IO-PORTS, 
daß das Ändern von Port-Pins mittels PORT-Befehl (und einem evtl. 
folgenden DDR-Befehl) weit mehr als einen Taktzyklus benötigt, daß man 
daher nicht sofort nach dem PORT-Befehl (bzw. DDR-Befehl) den Zustand 
mit dem PIN-Befehl auslesen darf und daß man einen NOP-Befehl 
dazwischenfügen muß. Dazu gibt es eine Grafik der Taktabfolge, wo man 
das sehen kann, und Code-Beispiele für Assembler und C-Code. Der Hinweis 
mit dem eingefügten NOP-Befehl ist auch im AVR-Tutorial dieses Forums 
nachzulesen.

von c-hater (Gast)


Lesenswert?

Rainer V. schrieb:

> In 8-Bit AVR Datasheets, die ich so kenne, steht unter Kap.
> IO-PORTS,
> daß das Ändern von Port-Pins mittels PORT-Befehl (und einem evtl.
> folgenden DDR-Befehl) weit mehr als einen Taktzyklus benötigt

Nein, das steht da nicht, weil es auch nicht so ist.

Die Ausgabe durch PORT und DDR erfolgt unmittelbar, am Ende des 
jeweiligen Befehlszyklus hat der Pin auch den entsprechenden Zustand 
angenommen.

Die Verzögerung von einem Taktzyklus (und nicht "weit mehr als einen 
Taktzyklus") entsteht durch die Synchronisationseinheit "vor" dem 
PIN-Register, also beim LESEN des Pinzustandes und nicht wie von dir 
behauptet beim Schreiben.

Tatsächlich ist das PIN-Register selber Bestandteil der Synchronisation. 
Z.B. im Datenblatt des Mega8 in Fig.22 auf Seite 52 ist die 
Synchronisationseinheit zu sehen, die im Prinzip aus zwei D-Flipflops 
besteht, wovon das "hintere" das entsprechende Bit des PIN-Registers 
selber darstellt.

von Mathias O. (m-obi)


Lesenswert?

Ah ok. Dann sind meine Unklarheiten beseitigt. Danke.

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
Noch kein Account? Hier anmelden.