Byte umdrehen

Gast #302884
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.
Gast #302886
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)
Gast #302889
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
Gast #302890
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
Gast #302891
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
Gast #302892
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.
Persönliche Seite #302897
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren