mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bit löschen


Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen,
steh gerade etwas auf dem Schlauch und hoffe mir kann jemand helfen.
Wie kann ich ein Bit in einem 16bit word löschen?
Also nicht auf "0" setzen sondern löschen damit ich nur noch 15 Bit
habe.
Benutze einen ATMega und Assembler.
Danke schonmal für eure Hilfe.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Speichern kannste eh nur Vielfache von 8 Bit, also 8, 16, 24, 32......
Also wie stellst Du Dir das mit dem löschen vor???

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also nicht auf "0" setzen sondern löschen damit ich nur noch 15 Bit
> habe.

Im Dualsystem gibt es aber nur "0" oder "1". "Nichts" ist da
nicht vorgesehen. Eine 16-Bit-Zahl wird immer 16 Bit haben, jedes ihrer
Bits wird immer 0 oder 1 sein.

...

Autor: Thomas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dir wird nichts anderes übrigbleiben, als Bits zu verschieben und die
damit unbenutzt werdenden höchsten Bits auf einen dir genehmen Wert zu
setzten (vmtl. 0).

Jetzt mal ins Unreine ein Ansatz:

Ist  - yyyy.yyAx.xxxx.xxxx
Soll - 0yyy.yyyx.xxxx.xxxx

A - unwillkommenes Bit
x - niedriger benutzter Wortteil
y - hoher benutzter Wortteil

- den Wert trennen in niedrigen und hohen benutzten Wortteil
(entsprechend maskieren halt)
- den hohen Teil um eins nach rechts schieben
- beide Teile wieder kombinieren.

Gruß

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm hab ich mich vielleicht blöd ausgedrückt.
Also nochmal.
hab wie gesagt eine 16 Bit Zahl.
Nun brauch ich davon aber angenommen nur die ersten 12 Bits.
Wie kann ich das in Assembler realisieren?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Indem Du das ganze Wort um die entsprechende Stellenzahl nach rechts
schiebst. Dafür gibts in Assembler ganz tolle Befehle...

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um den Wert nicht zu verfälschen muss ich dann
ror
verwenden wenn ich das richtig sehe.
Dann erst mein high byte und dann das low byte verschieben!?

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitweise shiften dürfte da wohl die antwort sein...

lsr - logical shift right
lsl - logical shift left

Wenn Du also nur die 12 höchstwertigsten Bits eines 16-bit-Wortes
benötigst, schiebst du das ganze viermal nach rechts. Wird von ober mit
Nullen aufgefüllt.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach es z.B. so: Schiebe das High-Byte (also die höherwertigen acht Bit)
mit lsr um eine Stelle nach rechts. Dadurch wird der Inhalt des
niederwertigsten Bits ins Carry-Flag geschoben und von links eine Null
reingeschoben. Dann wendest Du sofort danach (ohne dass in der
Zwischenzeit das Carry verändert wird!!!) auf das Low-Byte ror an.
Dadurch wird das Low-Byte um eine Stelle nach rechts geschoben und von
links wandert der Übertrag von der ersten Operation rein. Wenn Du das
viermal hintereinander machst, hast Du die oberen zwölf Bits von Deinem
16-Bit-Wort auf die unteren zwölf Stellen  verschoben. Ich denke, das
ist es, was Du wolltest...

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo funktioniert,danke mal!
Ist ja eigentlich logisch nur hat ich einen Denkfehler mit den "0"en
welche rein geschoben werden.
Aber passt jetzt.

Autor: Thomas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Nun brauch ich davon aber angenommen nur die ersten 12 Bits."

Shifts und Rotationen sind auch nicht unbedingt was du brauchst. Du
willst möglicherweise Bits maskieren und da ist das bitweise UND dein
Freund. Einfach deinen Wert mit einer Maske ver-UND-en und die
unerwünschten Bits sind Null.

Istwert yyyy.xxxx.xxxx.xxxx
Maske   0000.1111.1111.1111
UND     0000.xxxx.xxxx.xxxx

Ansonsten musst du dir mit Shifts, Rots und Maskierung alles selber
bauen.

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.