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
das braucht man, wenn ein Grafikdisplay leider genau spiegelbildlich zur mühsam erstellten Charactertabelle organisiert ist
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)
Ups, Habe die defines am Anfang vergessen: #include "macros.inc" #define str_hi r25 #define str_lo r24 #define ltemp r23 #define rtemp r22
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
@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. ...
@OP: Warum schreibst Du Dir nicht ein kleines PC-Programm, daß Deine Charaktertabelle konvertiert, statt die Arbeit auf den AVR zu verlagern?
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.