Wenn Sie den zuvor ausgegebenen Wert zurücklesen möchten, empfehle ich, ihn aus dem Register zu lesen, in das Sie geschrieben haben, d. H. PORTA
.
jedoch nach versehen Doku (fett von mir):
13.2.4 Unabhängigen der Einstellung von Datenrichtung Bit DDxn, die Port-Pin kann durch das Bit PINxn Register gelesen werden.
Eine mögliche Erklärung für das Lesen der alten Wert zurück, sofort nach ein anderes schreiben, ist wohl die kurz im gleichen Kapitel folgenden Teil:
PINxn Register Bit und dem vorhergehenden Riegel Synchronizer bilden . Dies ist erforderlich, um Metastabilität zu vermeiden, wenn der physische Pin den Wert in der Nähe der Flanke des internen Takts ändert, aber es führt auch ein Verzögerung.
Also müssen Sie diese Verzögerung berücksichtigen.
Sehen Sie sich Timing-Funktionen an, die z. nach verfügbaren Bibliotheken und nach verfügbarer Timer-Hardware.
Aber als Proof of Concept, schlage ich vor, von
- Druck der Wert
PINA
vor Schreiben der invertierten Wert
- schreiben den invertierten Wert zu
PORTA
(inverted nur das entsprechende Bit natürlich) zu demonstrieren
- lesen und den Wert von
PINA
danach (in der Hoffnung, dass Ihr Kopf volatile
hier verwendet) gedruckt wird oft (etwa 1000)
Ich erwarte, dass Sie einige alte Werte sehen werden, aber dann den neuen Wert.
Je nachdem, wie der Druckvorgang ausgeführt wird (busy waiting?), Kann es einmal ausreichen.
Ihr NOP
(__asm__("nop\n\t");
) könnte entworfen werden, um die entsprechende Wartezeit zu erfüllen.Aber ich denke, es ist fehl am Platz (sollte nach dem Schreiben neuer Wert sein) und es könnte zu kurz sein. Wenn es von Beispielcode ist, sollte es ausreichen. Bewege es und mach es vielleicht zweimal, um es beim ersten Versuch zu versuchen. Das ist wahrscheinlich effektiv.
Sie benutzen den Pin als Eingang, zumindest nehme ich an, dass DDRA = (1 << DDA0); Was erwartest du mit 'PORTA = 0x01;'? Ich würde mich nicht wundern, wenn der Wert von 'PINA' das Ausmaß der Volatilität widerspiegelt, die von außen auf diesen Pin angewendet wird, ohne Einfluss darauf, was Sie zuvor in dieses Bit geschrieben haben. Bitte erläutern Sie im Detail jede Ihrer Codezeilen, also was Sie denken und was die Dokumentation sagt. – Yunnosch
Und beschreiben Sie, was Sie mit dem physischen Pin machen. Masse auftragen, frei schwebend, Spannung anlegen, eine Art Peripherie anschließen. Welche Spannung messen Sie mit einem Multimeter? – Yunnosch
Wie soll 'DDA0' verwendet werden? Ist es eine Bitposition, Wert 0? Das scheint mit deinem Code übereinzustimmen. Aber könnte es eine Maske sein, Wert 1? Das könnte dazu führen, dass Ihre Code-Einstellung Bit-Position 1 zum Lesen und unabhängig davon, welche Ebene der Pin sieht, nicht in PINA übergeht. – Yunnosch