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
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?
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.
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.
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)
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 ;-).
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.
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.
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 ;-)
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)
>> 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.
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.
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/
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.