www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bits schubsen


Autor: M. Brehme (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: M. Brehme (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AUA, ja klar ...

wenigstens mit dem zweiten Weg lag ich richtig :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tippfehler: 1 << 3  ist natürlich eine 1 die 3 mal geschoben wurde

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.