Forum: Mikrocontroller und Digitale Elektronik Wie Bits effektiv vertauschen?


von Uwe Naumann (Gast)


Lesenswert?

Hallo Leute,

ich habe ein LCD im 4Bit-Mode. Nun habe ich aufgrund des
Leiterplattenlayouts die vier Datenleitungen gedreht.

Die Datenbits tausche ich folgendermaßen:

LCD4_rotate:
   ; Bits 0-3 verdreht (3-0) nach Bit 4-7 schaffen wegen vertauschter
LCD-Ports
   bst    temp, 0                  ; Bit 0 in T-Flag sichern
   bld    temp, 7                  ; Bit 7 (3) aus T-Flag laden
   bst    temp, 1                  ; Bit 1 in T-Flag sichern
   bld    temp, 6                  ; Bit 6 (2) aus T-Flag laden
   bst    temp, 2                  ; Bit 2 in T-Flag sichern
   bld    temp, 5                  ; Bit 5 (1) aus T-Flag laden
   bst    temp, 3                  ; Bit 3 in T-Flag sichern
   bld    temp, 4                  ; Bit 4 (0) aus T-Flag laden
   swap   temp                     ; Vertauschen, damit Nibbles wieder
an richtiger Stelle stehen
   andi   temp, 0b00001111         ; oberes Nibble wieder auf Null
setzen
   ret                             ; wieder zurueck

Gibt es da einen einfacheren Weg?

Gruß Uwe

von Danny (Gast)


Lesenswert?

Habe zwar erst mit Assembler angefangen, aber ich weise die LCD-Pins
folgendermasen zu:
z.B.:
.equ     E        = PD0
.equ     RW       = PD1
.equ     RS       = PD2
.equ     LCD_cntr = PortD
.equ     LCD_data = PortB
.equ     BF       = PB7

damit ersparst du dir den ganzen port-dreh-gedöns, da du die ports nur
einmal zuweist.

gruß danny

von Uwe Naumann (Gast)


Lesenswert?

Für die Steuerports (RW/E/RS) mach ich das genauso. Aber wie mache ich
das für einen Port wenn ich die Datenleitungen vertausche?

Normal wäre ja folgendes (4-Bit-Mode):

LCD    AVR
D4     PD0
D5     PD1
D6     PD2
D7     PD3

Bei mir ist es aber:

LCD    AVR
D4     PD3
D5     PD2
D6     PD1
D7     PD0

Die Datenleitungen sind vertauscht, weil sich das aufgrund der
Bauteillage wesentlich einfacher routen lässt.

Wie kann ich sowas definieren, wenn ich dann quasi einen Wert an den
ganzen Port ausgeben will?

Gruß Uwe

von Stefan Kleinwort (Gast)


Lesenswert?

Ich mache sowas gerne mit Tabellen, der datenwert ist dabei der
Tabellenoffset. Damit kannst Du beliebige Zuordnungen machen. Ob es
sich in diesem Fall aber wirklich lohnt, ist eine andere Frage.

Stefan

von Peter D. (peda)


Lesenswert?

Weniger Code braucht man, wenn man wiederholte Sachen in einer Schleife
macht:

swapnibble:
        ldi     r17, 0x10
swn1:   ror     r16
        rol     r17
        brcc    swn1

Dauert zwar etwas länger, aber die Ausgabe zum LCD darf man ja eh nicht
zu schnell machen.


Peter

von Uwe Naumann (Gast)


Lesenswert?

Hallo Peter,

erst hab ich etwas zweifelhaft auf das Ganze geschaut, aber bei näherer
Betrachtung muss ich sagen: Wirklich elegant gelöst.

Danke für den Hinweis. Ich vergesse wahrscheinlich viel zu oft die
Statusregister, die man nutzen könnte.

Gruß Uwe

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.