Gute Morgen zusammen, leider konnte ich weder im Internet noch hier noch im Datenblatt eine zufriedenstellende Antwort auf mein Problem finden. Kurze Vorgeschichte: Ich soll in meiner Diplomarbeit ein Display ansteuern um dort einige Informationen als auch Bilder an zu zeigen. Die erste Lösungsversuch wurde jetzt mit einem Display von Display3000 (2,1") angesetzt, stellte sich jedoch insbesondere bei größeren Grafiken (50 x 60 pixel, a 16bit Farbwerte) als zu langsam herraus. Mein zweiter Lösungsansatz zielt nun auf ein 2,2" Display von "Display Elektronik" ab (DEM 240320A TMH-PW-N), dieses besitzt bereits auf dem Modul einen HIMAX "HX8346" Grafikcontroller. Aus dem Datenblatt konnte ich bereits entnehmen das der Controller via 8/9/16/18 Bit parallel oder auch seriell via SPI angesteuert werden kann. Aus performance gründen wollte ich das Display mit Hilfe eines Freescale S12XE mit einem 18bit parallel Bus ansteuern. Wenn ich mir das jetzt so im Datenblatt anschaue (siehe Grafikcontrollerdaten HX8346-A.pdf) muss ich wenn ich Daten in das GRAM schreiben möchte erst die Startadresse (Coloumn, Row) in ein internes Register schreiben und anschließende die Grafikdaten übertragen. Mein eigentliches Problem für das ich noch keine zufriedenstellende Lösung gefunden habe ist: Wie binde ich den 18Bit Parallel Bus an? Einfach 18 GPIO Pins zu nehmen wird wahrscheinlich zu langsam sein. Das "External Bus Interface" hilft mir hier wahrscheinlich auch nicht weiter da ich ja nicht wie bei einem Speicher einen Adressbus und einen Datenbus bzw einen gemeinsammen Adress und Datenbus habe. Hat jemand eine Idee 18 Leitungen möglichst schnell an einen µC anbinde? vielen dank gruß Dominik Ps. ein leider nicht ganz vollständiges Datenblatt gibt es unter http://www.microtipsusa.com/download/HX8346-A_DS_T_v01.pdf
Es wird wahrscheinlich schneller sein, "nur" einen 16-Bit Bus zu benutzen. Vielleicht lässt sich das externe Memory-Interface nutzen, ansonsten mittels "std PORTA" lassen sich z.B. Daten gleichzeitig an PORTA und PORTB ausgeben, dann noch kurz mit den Steuerleitungen wackeln und fertig. Gruss Jörg
Beim AVR könntem man sogar ggf den Adressbus +ALE dafür mißbrauchen :) Weiß nicht ob das bei deinem µC auch geht, dann würde sich aber 16bit Interface anbieten. "Lesen" von einer Adresse wäre dann = schreiben auf das Display.
Ich würde dir auch eine Lösung a la Läubi vorschlagen: Gucke, ob dein Prozessor ein externes Speicherinterface hat. Wenn ja: Blende es in den ext. Speicherbereich ein. Es ist sinnvoller, die Datenbusbreite des Displays exakt so groß zu wählen, wie die es Prozessors. Lesen/Schreiben geht dann schneller als wenn du alle Steuersignal mit Hand setzen musst, nur um 18bit zugleich zu habhen. So schreibt die Software in das "externe" RAM, und die Daten landen derweil im Display.
das Display hat 320x240 in RGB, das sind 230 kByte. ich denke das man die schnell genug an so ein Disp bekommt wenn man 16 GPIO benutzt. Bei 1Mhz Datenrate ist das eine 1/10 Sekunde.
Gut 16Bit Parallel gehen auch es müssen nicht die 18Bit sein. Ich hab mal im Datenblatt nachgeschaut: Der S12 besitzt sowas wie ein "External Bus Interface" welches wohl eigentlich gedacht ist um einen externen Speicher anzusprechen. Im vergleich zu einem Ateml (At90CAN128) sind beim S12 jedoch Adressen- und Datenbus seperat rausgeführt also nicht gemultiplext. Wenn ich das richtig verstehe würde ich jetzt einfach die Adressleitung offen lassen und die 16 Bit breite Datenleitung einfach an den 16 Bit Bus des Grafikcontrollers anschließen. Eine Übertragung eines Bildes würde dann grob so aussehen. 1. Chipselect "NCS" des Displays auf low setzen 2. DNC_SCL auf low setzten um die nachfolgenden Daten als COMMAND zu kennzeichnen. 3. Schreiben von 0x22 ins Indexregister 4. DNC_SCL wieder auf high setzten 5. 16 Bit Daten auf den Datenbus legen in dem man an irgend eine externe Adresse schreibt. 6. Kennzeichnen der gültigen Daten mittels E_NWR 7. ... 8. ... Die Steuersignale müsste ich dann aber immer noch von Hand setzten. @Gast Woher hast du die 1Mhz? ich konnte nirgends finden wie schnell so ein Port umschalten kann. 1/10s wären immer noch 100ms was für mich heißt ich erkenne den Bildaufbau (Flimmern ect.)+ Im Anhang noch der Auszug aus dem Datenblatt für das External Bus Interface gruß
Also du kannst das dann doch 18bit breit anschließen. du nuzt einfach noch 2bit der Adresse als "daten" + 1 bit der Adress für Kommand/Daten umschaltung wenn du einen Wert A = 18 bit schreiben willst mußt du dann 16bit von A an die Externe Adresse von X...X(Anfang belibig)1/0(für schreiben lesen...)aa(die beiden restlichen bits der Daten). Dann den schreibimpuls des Displays an den Schreibimpuls des controllers, dan nimmt dir der kontroller die Sache ab, du stuerst den dann halt durch shcreiben der Daten an die "richtige" Adresse. Hoffe das sit verständlich wie ich das meine ;)
>enn ich das richtig verstehe würde ich jetzt einfach die Adressleitung >offen lassen und die 16 Bit breite Datenleitung einfach an den 16 Bit >Bus des Grafikcontrollers anschließen. Würde ich anders tun: die 16bit Daten so wie du geschrieben hast, aber: ich würde die Leitungen RE und WE des Controllers (low aktiv) über eine Logik (wahrsch. NOR) so ändern, dass damit direkt RW_NRD und E_NWR (was sind das für scheißnamen?) angesteuert werden können. A1..A22, oder einige davon, würde ich über ein Adresskomparator legen und an NCS klemmen. A0 würde ich an DNC_SCL anklemmen, zur Unterscheidung der (vier) Register. Das gibt folgenden VOrteil: >1. Chipselect "NCS" des Displays auf low setzen >2. DNC_SCL auf low setzten um die nachfolgenden Daten als COMMAND > zu kennzeichnen. >3. Schreiben von 0x22 ins Indexregister >4. DNC_SCL wieder auf high setzten >5. 16 Bit Daten auf den Datenbus legen in dem man an irgend eine externe > Adresse schreibt. >6. Kennzeichnen der gültigen Daten mittels E_NWR Das wird dann automatisch gemacht, wenn du per Software Lese/Schreibbefehl auf das scheinbar vorhandene externe Ram zugreifst. In einem Takt, und nicht, wie bei dir, in sechs.
Hallo, hat etwas länger gedauert bis ich wieder antworte, aber ich musste erstmal klären ob ich das mit dem Display jetzt so angehen kann wie ich wollte. Folgender stand bis jetzt: Ich soll in der nächsten Zeit einen ersten Prototypen erstellen auf dem die ganze Displaygeschichte und noch einige andere Sachen getest werden sollen. Um möglichst keine Änderungen am Layout mehr vornehmen zu müssen würde ich euch bitte mal über das Bild im Anhang zu schauen. Natürlich fehlen noch die Versorgungsleitungen und diverse andere Pins aber die sind ja hier unwichtig. Ach ja vielleicht noch wichtig: Ich möchte das Display im M68 Modus benutzen, da passen die Steuersignale besser zu dennen des Freescales. gruß Dominik
Mist ganz vergesesn hier noch die Pinbelegung des Grafikcontrollers und des S12XE
Es kommt evt. auch eine andere Lösung in Frage, das Display über den Xgate Coprozessor anzusteuern. Es gibt dazu auch zwei Aplication Notes, AN3219 und AN3493 mit Codebeispielen. Vorteil, man kann beliebige IO pins nehmen und so evt. ein kleineres Package wählen. Prinzipiell kann man so auch ohne die CPU zu belasten ein 18-bit Interface ertsellen. Die Grenze für die IO Pins beim aktuellen S12 liegt bei ~8 Mhz. Das war jedenfalls die Taktrate dich ich beim Einbinden eines MFR4310 an den S12 erreicht hatte.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.