Forum: Mikrocontroller und Digitale Elektronik Bits schubsen


von M. Brehme (Gast)


Lesenswert?

Hallo,

nur mal so zum Verständnis eine Grundlagenfrage.

ldi r16,$ff
ldi r16,(1<<3)

danach siehts in r16 so aus 0b00001000, richtig?

D.h. wenn ich Bits verschiebe, wird das Register vorher auf 0 gesetzt
und wie in diesem Fall nur das eine Bit gesetzt? Ich hatte damit
gerechnet, das die Bits aus dem Register nach links "rausgeschoben"
werden.

Obige Erkentniss habe ich mit dem AVR Studio ermittelt und bin nun
etwas unsicher.

Wie würde ich den in einem Register einzelne Bits löschen oder setzen.
Müsste ich mir dazu erst den alten Wert merken und mit dem neuen
Bitmuster logisch verknüpfen?

Gruß
Martin

von Jan M. (mueschel)


Lesenswert?

Wenn du Bits schiebst, schiebst du Bits nach rechts raus. Dazu
verwendest du die Befehl lsl, lsr, rol, ror.
Mit ldi lädst du eine neue Zahl in das Register, da wird dann natürlich
der vorherige Inhalt überschrieben.

von Karl H. (kbuchegg)


Lesenswert?

du verschiebst keine Bits.
Der 2. Befehl lautet immer noch ldi, Also "Load immediate".
Das Register r16 wird geladen. Womit? Mit 1<<3. Also einer
binären 1, die 2 mal nach links geschoben wird.
1<<3 ist also einfach nur eine andere Schreibweise für 0b00001000
Und damit wird das Register geladen.

> Wie würde ich den in einem Register einzelne Bits löschen oder
> setzen.

Gesetzt wird mit einem ODER. Gelöscht mit einem UND

Das 3. Bit setzen

   ori  r16, $08     ; $08 == 00001000

das 3. Bit löschen

   andi r16, $F7     ; $F7 == 11110111

von Jan M. (mueschel)


Lesenswert?

Zweite Frage übersehen:
Um einzelne Bits zu setzen, kannst du sbi (bzw. cbi zum Löschen)
benutzen.
Ab drei Bits lohnt sich das von dir vorgeschlagene Vorgehen mit in -
andi - out bzw. in - ori - out

von M. Brehme (Gast)


Lesenswert?

AUA, ja klar ...

wenigstens mit dem zweiten Weg lag ich richtig :-)

von Karl H. (kbuchegg)


Lesenswert?

Tippfehler: 1 << 3  ist natürlich eine 1 die 3 mal geschoben wurde

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.