Hallo Leutz! Ich würde gern mit der Programmierung von Grafikdiplays anfangen, nur finde ich keine Tutorials oder Bücher die sich diereckt mit diesem Thema befassen. Ich habe bis jetzt immer mit der AVR Familie programmiert und habe auch schon LCDs, wie im Toturial díeser Seite, angesteuert. Bis habe ich die AVRs nur im Assembler programmiert aber c-Erfahrungen habe ich auch. Jetzt ist meine Frage: Wie programmiere ich ein Grafikdisplay? Gibt es irgendwo ein Toturial oder ein Buch, das sich diereckt mit dem Thema befasst? Kann ich ein Grafikdisplay überhaupt in C programmieren oder muss ich mir erstmal einen Wälzer mit c++ rein ziehen?
B. S. schrieb: > Jetzt ist meine Frage: Wie programmiere ich ein Grafikdisplay? Das kommt drauf an, wo du einsteigen willst. Im einfachsten Fall sieht die Sache für dein Programm so aus, dass es auf dem Display ein Pixel auf weiß/schwarz setzen kann. Mehr nicht. Alles andere muss dein Programm dann dadurch erzeugen, dass es gekonnt die richtigen Pixel setzt > Gibt es irgendwo ein Toturial oder ein Buch, das sich diereckt mit dem > Thema befasst? Aufbauend auf dem einfachen Pixelsetzen sind alle Klassiker der Graphik-Programmierung geeignet. Da lernst und erfährst du dann alles was du über Grafik je wissen oder auch nicht wissen wolltest. Aus meiner Lernzeit ist mir noch der Foley Van Dam in Erinnerung. Grafikprogrammierung von der Pieke auf. Zu seiner Zeit war es eine der Bibeln der Grafikprogrammierung. Die beiden Bücher von David F. Rogers "Mathematical Elements for Computer Graphics" "Procedural Elements for Computer Graphics" habe ich ebenfalls geliebt. Ist der Foley van Dam eher auf dem theoretischen Pfad unterwegs und entwickelt die prinzipiellen Algorithmen und Verfahren mehr nebenbei, so ist insbesondere 'Proc. Elements' ein richtiges Praxisbuch mit dem Hauptaugenmerk auf Implementierung und der unbedingt notwendigen Theorie dazu mehr so nebenbei. > Kann ich ein Grafikdisplay überhaupt in C programmieren natürlich > oder muss ich > mir erstmal einen Wälzer mit c++ rein ziehen? Alles was mit C++ programmierbar ist, ist auch mit C programmierbar (oder mit jeder beliebigen anderen Programmiersprache). Das liegt daran, dass sie alle turing-komplett sind. Und wenn das der Fall ist, hat ein schlauer Herr namens Alan Turing bewiesen, dann kann man damit alles überhaupt berechenbare auch tatsächlich berechnen. Die Methoden mit denen man arbeitet mögen variieren, aber in der prinzipiellen Leistungsfähigkeit sind sie alle gleichwertig, da turing-komplett.
B. S. schrieb: > Jetzt ist meine Frage: Wie programmiere ich ein Grafikdisplay? Hol dir ein Grafikdisplay, schlies es an und spiel ein bisschen damit rum. So lernt man es effektiv und spassig. :-)
> Jetzt ist meine Frage: Wie programmiere ich ein Grafikdisplay?
für C gibt es für die meisten Display fertige Funktionen. Du musst dann
die Funktion verstehen und einsetzen. Das kann z.B. so aussehen
lcd_pos( 0, 0 ); //Position
lcd_text((u8*) string);//Gebe auf dem Display das String aus, String ist
eine Art Varibale die einen Text beinhaltet, z.B Hallo
Das Display würde dann Hallo ausgeben.
Wenn du damit rumgespielt hast, kannst du dir die Funktionen genauer
anschauen und versuchen zu verstehen was da gemacht wird.
also setzt sich die Grafikdisplay Programmierung aus 2 Teilen zusammen, welche ich noch lernen muss: Das Ansteuern der Pixelpunkte mit einem AVR? Die eigentliche programmierung von Formen und Zeichen? Gibt es Bücher auch in deutscher Sprache die sich mit diesem Thema befassen? @Floh die hartware habe ich mir schon besorgt http://shop.myavr.de/index.php?sp=article.sp.php&artID=100064 @Artur R. wo gibt es solche biblioteken der funktionen?
Hallo B. S., wenn ich das richtig verstehe, suchst Du eine fertige Bastelanleitung.... > Ich würde gern mit der Programmierung von Grafikdiplays anfangen, nur > finde ich keine Tutorials oder Bücher die sich diereckt mit diesem Thema > befassen. Die besten Buecher um etwas zu verstehen, sind immer die Datenbuecher der Bauteile. Alles andere ist Nachkochen nach Rezept, aber nicht unbedingt VERSTEHEN. > Jetzt ist meine Frage: Wie programmiere ich ein Grafikdisplay? So wie´s im Datenblatt steht. > Kann ich ein Grafikdisplay überhaupt in C programmieren oder muss ich > mir erstmal einen Wälzer mit c++ rein ziehen? Man kann alles mit allem programmieren. Ob Du Deine SW in BASIC, C, C++,, Assembler programmierst, ist Dir ueberlassen. Such DIr das aus, fuer das Du einen Assembler/Compiler/Debugger bekommst und das Du glaubst verstehen zu koennen. Wenn Du hier nuch nach fertigen Anleitungen suchst, wirst Du enden wie so viele Nutzer, die irgendwo irgendwas abtippen und dann hier im Forum nach Hilfe rufen, weil sie beim kleinsten Fehler schon aufgeben, denn Sie verstehen nicht was sie tun! Insofern wuerde ich erstmal klein anfangen und der Hinweis von Floh ist voellig richtig: So lernt man am besten! Gruss und noch alles Gute fuer 2011 Michael
Hi Bei monochromen GLCDs mit eigenem Controller sind die Unterschiede zum Text-LCD nicht sehr gross: Ein Byte entspricht halt nicht mehr einem Zeichen sonder 8 neben- oder übereinanderliegenden Pixeln. MfG Spess
> Gibt es Bücher auch in deutscher Sprache die sich mit diesem Thema > befassen? > Das Ansteuern der Pixelpunkte mit einem AVR? Das steht für gewöhnlich im Datenblatt des Displays. > Die eigentliche programmierung von Formen und Zeichen? Hier brauchste doch nur ein bisschen Fantasie, ich meine einen Punkt kannste ja zeichnen, für eine Gerade zeichnest du einfach mehrere Punkte, für ein 4-Eck 4 Geraden usw. Fantasie ist hier gefragt, wie früher im Kindergarten (ich hab nur einen Stempel, wie verwüste ich die Wand am Schönsten). :-)
B. S. schrieb: > also setzt sich die Grafikdisplay Programmierung aus 2 Teilen zusammen, > welche ich noch lernen muss: > > Das Ansteuern der Pixelpunkte mit einem AVR? Wie schon gesagt: Das hängt vom Display ab. Es gibt natürlich auch Displays, deren Controller schon höhere 'Primtiva' wie Linien, Kreise, Texte zur Verfügung stellen. Aber kleinster gemeinsamer Nenner ist: Pixel setzen Das gibt dir das Display vor, was es alles kann und wie es angesprochen werden will. > Die eigentliche programmierung von Formen und Zeichen? Das baut dann auf dem auf, was das Display zur Verfügung stellt. Ja. So wie auf einem Text-LCD ein Menüsystem auf der Basisfunktion 'Text ausgeben' und diese wiederrum auf der Basisfunktion 'Einzelzeichen ausgeben' aufbaut. Ein einzelnes Zeichen kann das LCD selbst hinmalen. Alles darüber hinausgehende muss dein Programm erledigen. > Gibt es Bücher auch in deutscher Sprache die sich mit diesem Thema > befassen? Gibt es sicher auch. Durchforste doch einfach mal Amazon oder durchforste das Web. > @Artur R. wo gibt es solche biblioteken der funktionen? Da die Lernkurve sowieso steil sein wird, solltest du einfach mal mit Google auf die Reise gehen. Beim Lesen kommen dir dann die nächsten Suchbegriffe unter. Einer der ersten wird zb 'Bresenham' sein. Und so führt dann eines zum anderen.
ich möchte es ja richtig machen doch ich finde halt keinen anfang. ich hatte es mir so vorgestellt ein kleinens Beispielprogramm a la "Hallo Welt" zu bekommen und dann damit rum zu doktorn. sprich ein pixel hin und her setzen aber dazu brauch ich doch erstmal eine Bibliothek mit funktionen?
B. S. schrieb: > ich möchte es ja richtig machen doch ich finde halt keinen anfang. ich > hatte es mir so vorgestellt ein kleinens Beispielprogramm a la "Hallo > Welt" zu bekommen Um Text auf einem grafischen LCD ausgeben zu können (ohne das das LCD das macht) musst du schon sehr firm in der Grafikprogrammierung sein! Da spielen dann schon viele Konzepte rein, eines davon ist zb das Konzept des Fonts. Dein erstes Grafikprogramm wird sein: 1 Pixel setzen wobei du bestimmen kannst, wo das Pixel hinsoll dein nächstes: Pixel wieder löschen nächstes Programm vielleicht im Zusammenspiel mit dem ADC und 2 Poti, den Punkt über das LCD steuern. Wahlweise sollen gesetzte Punkte erhalten bleiben oder beim Bewegen wieder gelöscht werden Dann wirst du mal eine Linie zeichen Zuerst waagrecht, senkrecht. Dann mit Bresenhams Hilfe in jede beliebige Richtung. etc. etc. Und den 'Anfang finden' Google ist dein Freund! Ich kann mir nicht vorstellen, dass sich mit Google nichts zum Thema Grundlagen Grafikprogrammierung finden lässt. (Übrigens: man braucht nicht unbedingt ein grafisches LCD um damit anzufangen. Ein C Compiler auf dem PC, ein 2D-Array welches die Anzeige simuliert und geschickt gesetzte '*' als dunkle Pixel, reichen für die ersten Gehversuche vollständig aus)
Ein Stichwort für Google ist zb 'Bresenham'. Damit findest du sicher etwas. Und dann schau dich auf der Site weiter um, ob der Autor noch mehr Einführungsartikel zum Thema Grafikprogrammierung bereitstellt.
Hi Warum wird hier immer auf den Pixeln herumgehackt? Es hat Jahre gedauert, bis ich das bei einem Grafikdisplay mal gebraucht habe. Ehe man 50 Pixel ausgerechnet hat, habe ich schon mein komplettes Display voll. MfG Spess
spess53 schrieb: > Hi > > Warum wird hier immer auf den Pixeln herumgehackt? Weil ich vom kleinsten gemeinsamen Nenner ausgehe. Ich hab ihm weiter oben schon gesagt, dass es vom LCD abhängt, ob dessen Controller darüber hinaus höherwertige Primitiva zur Verfügung stellt. Wenn er das nicht tut (ist eine Kaufentscheidung) dann muss man bei Pixeln anfangen. Macht ja auch Spass.
An Büchern würde ich mich Karl-Heinz Buchegger anschliessen: Computer Graphics: Principles and Practice in C. Zum Thema Displays selber: Du Programmierst ja nicht das Display sondern den Controller (klugscheiss). Der Controller steuert das eigentliche Display an. Es gibt im Prinzip drei Arten von Displays zu kaufen: - Controllerlose (da musst du einen externen Display-Controller dranhängen), - mit integriertem Controller (ist schon einer drauf), die sind dann von der Ansteuerung ähnlich wie der HD44780 mit dem du vermutlich bei deinem Textdisplay gearbeitet hast, also z.b. 6/8 Datenleitungen und ein paar Steuerleitungen zum schreiben ins Grafik-RAM - und welche auf denen noch ein extra µC sitzt, der schon die ganzen Grafikroutinen drin hat und nach aussen Z.b. RS232 spricht. dem sagst du dann nur noch KREIS(X, Y, R). (Sehr teuer und langweilig :-) ) Was für dich am Anfang m.E. wichtig ist, ist dass du dir einen gut dokumentierten Grafikcontroller rausuchst. Je verbreiteter der Controller, um so eher findest du im Netz Hilfe... Bekannte Controller sind z.b. der S1D13700 von Epson oder der T6963.
also ist jedes display anders anzusteuern? Also muss ich bei jedem neuen projekt meine Funktionen neu schreiben?
B. S. schrieb: > also ist jedes display anders anzusteuern? Also muss ich bei jedem neuen > projekt meine Funktionen neu schreiben? :-) Die Basisfunktion. Auf einem Text-LCD musst du ja auch nicht alles neu machen, nur weil da jetzt ein anderer Controller drauf ist. Die Ausgabe eines Strings wird immer so aussehen
1 | void lcd_puts( const char* text ) |
2 | {
|
3 | while( *text ) |
4 | lcd_putc( *text++ ); |
5 | }
|
egal welches Text-LCD du hast. Denn: Die Funktion 'String ausgeben' stützt sich auf die Funktion 'Zeichen ausgeben'. Und nur die ist vom LCD-Controller abhängig. Und eine Funktion zur Zahlenausgabe
1 | void lcd_puti( int i ) |
2 | {
|
3 | char buff[10]; |
4 | itoa( buff, i, 10 ); |
5 | lcd_puts( buff ); |
6 | }
|
ist aus genau dem gleichen Grunde davon nicht betroffen. Von deinen LCD-Funktionen müssen nur die grundlegenden Basisfunktionen angepasst werden. Hast du die erst einmal, dann funktionieren alle anderen darauf aufbauenden Funktionen wieder wie gehabt. Genau das ist ja das Prinzip, das du vom PC auch als Grafik-Treiber kennst. Der Treiber stellt die grundlegenden Funktionen (wie Pixel setzen, Linie malen, Rechteck ausfüllen) zur Verfügung und Windows benutzt die dann um damit Fenster zu malen. In gleichen Masse ist natürlich eine Funktion
1 | void PaintHorizontal( int xStart, int yStart, int xEnd ) |
2 | {
|
3 | int i; |
4 | for( i = xStart; i < xEnd; ++i ) |
5 | PaintPixel( i, yStart ); |
6 | }
|
zunächst mal vom GLCD unabhängig. Dass man diese Funktion eventuell dann doch ans GLCD anpasst, weil die spezifische interne GLCD Struktur Optimierungen ermöglicht, steht auf einem anderen Blatt.
Bis ich meine Antwort geschrieben hab, war der Thread schon explodiert :-) Dein Problem ist also eher die Grafikprogrammierung an sich, OK. Jeder Controller ist ein bisschen anders anzusteuern. Deine SW baust du also am besten so, dass die Grafikroutinen vom Controller abstrahieren. Also eine Zeichenschicht für Linien, Kreise,... welche dann funktionen Aufruft, die den Controller ansteuern. Also irgendwie so: GAL_DrawLine(X, Y, len) { ..... HW_PutPixel(x, y) ... } HW_PutPixel(x, y) { .... CONTROLLER BIT-BANGING }
> Das Ansteuern der Pixelpunkte mit einem AVR? > > Die eigentliche programmierung von Formen und Zeichen? Das ist die einfache Moeglichkeit. Sie hat den Nachteil das sie nicht immer den effizientesten Ansatz bietet was die Geschwindigkeit angeht. Solange man aber keine Video kucken moechte reicht es erstmal. Dazu ein Beispiel: Es bietet sich an in seiner set_pixel Funktion zu kontrollieren ob man nicht ausserhalb seines Bildschirms rummalt. Das kann naemlich zu Zeigerfehlern fuehren. Wenn du dann in deinen hoeheren Funktionen eine Funktion hast welche eine Linie malt dann wuerde es eigentlich reichen zu kontrollieren ob der erste und der letzte Punkt auf dem Bildschirm liegt. Ich wuerde dir aber trotzdem empfehlen erstmal eine Funktion zu schreiben die nur ein beliebiges Pixel setzen kann und alles andere darauf aufzubauen. Das hat dann auch den Vorteil das du mal ein anderes Display nutzen kannst indem du nur diese eine Funktion austauscht. > Welt" zu bekommen und dann damit rum zu doktorn. sprich ein pixel hin > und her setzen aber dazu brauch ich doch erstmal eine Bibliothek mit > funktionen? Deine Vorstellungen in allen Ehren, aber so geht es nicht weil jedes Display anders angesprochen wird. > Datenleitungen und ein paar > Steuerleitungen zum schreiben ins Grafik-RAM Und wenn man dann merkt das benachbarte Bytes im Grafik-Ram keinesfalls immer benachbarte Pixel auf dem Bildschirm sind wird es interessant. :) > Was für dich am Anfang m.E. wichtig ist, ist dass du dir einen gut > dokumentierten Grafikcontroller rausuchst. Je verbreiteter der > Controller, um so eher findest du im Netz Hilfe Wichtig ist vor allem das man einfach das Datenblatt des Controllers auch mal liesst und nicht immer glaubt bei anderen abschreiben zu muessen! > also ist jedes display anders anzusteuern? Ja. Du kannst nicht einfach dein LCD austauschen und es wird laufen. Andererseits sind die Unterschiede nicht so extrem gross. Wenn man einmal ein Display am laufen hat dann kann man beim zweiten bestimmt 80% des Codes weiterverwenden und muss nur hier und da etwas aenderen. > Also muss ich bei jedem neuen > projekt meine Funktionen neu schreiben? Es haengt von deinen Faehigkeiten ab. Ich habe z.B verschiedenste Basislibaries welche alle eine set_pixel Funktion, eine clrscr Funktion (Geschwindigkeitsgewinn), eine init-Funktion und ein paar defines (MAX_X, MAX_Y, BLACK, WHITE) zur Verfuegung stellen. Ich kann dann einfach durch aenderen eines defines ein gaenzlich anderes LCD anstecken und es funktioniert. Olaf
Hallo Muß jetzt auch meinen Senf dazugeben weil ich auch gerade ein Anzeigesystem für KFZ/Maritim Bereich baue basierend auf den LEDSEE 320x240 echt super ding und rasend schnell im vergleich vom letzten pollin Touch display mit L irgendwas Controller da konnte man zuschauen wie ein Bild sich aufbaut bei diesen ist es nicht mit dem AUge Sürbar einschalten 320x240 Bild ist da. Habe auch ein Analog Tacho und tankanzeige nachgebildet den Zeiger setzte ich und merke mir die Positionen (Linien/Zeigernadel)wen der Zeiger weiterwandert wird anschließend der alte Zeiger mit den alten positionen gelöscht und immer so weiter so sieht es dann auch aus wie im KFZ. Großen Sinn macht es wenn das Display verschiedene Grafik Ebenen hat ich benutze 3Layer im Layer3 habe ich das Bild vom Tacho und Tankanzeige Im Layer 2 laufen die Zeiger und Zahlen /Text und im Layer 1 gebe ich Warnungen raus so spare ich mir das Löschen und neuzeichnen des gesammten Displays Das Hintergrundbild lade ich einmal und fertig. Text und Zahlen weiß ich die breite und lösche deie gesammte feld und schreibe dann die neuen werte. Alle Funktionen die ich benutze sind ja alle schon fix und fertig hier zu haben ich benutze die SED1335 Lib da ist die init Graphic (Linie Rechteck elipse kreis Bild aus Array usw) Ich hatte nur das Problem mit den 8bit breiten d.h ich eine Font nicht direkt auf pixel 3 setzten sondern nur um ein vielfaches von 8 0,8,16,24 usw. Da habe ich mir eine Routine gebastelt mit hilfe hier im Forum die mir das pixelgebnaue stzten von Bilddateien/FOnts aus dem Array erlaubt. ALs Font und Zeichen generator habe ich mir den BITFont Creator gekauft die Investition hat sich gelohnt ich kann für jeden Controller mir ein Array feld oder ganz und gar Fonts mit offset breite index usw. damit ist ein einfacher zugriff auf die fonst möglich über printf(text,"Bla bla %d\2,"wert) möglich.
Andreas Herrmann schrieb: > meinen Senf Ist zwar Offtopic, aber sieht trotzdem chic aus. Hast du das Display direkt in China bestellt? Andreas Herrmann schrieb: > ich benutze die SED1335 Lib Was für eine Lib ist das? Hab Interesse.
Hallo Ja direkt bei Ledsee und per Paypal bezahlt. Aber bitte keine Angst bekommen. Email Antworten darf man nicht erwarten habe zig mails geschrieben um mehr auskunft über das Display zu bekommen. Man bekommt automatisch eine Mail nach der Bestellung und wenn die Ware versand worden ist. Bei mir hat der ganze vorgang 3 Wochen gedauert aber dann wars da und gut verpackt und funktioniert. Hier die Lib Ich habe noch anpasungen in den defs nach Datenbaltt des SEDS gemacht weil ich alles auf grafik mit 3 layern mache. Gruß ANdy
Andreas Herrmann schrieb: > Hier die Lib Danke, die hatte ich auch schon gefunden. Da muß man das meiste ja noch selber machen. Also die Basics sind drin.
Hallo Aber mit den Basics kann man gut arbeiten was willst du mehr??? Die Ports definieren die defs richtig setzten wie man es will und schon hat man alles. Gruß Andy
Andreas Herrmann schrieb: > was willst du mehr Flächen füllen z.B. also mehr "intelligente" Funktionen. Highlight wäre natürlich 'ne Fensterverwaltung :-)
Hi >Aber mit den Basics kann man gut arbeiten was willst du mehr??? >Die Ports definieren die defs richtig setzten wie man es will und schon >hat man alles. Gerechter Weise sollte man aber sagen, das der SED1335 schon wesentlich mehr als gebräuchliche Controller bietet. Schon Befehle zum Pixelsetzen/ -löschen haben viele Controller nicht. Von Layern ganz zu schweigen. Da werden viele Sachen, die auf einem anderen Controllern Krampf sind zum Kinderspiel. MfG Spess
900ss D. schrieb: > Andreas Herrmann schrieb: >> was willst du mehr > > Flächen füllen z.B. also mehr "intelligente" Funktionen. Highlight wäre > natürlich 'ne Fensterverwaltung :-) Gibt's fast vollständig bei der "Konkurrenz"...Microchip Graphics Library http://www.youtube.com/watch?v=Y3JdgkiPGpU (ab 1:40)
@ B. S. (theben) Zunächst einmal sollte man erwähnen, daß es intelligente und nicht intelligente Displays gibt. Ein intelligentes Display kann z.B. selber einen Strich oder Kreis ziehen oder Text schreiben. Unintelligente Displays (wie z.B. die DOGMs) können nur Punkte setzen - und die nicht mal einzeln. Bei den dummen Displays musst Du also alles selber machen und dann ein gesamtes Bild zum Display übertragen. Dazu musst Du also erst mal ein Bild im RAM erzeugen. Dazu benötigst Du eine Funktion, mit der Du Punkte in diesem Bild setzen kannst. Dann baust Du Dir eine Funktion, mit der Du mittels der Punkte-Funktion eine Linie zeichnen kannst. Dann ein Kreis. Dann überlegst Du Dir, wie Du Buchstaben am besten ablegst und ins Bild kopieren kannst. Dann ganze Texte. Und wenn Du Dein Bild fertig gemalt hast, überträgst Du es auf das Display. Dann wird der Speicherbereich gelöscht und Du fängst von vorne an. (Oder Du radierst in dem Bild herum etc. whatever) Ich habe für ein Projekt mal pro Pixel ein ganzes Byte verbraucht. Wenn das Byte != 0, dann wurde ein Pixel gemalt. So konnte ich mehrere Layer einfach durch ver-UND-ung wieder löschen, während andere stehen blieben. Gruß Jobst
Hallo Also ich habe mir auch vorher gedanken gemacht ob ich mir ein fertiges Display Board mit USB oder RS232 oder SPI ansteuerung kaufe aber wo ich die Preise gesehen habe bin ich ohnmächtig geworden. Und ich muß sagen selbst ist der Mann oder die Frau. Alles andere kann jeder mit den PC das Display so fertig malen und dann in das board schieben.Ne das ist nichts für mich. Und auserdem lernt man nichts dabei. Gruß Andy
für das Grafikdisplay von myAVR gibts auch fertige und offene Bibliotheken... zum Beispiel hier: http://myavr.info/myForum/viewtopic.php?t=2832 cu BT
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.