www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie kann ich ein Port invertieren


Autor: wimmer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich arbeite an der Programmierung mein ATmege 32 zur Steuerung ein 
Grafik LCD.

Ich verwende Bascom AVR.

Aus technischen Gründen will ich mein Dataport invertieren.

Also anstatt:

LCD_Port0 an DP0
LCD_Port1 an DP1 usw.

will ich:

LCD_Port0 an DP7
LCD_Port1 an DP6 usw.

programmieren.

Mein Befehl lautet:

Config Graphlcd = 128 * 64sed , Dataport = Portb usw....

Wie man hier sieht, diffiniert man das Gesamte Port auf einmal.

Irgendeine Idee??

Grüße

Wimmer

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Irgendeine Idee??

Schließ das Display richtig an und benutze die BASCOM
Libs. Ansonsten mach es zu Fuß. Die Reihenfolge der Bits
so wie du es möchtest zu ändern ist schon ziemlicher
Deppenkram.

Autor: Phantomix Ximotnahp (phantomix) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre in C eine schöne Übung für den Präprozessor :-)



  #define DISPLAY_PORT PORTC
  #define DISPLAY_DDR  DDRC

  #define DISPLAY_DB7    0
  #define DISPLAY_DB6    1
  #define DISPLAY_DB5    2
  #define DISPLAY_DB4    3
  #define DISPLAY_BGLED  4
  #define DISPLAY_E    5
  #define DISPLAY_RW    6
  #define DISPLAY_RS    7

#define DISPLAY_DATA_BITMASK  (~((1 << DISPLAY_DB7) | (1 << DISPLAY_DB6) 
| (1 << DISPLAY_DB5) | (1 << DISPLAY_DB4)))


usw usf.
Da du aber eh mit bascom arbeitest,
> schließ das Display richtig an und benutze die BASCOM Libs.

Autor: Thomas W (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Schließ das Display richtig an und benutze die BASCOM
> Libs. Ansonsten mach es zu Fuß. Die Reihenfolge der Bits
> so wie du es möchtest zu ändern ist schon ziemlicher
> Deppenkram.

Moin,

wenn ich das richtig verstehe will der Fragesteller die Bits nicht 
invertieren sondern spiegeln?

Ich stand auch schonmal vor dem Problem, es handelte sich um eine 
Auftragsarbeit, bei der die gespiegelte Reihenfolge halt vorgegeben war. 
In Assembler aber keine grosse Herausforderung, gibt es in Bascom einen 
Befehl zum Rotieren eines Registers?
Wenn ja, dann acht mal bitweise nacheinander das Quellregister in eine, 
das Zielregister in die andere Richtung rotieren lassen, dann liegt das 
Bitmuster gespiegelt vor.

(Die bessere Alternative, wenn moeglich: Schließ das Display richtig an 
und benutze die BASCOM Libs.)

Autor: wimmer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich meinte in der tat Port spiegeln.
Die Idee mir C habe ich auch gehabt bzw. mittels Bascom versucht.
Ich habe die Datei m32def.dat mit dem Editor geöffnet und so 
manipulliert, dass PortB z.B. so diffiniert, dass DP.0 = 7 ist und nicht 
DP.0 = 0, wie es ursprunglich diffeniert ist. Leider hat es nicht 
geklappt.
Der hintergründ der ganze Gischichte ist, dass die Beine meines Displays 
gespiegelt sind.

Grüße

Wimmer

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Der hintergründ der ganze Gischichte ist, dass die Beine meines Displays
>gespiegelt sind.

Eher falsch angeschlossen.

MfG Spess

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst auch die GLCD.lib anpassen. Sichern nicht vergessen, da diese 
beim Update gern mal überschrieben werden...

Autor: Dönermeister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit '~' ohne die 's

Autor: A.Drei (allu) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Idee mir C habe ich auch gehabt bzw. mittels Bascom versucht.
>Ich habe die Datei m32def.dat mit dem Editor geöffnet und so
>manipulliert, dass PortB z.B. so diffiniert, dass DP.0 = 7 ist und nicht
>DP.0 = 0, wie es ursprunglich diffeniert ist. Leider hat es nicht
>geklappt.

Natürlich hat das nicht geklappt. Da steht drin, wie die Hardware des 
Prozessors in der Realität ist und nicht wie man sie sich wünscht.


Wie man es lösen kann hat Dir Thomas W empfohlen:

>Wenn ja, dann acht mal bitweise nacheinander das Quellregister in eine,
>das Zielregister in die andere Richtung rotieren lassen, dann liegt das
>Bitmuster gespiegelt vor.

Übrigens kann man in Bascom direkt auf Assembler umschalten und wieder 
Zurück. In Assembler geht das Spiegeln des Portwerts blitzschnell.

Gruss   allu

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A.Drei (allu) schrieb:
> Übrigens kann man in Bascom direkt auf Assembler umschalten und wieder
> Zurück. In Assembler geht das Spiegeln des Portwerts blitzschnell.
;  n = ((n >> 1) & 0x55) | ((n << 1) & 0xaa);
;  n = ((n >> 2) & 0x33) | ((n << 2) & 0xcc);
;  n = ((n >> 4) & 0x0f) | ((n << 4) & 0xf0);

        .def    wr0 = r16
        .def    wr1 = r17
;input: wr0
;output: wr0
;
mirror:
        mov     wr1, wr0
        lsr     wr0
        andi    wr0, 0x55
        lsl     wr1
        andi    wr1, 0xAA
        or      wr0, wr1
        mov     wr1, wr0
        lsr     wr0
        lsr     wr0
        andi    wr0, 0x33
        lsl     wr1
        lsl     wr1
        andi    wr1, 0xCC
        or      wr0, wr1
        swap    wr0


Peter

Autor: A.Drei (allu) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder auch anders, an Bascom angepasst:

Dim Zum_display As Byte   ' Übergabe und Rückgabe

Wert steht ungespiegelt in "zum_Display"

$asm
Spiegel:
      Loadadr Zum_display , X
      ld   r18, X
      ldi  r20, 8
Spiegel_10:
      rol  r18                        'Zeichen wenden
      ror  r19
      dec  r20
      brne spiegel_10
      st    X, r19
$end Asm

Wert gespiegelt in "zum_Display" ... und ab damit zum Display

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sind dann aber 40 Zyklen statt 15.
Du sagtest doch blitzschnell.


Peter

Autor: A.Drei (allu) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, ok, Du hast gewonnen, geniales Programm.
Selbst meine einfachste Variante braucht zum spiegeln immer noch 16 
Zyklen.
Und ist auch noch einen Befehl länger.

Dim Zum_display As Byte   ' Übergabe und Rückgabe
$asm
Spiegel:
      Loadadr Zum_display , X
      ld   r18, X
      rol  r18
      ror  r19
      rol  r18
      ror  r19
      rol  r18
      ror  r19
      rol  r18
      ror  r19
      rol  r18
      ror  r19
      rol  r18
      ror  r19
      rol  r18
      ror  r19
      rol  r18
      ror  r19
      st    X, r19
$end Asm

Gruß  allu

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.