Byte umdrehen

Gast #302881
Hallo

Gibt es in AVR Assembler einen Befehl, der ein Byte oder auch nur schon
ein Nibble umdrehen kann? Aus ABCDEFGH würde dann einfach HGFEDCBA.

Gruss

Michael

PS: "Und als nächstes fragst du danach, ob es auch einen Befehl gibt,
der am Port D eine Pizza ausgibt?"
Gast #302884
Nicht ganz: Die Port-Pins und der Stecker des Displays laufen sozusagen
in entgegengesetzte Richtungen. Es handelt sich aber nur um 4 Bit, ganz
ähnlich wie in der Ansteuerung nach dem Tutorial. Ich könnte es
eigentlich auch einfach umlöten.
Gast #302885
Eine schnellere aber nicht gerade sparsame Loesung - mit Hilfe einer
Tabelle da brauchst du 4 Befehle, (ld zh, ld zl, add, lds) Aber fuer
die Tabelle braucht man 256 Bytes...
Gast #302886
Wenn Du WinAVR benutzt, versuche mal strrev.
Ist so definiert:  char *strrev(char *string)

Sieht so aus:

    .text
    .global _U(strrev)
    .type   _U(strrev), @function

_U(strrev):
    LOAD_X(str_lo, str_hi)  ; X is start of string
  LOAD_Z(str_lo, str_hi)  ; Z becomes end of string
.strrev_eos:
  LD    _tmp_reg_, Z+
  TST   _tmp_reg_
  BRNE  .strrev_eos
  SBIW  ZL, 2    ; now Z points at end of string
.strrev_loop:
  CP    XL, ZL
  CPC   XH, ZH    ; if X >= Z we are done
  BRSH  .strrev_done
  LD    ltemp, X          ; get left character
  LD    rtemp, Z    ; get right character
  ST    Z, ltemp
  SBIW  ZL, 1
  ST    X+, rtemp    ; swap chars
  RJMP  .strrev_loop  ; next pair
.strrev_done:
    RET
.strrev_end:
  .size _U(strrev), .strrev_end - _U(strrev)
Gast #302889
@Andreas

Hab' ich schon gelesen, dass da ein Byte umgedreht werden soll.  Aber
er schreibt: "Aus ABCDEFGH würde dann einfach HGFEDCBA."
Also nahm ich an, er will doch einen String umdrehen):-

Reiner
Gast #302890
Für Prozessoren die besser schieben können als der AVR geht das
Bitreverse eines Byte auch so, ob das für den AVR schneller geht als
das Einzelbitschieben müßze man mal ausmetern:

byte=((byte&0xaa)>>1)|((byte&0x55)<<1);
byte=((byte&0xcc)>>2)|((byte&0x33)<<2);
// Das folgende ist der AVR Befehl 'swap'
byte=((byte&0xf0)>>4)|((byte&0x0f)<<4);

Cheers
Detlef
Gast #302891
@Aleksej: Deine Lösung ist ziemlich interessant! Da ich nur ein Nibble
umdrehen will, bräuchte ich sogar nur 8 Bytes für die Tabelle.
Schwieriger wird die Sache mit der Adressierung...

Wenn ich die Tabelle zuunterst im EEPROM speichere, dann kann mache
ich, dass mein zu drehendes Nibble in den Bits 0 - 3 ist, setze die
oberen Bits auf 0 und schiebe um 1 nach rechts. Dann habe ich die
Byte-Adresse. Ich lade das Byte und anhand des letzten Bits des
Ausgangsnibble unterscheide ich noch, ob ich damit einen swap machen
muss oder nicht.

Gruss

Michael
Gast #302892
Wenn es nur um Werte des ADC geht, drehe ich das so um.

ldi temp, 255
sub temp, temp2

nun hat man das Poti das bei einem Rechtsdreh seinen Wert verringert
per Software korrigiert so als ab es sienen Wert erhöhen würde.
#302893
> ldi temp, 255
> sub temp, temp2

Thomas, du solltest dir mal den AVR-Befehlssatz ansehen, da gibt es
einen Befehl namens "com".

Aber das ist nicht die Lösung der eigentlichen Frage.
Es wurde nach der Spiegelung der Bitwertigkeit gefragt, nicht nach dem
Invertieren der Bitwerte.

...
Persönliche Seite #302897
Also ich frage mich auch, was das soll.

Du kannst doch die Datenleitung Bit-wert-equivalent mit dem Port
verdrahten. Meinetwegen auch verschoben.
Aber doch bitte nicht Bit-Wert-verdreht!

Oder versuchst du eine möglichst allgemeine LCD Lib zu schreiben, wo
die Pinwahl frei möglich ist? ;)

Also ich achte da immer drauf. Die 4 Datenleitungen des HD44780's
gehen bei mir im 4-Bit Betrieb immer an D0-D3 oder D4-D7.
(Ist beim 4 Bit Interface sowieso egal. In beiden Fällen bräuchte man
ein Swap).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.