Ich möchte ein VGA-Display mit einem Mikrocontroller ansteuern, um damit
Messwerte grafisch darzustellen und ein einfaches Menü sollte auch noch
dabei sein. Ich habe mir mal verschiedene Demos mit Arm7 und Cortex-M3
mit integriertem LCD-Controller (u.A Stm32 und Lpc24xx) angesehen, deren
Grafikausgabe ist für meine Anwendung aber zu langsam. Muss ich gleich
was deutlich größeres nehmen (wie bei den Smartphones) oder gibt es was
"dazwischen" mit schnellem Displaycontroller, aber halt doch noch
handlötbar?
Thomas schrieb:> oder gibt es was> "dazwischen" mit schnellem Displaycontroller, aber halt doch noch> handlötbar?
Ja, gibt es. P8X32A vom Parallax. Den gibt es sogar im DIL Gehäuse.
Thomas schrieb:> Ich möchte ein VGA-Display mit einem Mikrocontroller ansteuern, um damit> Messwerte grafisch darzustellen und ein einfaches Menü sollte auch noch> dabei sein. Ich habe mir mal verschiedene Demos mit Arm7 und Cortex-M3> mit integriertem LCD-Controller (u.A Stm32 und Lpc24xx) angesehen, deren> Grafikausgabe ist für meine Anwendung aber zu langsam. Muss ich gleich> was deutlich größeres nehmen (wie bei den Smartphones) oder gibt es was> "dazwischen" mit schnellem Displaycontroller, aber halt doch noch> handlötbar?
Was heißt "zu langsam"? Bedenke das ein VGA-TFT bei 8 Bit Farbtiefe
(also 256 Farben) schonmal 18MB/s Speicherbandbreite nur für den Refresh
haben will. Dann hast du aber noch nichts auf das Display geschrieben.
640x480 sind auch ~300kB RAM wenn du einen kompletten Frame im Speicher
haben willst. Da ist dann meist schon rum mit internem RAM. Externes
SRAM gibt die nötige Bandbreite kaum her. Heißt also SDRAM. Ich denke
wenn du VGA willst solltest du auf ein fertiges Modul mit >= ARM9EJS
setzen. Alles andere artet in jeder Menge Hardwarearbeit oder ekligen
Softwaretricks aus. Bedenke aber auch das diese Klasse dann auch recht
komplex ist. Oftmals haben diese Controller schon mehr
Peripherieregister für die Taktsteuerung als ein AVR insgesamt hat.
Matthias
Hi
das sind die ekligen Softwaretricks :-) Geniale und beeindruckende Demo,
keine Frage. Aber eben nur eine Demo und für eine reale Anwendung doch
eher ungeeignet.
Matthias
Das Problem wird die Speicherbandbreite sein. Alleine für die
Bildausgabe brauchst du ordentlich Bandbreite, gleichzeitig sollte der
Speicher ja noch mit neuen Frames beschrieben werden können...
Thomas schrieb:> Wie sieht es mit externen, "intelligenten" Displaycontrollern aus?> Könnten die eine Lösung sein?
Ja, sicher. Aber auch da gelten die gleichen Randbedingungen. Ich würde
wirklich den Weg gehen ein entsprechendes vorgefertigtes Board zu
verwenden. VGA ist eben nicht QVGA. Da siehts dann gleich viel
entspannter aus.
Matthias
> Dann hast du aber noch nichts auf das Display geschrieben.> 640x480 sind auch ~300kB RAM wenn du einen kompletten Frame im Speicher> haben willst. Da ist dann meist schon rum mit internem RAM. Externes> SRAM gibt die nötige Bandbreite kaum her. Heißt also SDRAM.
Renesas SH7262, internes 1MByte Ram, Interface zum Display, DMA,
DualPort-Ram. Damit kann man sowas auf einer selbstgebastelten
zweilagigen Platine hinbekommen. Von Hand loeten geht auch, aber man
braucht schon eine Lupe. :-)
> Wie sieht es mit externen, "intelligenten" Displaycontrollern aus?> Könnten die eine Lösung sein?
Fuer QVGA gibt es relativ viel mit SD1335 und seinen Nachfolgern. Aber
wenn man VGA und Farbe will dann braucht man ja auch ein bisschen was
Rechenleistung. Diese Controller haben dann immer ein dickes Gehaeuse
mit kleinen Pins weil das niemanden stoert ausser ein paar Bastlern.
Aber fuer Bastler designt man keine Microcontroller.
Der von mir so geschaetzte SH7262 ist da schon ein guter Kompromiss. Der
hat zwar auch ein dickes Gehaeuse, aber immerhin braucht man kein
externes Ram.
Olaf
In der elektor Mai 2011 war eine Lösung mit einem dsPIC drin.
http://www.elektor.de/jahrgang/2011/mai/vga-grafikkarte.1780074.lynkx
Die Karte nutzt den Text-Modus (60 Zeilen mit 64 Zeichen à 8 bits) und
den Grafik-Modus(512 x 480 Pixel) gleichzeitig. Die Daten werden per
RS232 mit bis zu 115K Baud angenommen.
Eventuell wäre das schon ein Denkanstoß.
Thomas schrieb:> Ich möchte ein VGA-Display mit einem Mikrocontroller ansteuern
Ich weiss ja nicht, welche Stückzahlen du produzieren willst, aber bei
der Entwicklung könntest du dir viel Arbeit sparen, wenn du eine
Einfachst-PC-Platine und ein Embedded Linux verwendest. Auch über
Tablett-PCs könnte man nachdenken.
Gruss Reinhard
> Auch über Tablett-PCs könnte man nachdenken.
Das ist prinzipiell eine sehr gute Idee. Ich verwende ja
auch immer alte Palmpiloten wenn ich was basteln moechte wo ich
ein groesseres GrafikLCD brauche.
Aber das Problem das ich mit aktuellen Tabletten habe, es gibt
keinen halbwegs bastelfreundlichen Weg um da eigene Hardware
dranzustecken. Ausser vielleicht man findet eins das als USB-Master
arbeiten kann.
BTW: Manche Geraete haben ja heute eine HDMI Schnittstelle. Hat es
schonmal einer geschafft den darin integrierten I2C-Bus getrennt zu
verwenden?
Olaf
Olaf schrieb:> Aber das Problem das ich mit aktuellen Tabletten habe, es gibt> einen halbwegs bastelfreundlichen Weg um da eigene Hardware> dranzustecken.
In die eigene Hardware einen FTD232 oder ähnliches einbauen und den
USB-Anschluss benutzen, Kommunikation über die (verborgene) serielle
Verbindung - ist wohl am einfachsten, und der FTD nimmt auch nicht viel
Platz weg. Geht dann auch sowohl am PC als auch am Tablett.
Gruss Reinhard
Thomas schrieb:> deren Grafikausgabe ist für meine Anwendung aber zu langsam.
Glaubst Du das oder weißt Du das?
Und wenn ja oder nein, wie schnell muß es denn sein?
Bei geschickter Anordnung paßt auch Einiges auf ein QVGA und ist ohne
Brille lesbar. (Annahme: 5,7" TFT)
Thomas schrieb:> um damit> Messwerte grafisch darzustellen und ein einfaches Menü sollte auch noch> dabei sein.
Dazu bedarf es doch keiner großen Geschwindigkeit, die die eines
Cortex-M3 übersteigt. Bewegte Bilder brauchen Prozessorleistung, aber
doch keine statischen Anzeigen.
Vielleicht hilft es, die Berechnungen zu optimieren.
Moment mal, so ein ATMega8 mit 16 MHz hat über 32 Megabyte pro Sekunde
Speicherbandbreite, denn er kann einen Befehl pro Sekunde ausführen. Da
werden 16 Bit aus dem Flash gelesen, und Du kannst bis zu 5 Bit auf
einen Port ausgeben.
Mit 20 MHz schaffst Du 503 Pixel pro Zeile, da eine Zeile 25.17 µs lang
ist. (sichtbarer Bereich)
Da Du ja eine sehr eingeschränkte Anwendung hast, mach doch einfach
folgendes:
Teile den Bildschirm vertikal auf. Beispielsweise oben in großen Zahlen
Deinen Messwert, unten in hoher Auflösung Dein Menü.
Dann mach die Zahlen so, wie es in den ganzen AtMega Video Projekten
erklärt wird, beispielsweise mit Hilfe des SPIs. Damit bekommst Du
ungefähr 20 Zeichen pro Zeile hin.
Für das Menü teilst Du den unteren Bereich in mehrere Teile auf. Du
definierst 2 Register, beispielsweise mit den Namen "text" und
"hintergrund".
Die Menüpunkte selbst gestaltest Du als Bitmap. Für jede Zeile wandelst
Du jeden Pixel in einen Out-Befehl um. Das sieht dann beispielsweise so
aus:
menuepunkt_irgendwas_zeile_00:
OUT PORTA,hintergrund ;Zeile 0 Pixel 0
OUT PORTA,text ;Zeile 0 Pixel 1
OUT PORTA,text ;Zeile 0 Pixel 2
...
OUT PORTA,hintergrund ;Zeile 0 Pixel 132
ret
Die Routine in der die Zeile ausgeben wird (normalerweise wird das von
einer ISR aufgerufen), schaut dann ungefähr so aus:
menue_zeile_00:
<Befehle um festzustellen ob Menuepunkt irgendwas angezeigt wird>
call menuepunkt_irgendwas_zeile_00
<Befehle um festzustellen ob Menuepunkt apfelkuchen angezeigt wird>
call menuepunkt_apfelkuchen_zeile_00
....
ret
Die Befehle dazwischen laden beispielsweise 2 Werte aus dem Speicher in
die Register. Einer gibt die Farbe des Textes, der andere die Farbe des
Hintergrundes an. Du hast für beide bis zu 256 Möglichkeiten, je nach
Beschaltung Deines DA-Wandlers.
Im Hauptprogramm sagst Du dann einfach:
LDI r16, 255 ;Farbe 255 zum Beispiel weiß
STS menuepunkt_irgendwas_t,r16 ;Speicherstelle für Textfarbe
"Irgendwas"
LDI r16, 0; Farbe 0 zum Beispiel schwarz
STS menuepunkt_irgendwas_h,r16 ;Hintegrund für "Irgendwas"
Wenn Du wirklich 640 Pixel haben möchtest, so kannst Du auch am Ausgang
einen simplen Multiplexer anbringen welchen Du mit dem µC Takt
schaltest. (den kannst Du bei vielen AtMegas über einen Portpin ausgeben
lassen)
Dann hättest Du jedoch 4 Register und nur noch 16 Farben. Die Register
wären dann für alle 4 Pixelkombinationen aus Text und Hintergrund.
Du brachst dann eine Taktfrequenz von 12.5875 MHz
Christian Berger schrieb:> Moment mal, so ein ATMega8 mit 16 MHz
Damit ist er gut geeignet, den touchscreen eines VGA-TFTs auszuwerten,
aber mehr auch nicht :-)
Also, der EP9307 und der EP9315 von Cirrus Logic sollten das können, was
du möchtest.
Die haben ausser einem LCD-Controller, der schnell genug für diese
Aufgben ist, noch einen Grafik-Beschleuniger an Bord.
Vielleicht könnte das ja was für dich sein:
http://www.tigal.com/product/2037
da kannst du jeden kleinen mc mit 3 Drähten anschließe und große Klötze
auf den VGA-Schirm malen. Ich benutze hier ein Display des selben
Herstellers mit dem selben Befehlssatz an einem Cortex M3. Das spart
eine Menge Arbeit wenn man mal eben ein tft für Basteleien braucht.
Jürgen Liegner schrieb:> wenn man mal eben ein tft für Basteleien braucht
Und was machst du dann mit einem VGA-TFT, wenn du nicht in den BWSP
direkt hineingreifen kannst und nur an einer seriellen Nabelschnur
hängst?
Ich halte all diese Produkte für Mumpitz, der nur auf Bastlerseelen
abzielt. Da sieht einer so ein Produkt, liest "VGA" und
"hochleistungsfähig" und "paßt an jeden Controller" und denkt sich 'ach,
da könnte man ja..' - aber in der Realität ist das wie bei einem
Handy-Dummy mit aktivem Display: Das blinkert auch, und da könnte man
ja.. - aber telefonieren geht trotzdem nicht.
W.S.
Hallo, komm mal bitte wieder etwas runter. Es hat niemand erwartet
darüber Videos abzuspielen oder der gleichen. Trotzdem gibt es sinnvolle
Anwendungen. Und wenn es nur die Anzeige von Messwerten ist die über
größere Entfernungen gelesen werden sollen. Dann ist ein 21" Display der
100€ Klasse in Verbindung mit dem Konverter für 35€ eine unschlagbar
günstige Kombination. Ich will für diese Aufgaben nicht in den BWSP
reinschreiben sondern sagen: Schreibe diesen String in der Farbe an die
Position. Ein paar Grafikbefehle zum Zeichen von Linien und Rechtecken
und gut ist. Also alles das was auch in eine Grafiklib kommt wenn das
Display direkt angeschlossen ist. Die muss ich dann aber erst mal
schreiben oder irgendwo hernehmen.
Vom gesparten Entwicklungsaufwand will ich gar nicht reden.
Die Anforderung von Thomas waren: Messwerte ausgeben und ein einfaches
Menü. Also genau das was so ein Teil kann. Mit einem Display dran, das
als Massenware überall zu haben ist.
Hinzu kommt, dass Bilder die sich auf der SD-Karte des Adapters befinden
auch ausgegeben werden können. Da kann man dann bei geschickter
Programmierung optische Sachen machen die nicht unbedingt billig
aussehen müssen. Zum Ansteuern reicht der kleinste AVR. Und ein Punkt
kommt noch hinzu. Ich habe den MC fast für mich alleine und für die
Aufgaben um die es geht. Hier ordnet sich die Grafikausgabe meinem
Programm unter und nicht umgekehrt.
m.n. schrieb:> Damit ist er gut geeignet, den touchscreen eines VGA-TFTs auszuwerten,> aber mehr auch nicht :-)
Selbst das wird schwierig: der im AVR eingebaute ADC hat 10Bit, wobei
ich eher nur 9 Bit davon max.verwenden würde (das LSB zappelt zu sehr),
was bedeutet, das dass Display eine max. Auflösung von 512 Pixeln (egal
ob X oder Y) haben darf/ sollte.
Zumindest, wenn der Touch halbwegs Pixelgenau sein soll ...
Gruss Uwe
Uwe N. schrieb:> Zumindest, wenn der Touch halbwegs Pixelgenau sein soll ...
Das ist ein schöner Traum, den ich auch einmal hatte :-)
Es geht nicht, weil zum einen die Abstandshalter der XY-Folien (spacer)
dies verhindern und zum anderen deren Widerstände nicht linear und
temperaturstabil sind. Wenn man 2-3 Pixel genau erreicht ist es gut;
ansosnten würde ich von 1% ausgehen (bei 5,7" Anzeigen).