3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display

  • 1
  • 2
  • 3
  • Page 1 of 3
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display

 · 
Posted: 24.01.2018 - 18:01  ·  #1
Hallo,

ich habe mich bsi jetzt noch NIE mit Grafik-Displays beschäftigt, deswegen ist das jetzt "Neuland" für mich.

Kennt Jemand den LCD-Controller UC1698 und hat mit diesen Erfahrungen mit der SPI-Schnittstelle 3Draht / 4Draht. Kann man die Zeichenfunktionen vom ELAB an einen neuen Controller-Typ anpassen?

Mangels Erfahrung bin ich mir noch nicht ganz sicher, wie ich da am besten Anfangen sollte um die Funktionen von AVRco nutzen zu können.

Controller Beschreibung

Anschaltung
Display

Gruß
Thorsten
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display

 · 
Posted: 24.01.2018 - 19:13  ·  #2
Hallo Thorsten,

was für einen Mega/XMega hast du denn dafür vorgesehen? Wenn du im uC arbeiten willst und du das ab und zu zum Display schickst (Display-Refresh) wird das einfacher zu programmieren. Du mußt in der Funktion GraphIOS die Routinen für die Display-RAM-Adressierung und Datenübertragung schreiben, brauchst aber 256x64/8=2048 Byte RAM im uC für den Bildspeicher. Wenn du direkt im Display arbeiten willst, muß es möglich sein das Display-RAM via SPI zu lesen, modifizieren und zurück zu schreiben. Dafür müssen in der GraphIOS mehr Funktionen programmiert werden (siehe Handbuch). Und dann ist es noch möglich nur schreibend im Display zu arbeiten, jedoch ist es dann nicht möglich Änderungen durchzuführen, du überschreibst quasi immer und mußt genau überlegen, was da passieren soll.

Gruss
Harry
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display

 · 
Posted: 01.02.2018 - 17:40  ·  #3
Hallo Harry,

also verstehe ich das richtig, die eigentliche Anpassung, damit das Graphic-System vom AVRco funktioniert, findet hier statt:
Code
UserDevice GraphIOS (cmd : byte; adr : word; mask, pixel, color : byte) : byte;
UserDevice GraphIOS (cmd : byte; adr : word; mask, pixel : byte) : byte;
begin
// commands passed to user defined function "GraphIOS"
// 0 display init adr = none mask = none pixel = none [color = none] result = none
// 1 display clear adr = fillpatt mask = none pixel = none [color = none] result = bool
// 2 write byte adr = byte adr mask = byte pixel = mode [color = byte] result = none
// 3 read byte adr = byte adr mask = none pixel = none [color = none] result = byte
// 4 set pixel adr = byte adr mask = mask pixel = pixel [color = byte] result = none
// 5 clear pixel adr = byte adr mask = mask pixel = pixel [color = byte] result = none
// 6 xor pixel adr = byte adr mask = mask pixel = pixel [color = byte] result = none
case cmd of
0 : cmd:= 0; | // display init
1 : cmd:= 1; | // display clear
2 : cmd:= 2; | // write byte with attributes
3 : cmd:= 3; | // read byte
4 : cmd:= 4; | // set pixel
5 : cmd:= 5; | // clear pixel
6 : cmd:= 6; | // xor pixel
endcase;
return(cmd);
end;


Ich habe mir einige der DEMOS vom AVRco angeschaut, dabei ist mir aufgefallen, dass diese Struktur nicht überall gleich / vorhanden ist. Das hatte mich dann doch etwas verwundert.

Denn eigentlich müsste dann doch immer der INIT auf "cmd 0" liegen oder?

Wie die Daten geschrieben werden Port, SPI oder TWI lege ich dann in dieser CMD-Struktur fest.

Mit
Code
Define
...
        LCDGraphic  = 240, 128, 8;     {x-pix, y-pix, accesswidth}
        GViewports  = 4, iData;        {logical ViewPorts, scalings}
        DefCharSet  = 'Graphchars.pchr';{FileName}
        TGraphStr   = 20;              {Graphic Text String Length}


Lege ich dann die Grundlage für die Grafik-Funktionen vom "Graphic-System" fest, richtig?

Gruß
Thorsten
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display

 · 
Posted: 01.02.2018 - 18:01  ·  #4
Hi Thorsten,

wenn du im Display zeichnest, müssen die Funktionen (evtl. nicht alle) definiert werden. Init z.b. kannst du auch leer lassen und eine eigene Funktion schreiben und aufrufen .... diese natürlich auch aus der GraphIOS aus. Wenn du mit Shadow-RAM (ich nenne es mal so, weil alles im RAM des Controllers passiert und ein gDispRefresh es zum LCD schiebt) arbeitest ist das GraphIOS wesentlich einfacher und beschränkt sich auf das positionieren eines Blockanfangs und das schreiben der Daten.
Das was du gepostet hast ist arbeiten im Display und dazu muss das Display-RAM gelesen werden können (das ist nicht bei allen der Fall). Bei 1 Bit/Pixel mag das noch gehen, aber bei so seltsamen Controllern mit z.B. 2 oder 4 Bit/Pixel wirds lustig.

Gruss
Harry
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display

 · 
Posted: 02.02.2018 - 08:51  ·  #5
Hallo Harry,

erstmal vielen Dank für die Infos und Tipps. Nach den letzten Tipps von Dir, habe ich auch die Vorgehensweise für Anbindung an AVRco (Graphic Systems) verstanden!

Ich werde Heute einen Beispielcode an den Controller anpassen und wenn es läuft in den Bereich Software hier im Forum hochladen.

Das Display macht einen guten Eindruck und ist sehr günstig ca. 8 $ zzgl. Fracht und Zoll.

Der Controller hat aber leider den Nachteil: Es ist eigentlich ein RGB / Graustufencontroller

Deswegen muss ich die Bits aus dem AVRco Graphic System vor dem schreiben im GraphIOS anpassen.

Gruß
Thorsten
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display

 · 
Posted: 04.02.2018 - 17:48  ·  #6
So... es geht voran, aber ich habe wohl noch 1-2 Kleine Probleme.

Im Bild 1 habe ich merkwürdiger Weise zwischendrinnen Freiräume und der Text "0123456789" wiederholt sich hinten noch mal. Noch keine Ahnung warum..

Beim Bild 2 ist das Verhalten komisch, wenn ich beim angezeigten Bild 1 dann ein gDrawline() mache und dann ein Refresh scheint es fast so, als ob sich die Auflösung umschaltet. Ich muss wohl noch mal etwas tiefer in die Anleitung vom Controller reingehen.

Gruß
Thorsten
You must be logged in or your permissions are to low to see this Attachment(s).
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display

 · 
Posted: 04.02.2018 - 18:29  ·  #7
Hi Thorsten,

das sieht so aus, als ob zwischen drin Pixel fehlen. Versuch mal immer ein Word oder ein Array[0..1] of Byte (keine 2 einzelnen Byte) in einem Rutsch zu schreiben. Ich zeichneals erstes immer ein Rechteck mit maximaler Größe zum testen. Bist du sicher, daß nicht versehentlich die Command/Data-Leitung zwischendrin wechselt?

Gruss
Harry
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display

 · 
Posted: 06.02.2018 - 12:19  ·  #8
Hallo Harry,

da stimmt was nicht mit der Anbindung zur GraphicFunctions von AVRco.
Wenn ich per Hand die Linien und Punkte setze stimmt alles und ich habe keine Zwischenräume. Also habe ich da wohl noch ein Anbindungs Problem.

Code
UserDevice GraphIOS (cmd : byte; data : byte);
begin
// commands passed to user defined function "GraphIOS"
// cmd 0 set row address data = row
// cmd 1 write data byte data = content
if cmd = 0 then
  // display_address( x, y ) 
  display_address( 0, data);  // set row addr = data

else
  DispBW2RGB( data );
endif;
end GraphIOS;


Code
// Setze auf Spalte / Reihe
//
procedure display_address( DispSpalte : byte;  DispZeile : Byte);
var
 LSB : BYTE;
 MSB : BYTE;

begin
// Spalte/Col=0 to 263  Zeile/Row=0 to 63

// Displayspalte / Column address LSB
  LSB:= DispSpalte AND $0F;
   WriteLCD( $00 OR LSB, false );
// Displayspalte / Column address MSB
  MSB:= DispSpalte AND $F0;
   WriteLCD( $10 OR MSB SHR 4, false );

// Displayzeile / Row address LSB
  LSB:= DispZeile AND $0F;
   WriteLCD( $60 OR LSB, false );
// Displayzeile / Row address MSB
  MSB:= DispZeile AND $F0;
   WriteLCD( $70 OR (MSB SHR 4), false );

DebugOut( 'Y MSB: '+ByteToStr( MSB ) +' /  LSB: '+ByteToStr(LSB) );
end display_address;


Braucht man beim CMD0 wirklich nur das setzen der Zeile?

Gruß
Thorsten
  • 1
  • 2
  • 3
  • Page 1 of 3
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   138   152 · Page-Gen-Time: 0.020187s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI