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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
|
Anzeige
|
Unklarheiten bei PIND und PORTDHallo, 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?
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.
Gast
#3623569
Vielleicht ist einfach die LED aus, wenn auf dem Pin 5V anliegen, und an, wenn 0V anliegen. Warum wird denn dann PIN verändert wenn man bei PORT einen Ausgang schaltet?
Gast
#3623578
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.
Gast
#3623581
Weil PIN immer den aktuellen Stand des Ports ausgibt. Tut's das nicht, ist was kaputt ;-) Hab jetzt nochmal genau geschaut.
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. Füge einmal nach dem togglen:
asm volatile ("nop");
ein.
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.
Gast
#3623698
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. Ah ok. Dann sind meine Unklarheiten beseitigt. Danke. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|