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


von wimmer (Gast)


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

von holger (Gast)


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.

von Phantomix X. (phantomix)


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.

von Thomas W (Gast)


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.)

von wimmer (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

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

Eher falsch angeschlossen.

MfG Spess

von Peter (Gast)


Lesenswert?

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

von Dönermeister (Gast)


Lesenswert?

mit '~' ohne die 's

von A.Drei (allu) (Gast)


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

von Peter D. (peda)


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

von A.Drei (allu) (Gast)


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

von Peter D. (peda)


Lesenswert?

Das sind dann aber 40 Zyklen statt 15.
Du sagtest doch blitzschnell.


Peter

von A.Drei (allu) (Gast)


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

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.