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?"
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
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.
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...
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)
@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
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
@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
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.
> 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.
...
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.
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).