PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rol und ror



The Man
02.03.2007, 10:28
Hallo da,
ich hab hier die abgebildete Plattform. mit den zwei Tastern steuere ich die ror und rol Befehle und gebe das Ergebnis auf die LED´s aus. Laut Datanblatt wird das Bit, das normalerweise verlorengehen würde in das Carry geschoben und dann wieder eingegliedert. Genau das passiert bei mir aber nicht und wenn ich´s übertreibe, sind sie alle aus und bleiben es auch.


mainloop: wdr

in r16,PINC
ori r16,0b11101111
cpi r16,0b11111111
breq d
in r16,PINC
ori r16,0b11011111
cpi r16,0b11111111
breq a
rjmp mainloop
a:
rcall ana
rjmp mainloop
d:
ldi r31,0b00010000
out PORTB,r16
rcall dec_inc ;Hier den Quellcode eintragen.
rjmp mainloop
;------------------------------------------------------------------------
ana:

bis_converted:
in r16,ADCSRA
ori r16,0b11101111
cpi r16,0b11111111
breq ausgabe
rjmp bis_converted
ausgabe:
in r18,ADCH
out PORTB,r18
ret
dec_inc:

wieder:
sbic PINC,3
rol r31
sbic PINC,1
ror r31
out PORTB,r31
loop1:
in r16,PINC
ori r16,0b11111101
cpi r16,0b11111111
breq loop1
in r16,PINC
ori r16,0b11110111
cpi r16,0b11111111
breq loop1
in r16,PINC
ori r16,0b11101111
cpi r16,0b11111111
breq wieder
ret

SIGINT
02.03.2007, 10:57
http://www.mikrocontroller.net/articles/Prellen

SprinterSB
02.03.2007, 10:59
rol Rn

ist lediglich syntactic sugar und eine Abkürzung für

addc Rn, Rn

Die Rotation geschieht also nicht nur in den 8 Bit des Rn, sondern mit dem 9-Bit-Wert, der sich aud Rn und Carry ergibt.

voidpointer
02.03.2007, 15:16
Hallo dort,

das Prellen ist keine Erklärung für das Verschwinden der "1". Und dass "rol Rn" gleich "addc Rn, Rn" ist, mag zwar sein, bringt aber auch keine Lösung.

Normalerweise sollte wiederholtes Ausführen der Rotationsbefehle niemals dazu führen, dass die "1" verschwindet. Sie muss sich immer entweder im Register oder im Carry-Flag befinden. Und da fängt das Problem an: wenn eine Operation auf ein anderes Register - in diesem Fall z.B. cpi r16, * - das Carry-Flag verändert, also löscht, dann war's das mit der Rotation der "1". Ich hab jetzt keine Lust, den Code zu verstehen, aber irgendwo passiert es. Bereinige den Code entsprechend, also vermeide das Löschen des Carry-Flags. Wenn das nicht geht, speichere das Status-Register (SREG) an einem sicheren Platz ;-) und hole es vor der Rotation zurück.

Gruß, Achim.

SprinterSB
02.03.2007, 17:12
Und dass "rol Rn" gleich "addc Rn, Rn" ist, mag zwar sein, bringt aber auch keine Lösung.

Doch schon. Sofern man sich etwas Gehirnschmalz gönnt...


; doing a ROL
MOV Rdummy, Rn
ROL Rdummy
ROL Rn

; doing a ROR
MOV Rdummy, Rn
ROR Rdummy
ROR Rn


Die Semantik (Bedeutung) eines Befehls zu kennen kann also durchaus hilfreich sein.