Hallo,
ich habe ein Powertip PG12864A Display mit 128x64 Pixeln an mein Pollin
Evaluationsboard angeschlossen. Das Display wird über einen ATmega 8
angesteuert.
Mein Problem ist nun, dass ich auf der linken Displayhälfte(CS1 = high)
normal schreiben kann, wenn ich jedoch auf der rechten Displayhälfte
schreiben will(CS2 = high), wird ebenfalls auf der linken Seite
geschrieben, allerdings nicht genau die selben Pixelmuster sondern
irgendwas komisches. Als Test hab ich z.b. ein Byte 10101010 übertragen,
welches auf der rechten Hälfte so angezeigt wird, auf der linken jedoch
00111111.
Wenn ich aber beide Chips anspreche, also CS1 und CS2 high,
funktionieren beide Hälften wie gewollt.
Im Programm habe ich schon CS1 und CS2 vertauscht, daran kann es
normalerweise nicht liegen, und auch irgendwelche Zusatzfunktionen an
den Ports C und D, welche ich abschalten müsste, habe ich nicht
gefunden.
Hier mein Code, am Anfang stehen auch direkt die Pinzuordnungen zum
Display.
1
.include "m8def.inc"
2
3
.def temp = r16
4
.def param = r17
5
.def counter = r18
6
.def counter2 = r19
7
.def addreg = r20
8
9
.equ LCD_DP = PORTD ;LCD Data Port
10
.equ LCD_DPD = DDRD ;LCD Data Port Direction
11
12
.equ LCD_CP = PORTC ;LCD Control Port
13
.equ LCD_CPD = DDRC ;LCD Control Port Direction
14
15
.equ LCD_RS = PORTC0 ;LCD Register Select Pin
16
.equ LCD_RW = PORTC2 ;LCD Read/Write Pin
17
.equ LCD_EN = PORTC1 ;LCD Enable Pin
18
.equ LCD_CS1 = PORTC3 ;LCD Chip Select 1 Pin
19
.equ LCD_CS2 = PORTC4 ;LCD Chip Select 2 Pin
20
.equ LCD_RE = PORTC5 ;LCD Reset Pin
21
22
23
24
.org 0x000
25
rjmp reset
26
27
28
29
reset:
30
31
ldi temp, HIGH(RAMEND)
32
out SPH, temp
33
ldi temp, LOW(RAMEND)
34
out SPL, temp
35
36
ldi temp, 0xFF
37
out LCD_DPD, temp ;LCD Data Port als Ausgang setzen
38
39
ldi temp, 0x00
40
out LCD_DP, temp
41
42
ldi temp, 0xFF
43
out LCD_CPD, temp ;LCD Control Port als Ausgang setzen
Ok ich habe das Problem nun ein wenig eingegrenzt:
Folgenden Code habe ich in der Schleife:
1
lpm temp, Z+
2
3
;ldi param, 3
4
;rcall LCD_set_page
5
mov param, counter
6
rcall LCD_set_x
7
out LCD_DP, temp
8
rcall LCD_data_two
9
10
11
12
add counter, addreg
13
cpi counter, 54
14
brsh nop_loop
Dies funktioniert nicht, auf der rechten Seite werden die gewünschten
Daten geschrieben (Buchstaben, tut aber nichts zur Sache) und links(also
linke Hälfte) werden komische Zeichen ausgegeben. Dabei ist mir
aufgefallen, dass jeweils der Befehl, der vorher durch den Aufruf "rcall
LCD_set_x" übertragen wurde, angezeigt wird, also als ob man das falsche
Register gewählt hat. Dummerweise werden die Register in der
Befehlsroutine nichtmal angerührt, und ich bin mir ziemlich sicher dass
das Register korrekt ist.
Allerdings werden bei einem Befehl immer beide Chips angesprochen,
während die Schreiboperation danach nur den zweiten anspricht. Testweise
habe ich beim Befehl auch mal nur den zweiten Chip angesprochen, dann
wird es korrekt angezeigt. Allerdings sollte es auch so gehen, dass
beide Chips den Befehl mitkriegen.
Hauptproblem ist im Moment also, dass auf irgendeine komische Art und
Weise die Befehlsdaten im falschen Register landen...
Hi
Vielleicht solltest du mal das Timing überarbeiten. RS,RW und CS sollten
gesetzt werden, bevor E auf H und nachdem E wieder auf L gesetzt wird.
MfG Spess
Naja habs jetzt eh gelöst, indem ich einfach ein globales Chipselect
Register gemacht habe, dass dann immer in den aufrufen für Befehl bzw.
Daten benutzt wird. Das muss man dann halt vor dem jeweiligen Aufruf
setzen, aber dadurch spart man sich quasi die ganzen Prozeduren für Chip
1 und Chip 2 und hat eine allgemeine.
Das Timing werde ich trotzdem überarbeiten, ist sicherer...