Forum: Mikrocontroller und Digitale Elektronik Byte umdrehen


von mr. chip (Gast)


Lesenswert?

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?"

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

schieben, einfach nur schieben, zum carry raus und ins andere register
rein, dauert allerdings 16 Takte
vielleicht ließe sich der swap-Befehl nutzbringend anwenden

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

das braucht man, wenn ein Grafikdisplay leider genau spiegelbildlich zur
mühsam erstellten Charactertabelle organisiert ist

von mr. chip (Gast)


Lesenswert?

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.

von Aleksej (Gast)


Lesenswert?

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...

von Reiner (Gast)


Lesenswert?

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)

von Reiner (Gast)


Lesenswert?

Ups,

Habe die defines am Anfang vergessen:

#include "macros.inc"

#define str_hi r25
#define str_lo r24
#define ltemp  r23
#define rtemp  r22

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Reiner, hier soll ein Byte umgedreht werden, kein String.

Mehrere Lösungen gibt's hier:
http://www.mikrocontroller.net/forum/read-1-6535.html#6535

von Reiner (Gast)


Lesenswert?

@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

von Detlef A (Gast)


Lesenswert?

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

von mr. chip (Gast)


Lesenswert?

@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

von Thomas O. (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

> 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.

...

von Dirk D. (dirkd)


Lesenswert?

@OP:
Warum schreibst Du Dir nicht ein kleines PC-Programm, daß Deine
Charaktertabelle konvertiert, statt die Arbeit auf den AVR zu
verlagern?

von Stephan H. (stephan-)


Lesenswert?

also mit löten wärst Du sätestens jetzt schon fertig :-)

von D. W. (dave) Benutzerseite


Lesenswert?

Bei 4bit, die in einem Nibble sind, ist Shifting ungefähr gleich
schnell, vielleicht sogar schneller.

Der Einwand von Dirk ist natürlich nicht zu verachten.

von Simon K. (simon) Benutzerseite


Lesenswert?

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).

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.