www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie Bits effektiv vertauschen?


Autor: Uwe Naumann (Gast)
Datum:

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

Autor: Danny (Gast)
Datum:

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

Autor: Uwe Naumann (Gast)
Datum:

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

Autor: Stefan Kleinwort (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Uwe Naumann (Gast)
Datum:

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

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.