Ich entschuldige mich, wenn meine Frage vage war.
Programm: Atmel Studio 6
Ich versuche, ein Programm zu erstellen, das in eine Schleife eintritt, aus der es nur ausbricht, wenn ein Pin niedrig wird.
;Set PA0 high before entering loop checking for low
CBI DDRA,DDA0 ;PA0 to input
SBI PINA0,0 ;PA0 pull-up enable
;PA0 is now input & high
chklow: inc r16 ; Increase r16
in r18,PORTA0 ; Copies PINA0 to r18
cpi r18,0 ; Compares r18 to 0
brne chklow ; Branch if PA0 is not low
nop ; Loop exit (do nothing)
Was passiert ist, dass, wenn ich PINA0 setze, PORTA0 hoch geht. Ich denke, das ist gut, es ist, als hätte ich einen Knopf gedrückt, der mit PINA0 verbunden ist.
Jetzt betrete ich die Schleife, und ich habe mein E/A-Anzeigefeld oben, sodass ich sehe, dass PORTA0 eingestellt ist. Dies ist das Feld ganz rechts in PORTA.
Aber "in r18, PORTA" macht r18 nicht zu '1' ... es bleibt 0.
Und so wird das Z-Bit auf 1 gesetzt, weil der Vergleich erfolgreich war und die Verzweigung nicht auftritt.
Was ist falsch? Ich möchte, dass die Schleife endlos fortgesetzt wird, bis ich PORTA0 niedrig mache.
EDIT: Ich habe es jetzt geändert, mit Ihrem Rat:
CBI DDRA,DDA0 ;PA0 to input
SBI PORTA0,0 ;PA0 pull-up enable
chklow:
in r18,PORTA ; Copies PINA0 to r18
cpi r18,0x00 ; Compares r18 to 0
brne chklow ; Branch if PA0 is not low
nop ; Loop exit (do nothing)
Was ich also geändert habe, war, dass ich das gesamte PORTA-Byte kopiert habe, anstatt zu versuchen, das PORTA0-Bit zu kopieren, was nicht möglich ist (zumindest mit meiner Methode), und jetzt funktioniert es. Danke ;)
Ich weiß auch, dass dies eine schmutzige Lösung ist, weil es fehlschlägt, wenn irgendein Bit in Pin A gesetzt ist, aber ich kann das später verfeinern, dies ist ein funktionierender Prototyp: D
Paar Dinge, die mich die Stirn runzeln lassen:
SBI PINA0,0 ;PA0 pull-up enable
Laut Datenblatt:
Jedem Port sind drei E/A-Speicheradressen zugeordnet, jeweils einer für das Datenregister – PORTx, das Datenrichtungsregister – DDRx und die Port-Eingangspins – PINx. Die E/A-Position der Porteingangsstifte ist nur lesbar, während das Datenregister und das Datenrichtungsregister lesbar/schreibbar sind. Das Schreiben einer logischen Eins in ein Bit im PINx-Register führt jedoch zu einem Umschalten des entsprechenden Bits im Datenregister. Darüber hinaus deaktiviert das Pull-up Disable – PUD-Bit in MCUCR die Pull-up-Funktion für alle Pins in allen Ports, wenn es gesetzt ist.
Um den Pullup zu aktivieren, sollten Sie PORTA
not to schreiben PINA0
. Beachten Sie auch den Unterschied PINA0
und PINA
in Ihrem Code. Sie können kein einzelnes Bit von einem IO-Port lesen, Sie müssen das ganze Byte lesen. AND
Anschließend können Sie mit , SBRC
oder ein oder mehrere Bits im gelesenen Byte prüfen SBRS
.
nop ; Loop exit (do nothing)
Verwenden Sie nicht nop
"nichts tun", da der Mikrocontroller mit der nächsten Anweisung im Flash fortfährt, die alles sein kann , einschließlich einer Anweisung aus einem vorherigen Programm, das sich im Flash befand, wenn es nicht überschrieben wurde. Da kann alles passieren.
PINx
diese Weise zufällig funktionieren kann (da das Schreiben auf PINx
die Bits in invertiert PORTx
), stimme ich zu, dass Sie es nicht auf diese Weise tun sollten.brne
PORTA
und dann Bit0 testen, zum Beispiel mit AND R18,0x01
. Sie können nicht direkt ein einzelnes Bit von einem Port lesen.AND
sind die Anweisungen SBRC
und SBRS
.
Ignacio Vazquez-Abrams
DrOnline
Ignacio Vazquez-Abrams
in r18,PORTA0 ; Copies PINA0 to r18
DrOnline