Forum: Mikrocontroller und Digitale Elektronik FT800 Grundlagen


von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Hallo Freunde der Elektronik,

derzeit spiele ich gerade frisch mit dem FT800 Grafikcontroller herum. 
Das Testen von Display-Lists mit Primitives funktioniert inzwischen 
schon. Mit dem EVE Screen Designer habe ich einige Versuche gemacht, was 
Wigets angeht. Der Editor liefert beim Export entsprechende Binärfiles, 
die man irgendwohin kopieren muss. Und genau da liegt das Problem. Ich 
habe den Output mal in den Commandbuffer ab 0x108000 kopiert (meine 
ich), dabei entstehen aber nur Streifen. Ich wäre dankbar für einige 
Tipps, die ich aus den Programming Guides von FTDI so noch nicht 
herauslesen konnte. Ich progge in ASM auf einem Xmega32E5.

Schöne Grüße,
Knut

von Rudolph R. (rudolph)


Lesenswert?

FT_RAM_CMD, also 0x108000 ist zunächst mal der Anfang des FIFO Puffers 
für den Kommando Co-Prozessor.
Den kann man benutzen, um die Display-Liste erstellen zu lassen.

Da einmal was reinzuwerfen wird bestenfalls für eine statische Anzeige 
taugen.
So wie auch die meisten der Arduino Beispiele funktionieren, einmal rein 
schreiben und dann nichts mehr machen.

Nach dem rein kopieren muss man dem Co-Prozessor aber auch noch 
mitteilen, dass er was zu tun hat.

Mit dem Screen Editor habe ich aber bisher nur rumgespielt um mal was 
auszuprobieren, gib doch mal eine Config als Beispiel und schreib mal 
bitte, für welches Target Du überhaupt exportierst.

Und welches TFT benutzt Du?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Ich nutze ein fertiges Board von Riverdi mit 320 x 240 Pixel. Config 
schicke ich gleich nach. Ich möchte eigenlich nur ein Widget, sagen wir 
eine Uhr oder ein Messinstrument anzeigen (interne Konfig), bekomme als 
DL aber nur die Primitives und den Hintergrund, im Command Buffer halt 
Streifen... Oder muss ich die Commands zusätzlich zu einer schon 
bestehenden Displaylist senden? Ich habe gelesen, die Displaylist lässt 
sich in die Commands einbetten.

von Rudolph R. (rudolph)


Lesenswert?

Da die Widgets auf dem Co-Prozessor basieren müsste man die wohl über 
cmd_append() mit in die Liste einbauen.
Da fand ich es von vornherein einfacher, dem Co-Prozessor das Erzeugen 
der kompletten Liste zu überlassen.

Man muss dann sowieso die Liste ständig neu erstellen.
Buttons werden ja nicht automatisch als gedrückt angezeigt, die Uhr 
verstellt sich nicht, der Progress-Bar ändert sich nicht und die Gauge 
bleibt auch so wie einmal konfiguriert...

Alternativ gibt es auch noch die Macros, die habe ich bisher aber auch 
noch nicht benutzt.

Ich habe ein VM800B35A und benutze das zur Zeit mit einem 90CAN128.
Allerdings programmiere ich den in C und mit meiner eigenen Library.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das ist der ScreenEditor Output in Pseudocode:

cmd_dlstart();
CLEAR_COLOR_RGB(170,0,0);
CLEAR(1,1,1);
SAVE_CONTEXT();
COLOR_RGB(0,56,112);
cmd_bgcolor(0x002040);
cmd_gauge(149,110,50,0, 5,5,500,1000);
RESTORE_CONTEXT();
DISPLAY();
cmd_swap();

Und das ist das Binärfile als HEX-Format (C-kompatibel)
1
unsigned char rawData[60] = {
2
  0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xAA, 0x02, 0x07, 0x00, 0x00, 0x26,
3
  0x00, 0x00, 0x00, 0x22, 0x70, 0x38, 0x00, 0x04, 0x09, 0xFF, 0xFF, 0xFF,
4
  0x40, 0x20, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0x95, 0x00, 0x6E, 0x00,
5
  0x32, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0xF4, 0x01, 0xE8, 0x03,
6
  0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF
7
};

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Rudolph R. schrieb:
> Da fand ich es von vornherein einfacher, dem Co-Prozessor das Erzeugen
> der kompletten Liste zu überlassen.

Ich habe mich da überhaupt noch nicht festgelegt, ich bräuchte nur den 
Ansatz, wie ich Primitives und Widgets (Co-Prozessor-Anweisungen) 
miteinander verheiraten kann, denn Rest bekomme ich dann schon hin ;-).

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Rudolph R. schrieb:
> Ich habe ein VM800B35A und benutze das zur Zeit mit einem 90CAN128.
> Allerdings programmiere ich den in C und mit meiner eigenen Library.

Ich kann C lesen, wenn das drinsteht, was ich wissen muss, übersetze ich 
mir das passend. Wenn Du die Library nicht posten möchtest, könnten wir 
über PN weiterkommunizieren.

von Rudolph R. (rudolph)


Lesenswert?

Knut B. schrieb:
> cmd_dlstart();
> CLEAR_COLOR_RGB(170,0,0);
> CLEAR(1,1,1);
> SAVE_CONTEXT();
> COLOR_RGB(0,56,112);
> cmd_bgcolor(0x002040);
> cmd_gauge(149,110,50,0, 5,5,500,1000);
> RESTORE_CONTEXT();
> DISPLAY();
> cmd_swap();

Das ist ja für sich eine komplette Display-Liste wie sie über den 
Co-Prozessor benutzt wird, bzw. der Co-Prozessor schreibt damit die 
Display-Liste neu.
Das SAVE_CONTEXT() und RESTORE_CONTEXT() macht da irgendwie keinen Sinn 
drin, es ist ja nichts anderes in der Liste.

So als Hex-Blob ist das vielleicht etwas unhandlich.
Da muss man dann ja drin abzählen und für die Anzeige
dann rawData[42] manipulieren.

Schreibst Du das an die aktuelle Command-FIFO End-Adresse?
Oder nur an den Anfang? Einmal oder zyklisch?
Hast Du davor schon was mit dem Co-Prozessor geschrieben?


Und lässt Du das dann auch ausführen?

>Wenn Du die Library nicht posten möchtest

Das fühlt sich alles noch so unfertig an und es ist auch nur eine 
Teil-Menge implementiert, was ich eben so bisher haben wollte.

: Bearbeitet durch User
von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Rudolph R. schrieb:
> Das ist ja für sich eine komplette Display-Liste wie sie über den
> Co-Prozessor benutzt wird, bzw. der Co-Prozessor schreibt damit die
> Display-Liste neu.

Ja, wenn ich das an die normale Display List Adresse 0x100000 und 
folgende schreibe, fehlt das Widget.

Wenn ich ab 0x108000 schreibe, kommt nur Müll.

Rudolph R. schrieb:
> Schreibst Du das an die aktuelle Command-FIFO End-Adresse?
> Oder nur an den Anfang? Einmal oder zyklisch?
> Hast Du davor schon was mit dem Co-Prozessor geschrieben?

Erstmal nur einmal nach der Init, sollte also leer sein und die Pointer 
sollten auf Anfang stehen...

Rudolph R. schrieb:
> Und lässt Du das dann auch ausführen?

Ähhh...?!

Rudolph R. schrieb:
> Das fühlt sich alles noch so unfertig an und es ist auch nur eine
> Teil-Menge implementiert, was ich eben so bisher haben wollte.

Ich bin ja auch erst am Anfang ;-)

von Rudolph R. (rudolph)


Lesenswert?

Knut B. schrieb:
> Ja, wenn ich das an die normale Display List Adresse 0x100000 und
> folgende schreibe, fehlt das Widget.

Das ist ja auch noch keine Display-Liste so für sich.
Das ist die Anweisungs-Liste aus welcher der Co-Prozessor die 
Display-Liste zusammen baut.

Der wird das Widget dann passend aus Primitives zusammen bauen.

> Wenn ich ab 0x108000 schreibe, kommt nur Müll.

Hast Du vorher schon einen Zugriff auf den Co-Prozessor?
Also lädst Du zum Beispiel ein Bild?

Dann steht der FIFO ja nicht mehr auf der Anfangs-Adresse.

cmdOffset = ft800_memRead16(REG_CMD_WRITE);

Das ist die aktuelle Position wenn der Co-Prozessor nichts mehr zu tun 
hat.
Und nichts zu hat er wenn das mit ft800_memRead16(REG_CMD_READ); 
identisch ist.

> Erstmal nur einmal nach der Init, sollte also leer sein und die Pointer
> sollten auf Anfang stehen...

Hast Du die "leere" Display-Liste mit in der Init?

Das hier habe ich so aus den Beispielen mit übernommen:
1
  ft800_memWrite32(FT_RAM_DL, DL_CLEAR_RGB); // Clear Color RGB   00000010 RRRRRRRR GGGGGGGG BBBBBBBB  (R/G/B = Colour values) default zero / black
2
  ft800_memWrite32(FT_RAM_DL + 4, (DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG));  // Clear 00100110 -------- -------- -----CST  (C/S/T define which parameters to clear)
3
  ft800_memWrite32(FT_RAM_DL + 8, DL_DISPLAY);  // DISPLAY command 00000000 00000000 00000000 00000000 (end of display list)
4
  ft800_memWrite32(REG_DLSWAP, DLSWAP_FRAME);  // 00000000 00000000 00000000 000000SS  (SS bits define when render occurs)

>> Und lässt Du das dann auch ausführen?
>
> Ähhh...?!

Na, wenn Du was in den Co-Prozessor FIFO geschrieben hast, dann musst Du 
ihm auch mitteilen, dass er das jetzt abarbeiten darf.

Das macht man, in dem man in REG_CMD_WRITE die neue End-Adresse rein 
schreibt.

> Rudolph R. schrieb:
>> Das fühlt sich alles noch so unfertig an und es ist auch nur eine
>> Teil-Menge implementiert, was ich eben so bisher haben wollte.
>
> Ich bin ja auch erst am Anfang ;-)

Der FT800 kann so extrem viel, das ist noch ein weiter Weg. :-)
Ich hatte bis eben auch kein cmd_bgcolor().

Übersetzt auf meine Library sieht das bei mir so aus:
1
  ft800_cmd_dl(CMD_DLSTART); // Start the display list  
2
  ft800_cmd_dl(CLEAR_COLOR_RGB(170,0,0)); // Set the default clear color
3
  ft800_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); // Clear the screen - this and the previous prevent artifacts between lists, Attributes are the color, stencil and tag buffers
4
  ft800_cmd_dl(COLOR_RGB(0,56,112));
5
  ft800_cmd_bgcolor(0x00, 0x20, 0x40);
6
  ft800_cmd_gauge(149,110,50,0, 5,5,500,1000);
7
  ft800_cmd_dl(DL_DISPLAY);  // Instruct the graphics processor to show the list
8
  ft800_cmd_dl(CMD_SWAP); // Make this list active
9
  ft800_cmd_execute();

Das werfe ich dem Co-Prozessor hier gerade etwa 40 Mal pro Sekunde vor.
Und bis auf den Hintergrund vom Instrument sieht das aus wie im 
Screen-Editor.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Aaaaaaahhhh.... okay, ich glaube das hilft erst einmal weiter. Vielen 
Dank, ich melde mich... :-)

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Okay, hast mich auf die Schiene gesetzt - es funktioniert!

Vielen Dank für die schnelle Hilfe!!!

von Rudolph R. (rudolph)


Lesenswert?

Kann nicht schaden, wenn noch mehr Spass mit den FT8xx haben. :-)
So schwer wie die zu bekommen sind muss man die auch nach über zwei 
Jahren noch als exotisch ansehen.

Ich habe gerade auch noch ein 5" mit einem FT8100 bei hotmcu.com 
bestellt.

von Geert H. (geerth)


Lesenswert?

Knut B. schrieb:

> Ich progge in ASM auf einem Xmega32E5.
>
> Schöne Grüße,
> Knut

Ist dir bekannt das Bascom FT800 und FT801 und Xmega support hat?

Type mal "FT800" hier:
http://avrhelp.mcselec.com/

: Bearbeitet durch User
von Rudolph R. (rudolph)


Lesenswert?

Es gibt auch LunaAVR, die Gameduino2 lib und die FTDI Arduino Library.

Zum Anfang hatte ich auch einen Uno im Aufbau, das hatte den Vorteil aus 
der IDE einfach Demos laden und benutzen zu können.
Nur ist die Lib von FTDI in Teilen seltsam.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Bei TME gibt es diverse Boards mit dem FT800, dies hier zum Beispiel:

http://www.tme.eu/de/details/rvt3.5bcnwr00/tft-displays/riverdi/rvt35b320240cnwr00/

Falls noch jemand Lust auf das Teil hat...

von Rudolph (Gast)


Lesenswert?

Mal davon ab, dass ich von TME an sich gerade nicht so begeistert bin, 
es gibt nicht viel, aber noch ein paar mehr.

http://www.watterott.com/de/Gameduino-2

http://www.hotmcu.com/43-graphical-lcd-touchscreen-480x272-spi-ft800-p-111.html?cPath=6_16
http://www.hotmcu.com/5-graphical-lcd-touchscreen-480x272-spi-ft800-p-124.html?cPath=6_16
http://www.hotmcu.com/5-graphical-lcd-touchscreen-800x480-spi-ft810-p-286.html?cPath=6_16

Dazu diverse direkt von FTDI, auch über EBay oder Amazon, die Teile sind 
allerdings recht kostspielig.

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.