closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

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



pvs-deck online
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 864
Registered: 02 / 2009
Homepage Private message
Subject: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 24.01.2018 - 18:01   -  
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
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 53
Posts: 1360
Registered: 03 / 2003
Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 24.01.2018 - 19:13   -  
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
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
This post has been edited 1-times. Last edit: 24.01.2018 - 19:14 by Harry.
go down go up
pvs-deck online
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 864
Registered: 02 / 2009
Homepage Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 01.02.2018 - 17:40   -  
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
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 53
Posts: 1360
Registered: 03 / 2003
Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 01.02.2018 - 18:01   -  
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
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
pvs-deck online
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 864
Registered: 02 / 2009
Homepage Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 02.02.2018 - 08:51   -  
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
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
pvs-deck online
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 864
Registered: 02 / 2009
Homepage Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 04.02.2018 - 17:48   -  
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).
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 53
Posts: 1360
Registered: 03 / 2003
Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 04.02.2018 - 18:29   -  
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
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
pvs-deck online
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 864
Registered: 02 / 2009
Homepage Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 06.02.2018 - 12:19   -  
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
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 1-times. Last edit: 06.02.2018 - 12:59 by pvs-deck.
go down go up
pvs-deck online
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 864
Registered: 02 / 2009
Homepage Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 06.02.2018 - 16:31   -  
Beim einzelnen schreiben habe ich noch irgendwo einen Denkfehler.

Schreibe ich ein Byte $FF kommt keine Anzeige, Schreibe ich ein Word $FFFF oder zwei Byte $FF erhalte ich 3 Punkte auf dem Display. Ich muss da nochmal genauer im Datenblatt schauen.
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
pvs-deck online
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 864
Registered: 02 / 2009
Homepage Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 06.02.2018 - 19:45   -  
@rolf;
In welcher Reihenfolge werden die BITs auf dem Schreibbefehl rausgegeben?

Angenommen ich möchte links oben folgendes Binär-Muster auf dem Display sehen:

10011010

dann verlangt mein Controller auch diese Reihenfolge im Byte:

Byte %10011010

Erster Punkt links im Display ist BIT7

Oder ist es bei Deinen Grafikfunktionen so, dass dies bei Dir als BIT 0 ausgegeben wird?
Ich habe bei mit Zerstückelungen auf dem Display, bei dem AVRco-Funktionen die ich nicht nachvollziehen kann.

Gruß
Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
rh offline
Administrator
Avatar
Gender: male
Location: GERMANY  Germany
Age:
Posts: 5303
Registered: 03 / 2002
Homepage Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 06.02.2018 - 21:00   -  
Hallo Thorsten
ganz links ist bit7. Ich habe den Eindruck dass das Display 3bits pro Pixel hat. Ist das so?
rolf
Cars don't buy cars -- Autos kaufen keine Autos.
Henry Ford
go down go up
pvs-deck online
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 864
Registered: 02 / 2009
Homepage Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 06.02.2018 - 21:21   -  
Quote by rh

Hallo Thorsten
ganz links ist bit7. Ich habe den Eindruck dass das Display 3bits pro Pixel hat. Ist das so?
rolf


Hallo rolf,

yepp das ist so. Läuft jetzt :-D

Den Bitmap bekomme ich noch nicht zum laufen, aber da schaue ich dann gleich mal. Wenn es geht, mache ich das Testprogramm fertig und lade es in den Softwarebereich.

Gruß
Thorsten
You must be logged in or your permissions are to low to see this Attachment(s).
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 53
Posts: 1360
Registered: 03 / 2003
Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 06.02.2018 - 21:27   -  
Hi Thorsten,

auf die Schnelle:
Column-Adress ist immer $00,$10 (falls das Display so gebaut wurde, daß bei X=0 auch das Display-RAM=0 ist. Ich hab ein Display hier, bei dem wurden die ersten 16 Column-Treiber nicht angeschlossen ;).

Row-Adress ist $60 or ($0F and Data), $70 or (($0F and Data) shr 4))

Der erste Wert ist immer das Low-Nibble (Bit 3...0) und der zweite das High-Nibble (Bit 7...4)

Define hast du linear gewählt?

Gruss
Harry

.... das war zugleich geschrieben :) .... ok es funktioniert. Gratuliere.
Das mit den Bitmaps kenne ich vom SSD1322 (schau mal im Softwarebereich)

noch was: hast du da ein gDrawRect(0,0,263,63,$FF) in deinem Programm? Wenn ja stimmt was noch nicht. So wie das aussieht fehlen die beiden senkrechten Linien davon.
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
This post has been edited 2-times. Last edit: 06.02.2018 - 21:34 by Harry.
go down go up
pvs-deck online
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 864
Registered: 02 / 2009
Homepage Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 07.02.2018 - 00:49   -  
Hallo Harry.
Quote by Harry
Column-Adress ist immer $00,$10 (falls das Display so gebaut wurde, daß bei X=0 auch das Display-RAM=0 ist. Ich hab ein Display hier, bei dem wurden die ersten 16 Column-Treiber nicht angeschlossen ;).

Row-Adress ist $60 or ($0F and Data), $70 or (($0F and Data) shr 4))

Nein, ich habe die Funktion so programmiert, das oben Links 0,0 ist. In der Funktion wird dann der Command mit dem MSB/LSB gesendet. Das Display kann einen Virtuellen-Windowbereich erstellen und auch einen Scrollbereich.

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) SHR 4;
   WriteLCD( $10 OR MSB, false );

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

end display_address;


Quote by Harry
Define hast du linear gewählt?

Ja, das Display habe ich auf linear eingestellt, aber man kann den Controller auch auf Column umstellen.

Quote by Harry
noch was: hast du da ein gDrawRect(0,0,263,63,$FF) in deinem Programm? Wenn ja stimmt was noch nicht. So wie das aussieht fehlen die beiden senkrechten Linien davon.

Ist angepasst, hatte von 0..256 gestellt ;-)

Ein Problem habe ich bei dem Controller festgestellt, man muß immer 3 Byte senden, damit die Daten richtig angezeigt werden. Da der AVRCO aber am Ende nur ein Byte sendet und dann den Zeilenwechsel CMD0 veranlasst wird die letzte Spalte verschluckt. Egal was ich gemacht habe, das habe ich nicht in den Griff bekommen. Wenn ich alle Daten am Stück durchschreibe, macht das Display automatisch einen Zeilenwechsel dann klappt alles. Aber was soll es, bei 256 Spalten fehlt halt die letzte Spalte. Dafür kann man die ganzen fertigen Funktionen vom AVRco nutzen.

Code liegt im Softwarebereich.

Dir nochmals vielen Dank für die Infos und Hilfen.

Thorsten
You must be logged in or your permissions are to low to see this Attachment(s).
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 53
Posts: 1360
Registered: 03 / 2003
Private message
Subject: Re: 3,8" Grafik LCD 256x64 Punkte, UC1698 neues Display  -  Posted: 07.02.2018 - 07:31   -  
Hi Thorsten,

wenn du da ein gDrawRect drin hast, dann stimmt was nicht: die Eckpunkte fehlen.
Und wenn es möglich ist ohne adressierung der Zeile das RAM komplett durchzuschreiben, dann mach das doch: bau dir dein eigenes DisplayRefresh :). Sollte auf jeden Fall schneller sein.

Code

UserDevice GraphIOS(cmd:Byte;Arg:Byte); 
  Begin 
    If cmd=1 
      then 
        WriteData(Arg); 
      EndIf; 
  End; 


Das ist zwar vom T6963, aber prinzipiell sollte es so gehen.
Code

Procedure chDispRefresh; 
  Begin 
    Address(RAMZero);  // RAM-Adresse auf Anfang 
    ComWR($B0);        // kontinuierliches Schreiben einschalten
    gDispRefresh;      // Displayrefresh 
    ComWR($B2);        // Auto Reset LCD (auto write off) 
  End chDispRefresh;


D.h. GraphIOS (und damit der gDispRefresh) besteht nur aus dem Schreiben der Daten ohne Adressierung. Das eigene DispRefresh adressiert auf 0,0 und der gDispRefresh schreibt nur die Daten.

Gruss
Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 20.08.2018 - 12:25