Hallo Leute,

ich muss für die in Assembler ein "Lauflicht" über die STK500 (mega16) programmieren.
Ich habe mich im Internet informiert wie das rol und das ror funktioniert. Ob ich es verstanden habe ist offen.
Das Programm was ich vorbereitet habe:

.include "m16def.inc"

ldi r16, 0xff
out ddrb,r16
ldi r17, 0x00
out ddrd,r17
ldi r17,0xfe
ldi r16,0xfe
ldi r20,0xff
ldi r21,0xff

loop:

in r18,pind
cp r17,r18
breq lable1

cpi r18,0x7f
brne ende

ror r16
out portb,r16

warteschleife1:
nop
dec r20
brne warteschleife1

nop
dec r21
brne warteschleife1

rjmp loop

lable1:

out portb,r16
rol r16

warteschleife2:

nop
dec r20
brne warteschleife2

nop
dec r21
brne warteschleife2
out portb,r16

ende:
rjmp loop

die Warteschleifen könnt ihr erst mal ignorieren.
Das Ziel ist: Bei jedem Tastendruck soll eine bzw. die nächste LED leuchten.
Wenn ich ROL oder ROR benutze macht er das nicht.
Zb. 1111 1110 wird zu 1111 1100 wenn ich rol benutze.
Sollte es nicht 1111 1101 werden?

Ich danke schon mal für die Antworten.

- - - Aktualisiert - - -

Zitat Zitat von Unregistriert Beitrag anzeigen
Zb. 1111 1110 wird zu 1111 1100 wenn ich rol benutze.
Sollte es nicht 1111 1101 werden?
rol holt Bit 0 aus dem Carry Flag. Carry Flag wird 0 gewesen sein und Carry ist dann nach dem ersten rol 1, da Bit 7 ins Carry geschoben wird. Ohne jetzt den ganzen unkommentierten und unerklärten Code durchzugehen, könnte ein SEC (Set Carry) an der richtigen Stelle das Problem lösen. Allerdings wird irgendwann die 0 im Bitmuster im Carry "unsichtbar" werden ...