ASM: Teil-Register zusammenfügen

Gast #274310
Lesenswert?

Huhu

Ich möchte folgende 5 Bit zusammengefügt in ein Register stehen haben:

PortA Bits 0,1,2
&
PortC Bits 0,1

also so: A2,A1,A0,C1,C0 ins Register level

    in level, PINA
    andi level, 0b00000111
    rol level
    rol level
    in temp, PINC
    andi temp, 0b00000011
    or level, temp


    ; level hat nun Format 000xxxxx

level wird dann als LED-Zeile ausgegeben
Ich habe Auf die Ports A und C Tasten geschalten. A funktioniert, C
reagiert nicht. Weis nicht warum...
Gast #274312
Lesenswert?

Wie meinst du das "untere Bits löschen"?

nochmal genauer:

    in level, PINA
    andi level, 0b00000111    ; lösche obere 5 bits
    rol level                 ; Ergebnis 0000xxx0
    rol level                 ; Ergebnis 000xxx00
    in temp, PINC
    andi temp, 0b00000011     ; obere 6 Bits löschen, Ergebnis
000000XX
    or level, temp            ; 000xxx00 OR 000000XX = 000xxxXX

markiere mal die Zeile mit dem Fehler, ich seh es nicht :)
Gast #274313
Lesenswert?

Ich nehme mal an, das es hier um Atmel-AVR geht.

Der Befehl rol (rotate left) schiebt nicht nur die Bits um eine Stelle
nach links, sondern auch das Carry-Bit in das Bit0.
Bit7 wird ins Carry-Bit geschoben und kommt mit dem nächsten rol auf
der anderen Seite auf das Bit0, daher die Bezeichnung rotate.

Falls das Carry-Bit vor deiner Befehlssequenz gesetzt ist, wird dein
Ergebnis verfälscht.

Ersetze die rol durch lsl (logical shift left). Hier wird das Bit0
immer mit 0 besetzt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren