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
>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.
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.
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.)
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
Hi >Der hintergründ der ganze Gischichte ist, dass die Beine meines Displays >gespiegelt sind. Eher falsch angeschlossen. MfG Spess
Du kannst auch die GLCD.lib anpassen. Sichern nicht vergessen, da diese beim Update gern mal überschrieben werden...
>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
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
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
Das sind dann aber 40 Zyklen statt 15. Du sagtest doch blitzschnell. Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.