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.
Code: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
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.
Disclaimer: none. Sue me.
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.
Doch schon. Sofern man sich etwas Gehirnschmalz gönnt...Zitat von voidpointer
Die Semantik (Bedeutung) eines Befehls zu kennen kann also durchaus hilfreich sein.Code:; doing a ROL MOV Rdummy, Rn ROL Rdummy ROL Rn ; doing a ROR MOV Rdummy, Rn ROR Rdummy ROR Rn
Disclaimer: none. Sue me.
Lesezeichen