Wie kann ich ein Port invertieren

Gast #1553579
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
Gast #1553598
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.
#1553775
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.
Gast #1553940
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.)
Gast #1555123
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
Gast #1556711
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
#1556837
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.
1
;  n = ((n >> 1) & 0x55) | ((n << 1) & 0xaa);
2
;  n = ((n >> 2) & 0x33) | ((n << 2) & 0xcc);
3
;  n = ((n >> 4) & 0x0f) | ((n << 4) & 0xf0);
4

5
        .def    wr0 = r16
6
        .def    wr1 = r17
7
;input: wr0
8
;output: wr0
9
;
10
mirror:
11
        mov     wr1, wr0
12
        lsr     wr0
13
        andi    wr0, 0x55
14
        lsl     wr1
15
        andi    wr1, 0xAA
16
        or      wr0, wr1
17
        mov     wr1, wr0
18
        lsr     wr0
19
        lsr     wr0
20
        andi    wr0, 0x33
21
        lsl     wr1
22
        lsl     wr1
23
        andi    wr1, 0xCC
24
        or      wr0, wr1
25
        swap    wr0


Peter
Gast #1556907
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
Gast #1557333
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren