Forum: Mikrocontroller und Digitale Elektronik DOGXL Page und Column


von Max (Gast)


Lesenswert?

Tag allerseits,

ich habe mir ein DOGXL (160x104 Pixel, UC1610 Controller) gekauft und an 
meinen AT89C51CC03 angeschlossen, es läuft einwandfrei, ich habe auch 
schon Bilder ausgegeben (durch Auto-Increment-Einstellungen vom RAM).
Allerdings sind ein zwei Dinge sehr seltsam:

Links oben sieht es aus als währe dort Page 0 in Column 0-3 nicht 
ansprechbar, wenn ich als Column 0 einstelle und als Page 0, dann legt 
er mir das Byte dass ich ihm schicke aber nicht genau links oben in die 
Ecke, sondern ca. 4 pixel weiter rechts, das wirkt wie ein kleiner 
Bereich der einfach nicht ansprechbar ist, wenn ich nun Page 1 
einstelle, passt das mit den Columns, nur bei Page 0 ist alles 
verschoben, weiß vielleicht jemand warum?

und das andere Problem ist beim setzen der Pages: wenn ich als Page 0 
einstelle, ist es die oberste Reihe wie es sein soll, stelle ich als 
Page z.B. 2 ein, ist das ganze viel weiter unten als nur 8 Pixel

evtl. hängen die zwei probleme ja zusammen, jedenfalls bin ich ratlos :/

Hier mal meine Initialisierungssequenz:

  call StartTWC
  call ConnectLCD
  mov VAL, #11110001b ; Com End Command
  call SendByte
  mov VAL, #01100111b ; Com End Value
  call SendByte
  mov VAL, #11000000b ; LCD Mapping
  call SendByte
  mov VAL, #01000000b ; Startline Value
  call SendByte
  mov VAL, #01010000b ; Startline Value
  call SendByte
  mov VAL, #00101011b ; Set Panelloading
  call SendByte
  mov VAL, #11101011b ; Set Bias
  call SendByte
  mov VAL, #10000001b ; Contrast Command
  call SendByte
  mov VAL, #01011111b ; Contrast Value
  call SendByte
  mov VAL, #10001001b ; Auto Increment Options
  call SendByte
  mov VAL, #10101111b ; Enable Display
  call SendByte
  call EndTWC

StartTWC und EndTWC senden nur die Start und End-Bedingung, hier noch 
das ConnectLCD und das SendByte Unterprogramm:

ConnectLCD:
  mov R0, #6
  mov R1, #10000000b
  ConnectLoop:
    mov A, ADR
    anl A, R1
    cjne A, #0, AdrHigh
    call SendLow
    jmp AdrLow
    AdrHigh:
    call SendHigh
    AdrLow:
    mov A, R1
    rr A
    mov R1, A
  djnz R0, ConnectLoop
  call SendCDRW
  call Acknowledge
  ret

SendByte:
  mov R0, #8
  mov R1, #10000000b
  ByteLoop:
    mov A, VAL
    anl A, R1
    cjne A, #0, ValHigh
    call SendLow
    jmp ValLow
    ValHigh:
    call SendHigh
    ValLow:
    mov A, R1
    rr A
    mov R1, A
  djnz R0, ByteLoop
  call Acknowledge
  ret

Ich bin mittlerweile echt ratlos :/
Hoffe ihr könnt mir weiter helfen >.<

Mfg, Max

von R. B. (rabis)


Lesenswert?


von Max (Gast)


Lesenswert?

Hallo, ich bins wieder, danke für den Link, allerdings bringt der mich 
nicht wirklich weiter da ich das ganze mit I²C steuere.

Was aber interessant ist, die Page-Ansteuerung funktioniert ja falsch, 
aber es ist irgendwie ein gewisses Muster zu erkennen:

Gesendete Page Zahl   |   Von UC1610 angesteuerte Page
------------------------------------------------------
0                     |   0
1                     |   1
2                     |   0
3                     |   1
4                     |   0
5                     |   1
6                     |   0
7                     |   1
8                     |   6
9                     |   7
10                    |   6
11                    |   7
12                    |   6
13                    |   7
14                    |   6
15                    |   7
16                    |   0
17                    |   1
18                    |   0
19                    |   1
20                    |   0
21                    |   1
22                    |   0
23                    |   1
24                    |   6
25                    |   7

Allerdings komm ich einfach nicht drauf warum genau diese Pages 
angesteuert werden, ich bin mittlerweile auf C umgestiegen (Keil 
µVision)
Hier mal meine Methode um die Page ein zu stellen bzw. um Bytes zu 
senden/lesen:

 void SendByte(unsigned char Value)
 {
   unsigned char i;
  unsigned char shifter = 128;
  for (i = 0; i < 8; i++)
  {
    if ((Value & shifter) == 0)
      Data = 0;
    else
      Data = 1;
    Clock = 1;
    Clock = 0;
    shifter = (shifter >> 1);
  }
  Clock = 1;
  Clock = 0;
 }

 unsigned char ReadByte()
 {
   unsigned char i;
  unsigned char value;
  for (i = 0; i < 8; i++)
  {
    value = (value | Data);
    value = (value << 1);
    Clock = 1;
    Clock = 0;
  }
  Clock = 1;
  Clock = 0;
  return value;
 }

 void SetPage(unsigned char Adress, unsigned char Page)
 {
   Connect(0, 0, Adress);
  SendByte(0x60 | (Page & 00011111));
  Disconnect();
   Connect(1, 1, Adress);
  ReadByte();
  Disconnect();
 }

Ich komm einfach auf keine Lösung und finde keinen Fehler, weiß 
vielleicht irgend jemand weiter?

von XMEGA (Gast)


Lesenswert?

Hallo,


Max schrieb:
> Ich komm einfach auf keine Lösung und finde keinen Fehler, weiß
> vielleicht irgend jemand weiter?

bin mir nicht sicher ob das das Richtige ist?

* +--------------+  +--------------+
 * |              |  |              |
 * | X =   0..159 |  | X = 160.. 319|
 * | Y =   0.. 15 |  | Y =   0.. 15 |
 * |              |  |              |
 * +--------------+  +--------------+
 *
 * +--------------+  +--------------+
 * |              |  |              |
 * | X =   0..127 |  | X = 128..255 |
 * | Y =  16.. 31 |  | Y =  16.. 31 |
 * |              |  |              |
 * +--------------+  +--------------+
 *
 * +--------------+  +--------------+
 * |              |  |              |
 * | X =   0..127 |  | X = 128..255 |
 * | Y =  32.. 47 |  | Y =  32.. 47 |
 * |              |  |              |
 * +--------------+  +--------------+
 *
 * +--------------+  +--------------+
 * |              |  |              |
 * | X =   0..127 |  | X = 128..255 |
 * | Y =  48.. 65 |  | Y =  48.. 65 |
 * |              |  |              |
 * +--------------+  +--------------+


Gruß XMEGA

von spess53 (Gast)


Lesenswert?

Hi

>Ich komm einfach auf keine Lösung und finde keinen Fehler, weiß
>vielleicht irgend jemand weiter?

Ich tippe auf deine grenzwertigen I2C-Routinen. Ich habe das DOG-XL 
schon in den Fingern gehabt. Mit Soft-SPI ging das problemlos.

MfG Spess

von Max (Gast)


Lesenswert?

@ XMEGA:
Sorry aber ich versteh nicht ganz was genau du damit meinst, könntest du 
es vll erklären?

@ spess53:
Was genau meinst du mit Grenzwertige I²C Routinen? Die Initialisierung 
des Displays funktioniert ja einwandfrei, also sollte die I²C Verbindung 
richtig funktionieren.

von spess53 (Gast)


Lesenswert?

Hi

>Was genau meinst du mit Grenzwertige I²C Routinen? Die Initialisierung
>des Displays funktioniert ja einwandfrei, also sollte die I²C Verbindung
>richtig funktionieren.

Z.B. vermisse ich die unterschiedliche Behandlung des ACK-Bits beim 
Schreiben bzw. Lesen. Wie teilst du dem Display mit, das das Lesen 
beendet wird?

MfG Spess

von Max (Gast)


Lesenswert?

Das habe ich nur nicht gepostet, aber die Komunikation des I²C Buses ist 
schon ordentlich und vollständig, hab nur das wichtigste hier gezeigt.

Aber es gibt gute Neuigkeiten.. ich habe meinen fehler gefunden, ich 
Idiot habe eine Zahl als Binärzahl einfach reingeschrieben (noch aus ASM 
gewohnheiten) ... aber in Keil geht nur Dec oder Hex -.-
Unglaublich wie man manchmal auf dem Schlauch stehen kann! >.<

Trotzdem danke für eure Hilfe!

Hab nun nur noch das Problem dass die Column 0 um 5 Pixel nach Rechts 
verschoben is, das bekomm ich aber auch noch irgendwie gelöst :)

Mfg, Max

von Andreas H. (heilinger)


Lesenswert?

Hallo,

ich benutze auch das DOGXL, steuere es aber mit SPI an

Bei der Kommunikation per I2C steht im Datenblatt, dass
"Nach den Befehlen zum Setzen der Page- bzw. Column-Adresse muss immer 
zuerst ein Dummy-Byte gelesen werden"

Kann das evtl. zu dem Fehler führen?!

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.