www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Byte umdrehen


Autor: mr. chip (Gast)
Datum:

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

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

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

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

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

Autor: mr. chip (Gast)
Datum:

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

Autor: Aleksej (Gast)
Datum:

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

Autor: Reiner (Gast)
Datum:

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

Autor: Reiner (Gast)
Datum:

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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Reiner (Gast)
Datum:

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

Autor: Detlef A (Gast)
Datum:

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

Autor: mr. chip (Gast)
Datum:

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

Autor: Thomas O. (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Dirk Dörr (dirkd)
Datum:

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

Autor: Stephan Henning (stephan-)
Datum:

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

Autor: D. W. (dave) Benutzerseite
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

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.