Forum: Compiler & IDEs Strategie Grafikdisplay programmieren


von Fly (Gast)


Lesenswert?

Ich habe dieses Atmega128 Board:

http://www.chip45.com/AVR-Mikrocontroller-System-Platinen/Savvy128-V1-3-ATmega128-USB-RS232-RS485-Echtzeituhr-SD-Karte.html

und steuere über SPI dieses Grafikdisplay CTS2432 an:

http://www.demmel.com/ilcd/deutsch/cpanel2432.htm

Programmiert wird in C mit GCC und AVR Studio

Auf dem Display sollen zum einen nahezu statische Zustände (AN, AUS 
etc.) dargestellt werden und aber auch dynamisch veränderliche.
Z.B. vier Bargrafen, also Balken, dessen länge sich ständig mit dem 
Messwert verändert. Eventuell auch die Farbe oder alternativ als 
Rundzeiger a´la Tacho.
Jetzt ist die Frage wie man das prinzipiell an geht. Ich sehe da mehrere 
Möglichkeiten:

1.) Ich baue a´ la Fernseher das komplette Displaybild 25x in der Sec. 
neu auf.

2.) Ich verändere nur die Pixel, die sich ändern müssen. Also wenn der 
Balken kürzer wird überschreibe ich die Pixel am Balkenende mit der 
Hintergrundfarbe etc.

3.) So wie ich auf die schnelle in der Beschreibung des Befehlssatzes 
gesehen habe kann man Bereiche definieren. Hier eventuell für jeden 
Bargraf den größtnötigen Platz definieren und nur diesen komplett 
erneuern?

Wie würdet ihr das machen oder was ist so üblich?
Google und dieses Forum konnte mir auf diese Frage noch keine 
befriedigende Antwort geben.

von Tom M. (Gast)


Lesenswert?

Fly schrieb:
> 1.) Ich baue a´ la Fernseher das komplette Displaybild 25x in der Sec.
> neu auf.

Das übernimmt das Display ja schon für dich.

> 2.) Ich verändere nur die Pixel, die sich ändern müssen. Also wenn der
> Balken kürzer wird überschreibe ich die Pixel am Balkenende mit der
> Hintergrundfarbe etc.

Das Teil hat massenhaft RAM. Vielleicht beherrscht es sogar overlay oder 
Kopieraktionen; dann könntest du verschiedene RAM Bereiche als 
Zwischenspeicher für die Balkengrafik usw. verwenden und dann 
einblenden/in den sichtbaren Bereich kopieren.

> 3.) So wie ich auf die schnelle in der Beschreibung des Befehlssatzes
> gesehen habe kann man Bereiche definieren. Hier eventuell für jeden
> Bargraf den größtnötigen Platz definieren und nur diesen komplett
> erneuern?

Das Teil hat "nur" serielle Interfaces, damit kannst du nicht eben mal 
grössere Datenmengen rumschaufeln. Würde versuchen, beim Boot-Up 
möglichst alles (Zeichensatz, Grafiken) auf das Modul zu schieben und 
dann zu verwenden. Ob das intelligente Display das unterstützt, sagt dir 
sicher das Datenblatt.

Viel Spass, sieht interessant aus! :)

von Karl H. (kbuchegg)


Lesenswert?

Fly schrieb:

> Wie würdet ihr das machen oder was ist so üblich?

Das Teil hat ja einen eigenen Prozessor, der für sich alleine schon eine 
Menge kann.
Im Grunde hast du da ein kleines Grafikterminal, welches aus 
Grfikkommandos reagiert. Und genau so wird es dann auch angesteuert: Die 
Veränderungen werden in Kommandos gefasst und diese Kommandos zum 
Display geschickt, bzw. die Bereiche entsprechend neu aufgebaut.

> 1.) Ich baue a´ la Fernseher das komplette Displaybild 25x in
> der Sec. neu auf.

Wozu?
Das ist doch massig Transfer für nichts. Sofern du mit der 
Übertragungsrate überhaupt hinkommst.

> 2.) Ich verändere nur die Pixel, die sich ändern müssen.
>  Also wenn der Balken kürzer wird überschreibe ich die
> Pixel am Balkenende mit der Hintergrundfarbe etc.

Ja.
Nur arbeitest du nicht auf Pixelebene, solange das nicht notwendig ist.
Ein Balken ist in erster Instanz ein Rechteck. Und genau so teilst du 
das auch dem Display mit:
male ein Rechteck von hier bis hier.
Und wenn sich der Balken verändern soll, denkt man sich eine Strategie 
aus:
Wird der Balken länger, dann wird mit der Balkenfarbe der hinzukommende 
Teil als Rechteck hinzugefügt (oder mglw. der Balken überhaupt komplett 
als Rechteck neu gezeichnet) wird er kürzer, so deckt ein Rechteck in 
der Hintergrundfarbe den nun überflüssigen Teil ab.

Da du anscheinend meherere Screens zur Verfügung hast, sollte man sich 
auch Gedanken darüber machen, wie man die für ein Double-Buffering 
nutzen kann. Änderungen werden zunächst in einem nicht sichtbaren Screen 
gemacht, und erst dann wenn alle Änderungen fertig sind, wird der bisher 
nicht sichtbare Screen angezeigt.
Auch kann man sich in nicht sichtbaren Screens so etwas wie Sprites 
zurechtlegen. Also vordefinierte Grfaiken, die als Ganzes aus dem einen 
Screen ausgeschnitten und in einen anderen Screen eingesetzt werden.

von Fly (Gast)


Lesenswert?

Klasse ich danke euch beiden für die ausführlichen Erläuterungen.
Lösung 1 ist wohl damit tot. Möglichst viel das Display arbeiten zu 
lassen leuchtet mir jetzt auch ein. Nicht nur um den Datentransfer 
gering zu halten sondern auch mein µC Bord zu entlasten.
Die Idee mit dem "Vorbereiten" auf einem unsichtbaren Layer war mir neu. 
Coole Sache, cooles Forum :-)

von Fly (Gast)


Angehängte Dateien:

Lesenswert?

So, jetzt weis ich wie das Layout aussehen soll.
Im "Layout_01" ist die Originaldarstellung wie sie auf dem Display 
erscheinen soll.
Im "Layout_01_Verteilung" habe ich nach Häufigkeit der zu ändernden 
Werte eingefärbt.
Rot = Häufige Veränderung
Blau = Langsame Veränderung
Weiß = Statisch

Zur Verfügung habe ich "nur 8 Viewports" die ich wie einzelne kleine 
Displays ansprechen kann.

Hat einer eine schlaue Idee wie man das elegant programmiert?

Und noch eins, ich finde nichts wie man Schriftgrößen scalieren kann. 
Also z. B. 24pt für Überschrift und 12pt für Text. Das einzige was mir 
dazu einfällt ist beide Schriftgrößen als einzelne Schriftsätze an zu 
legen und dann auf zu rufen.
Oder hab ich da was übersehen?

von Karl H. (kbuchegg)


Lesenswert?

Fly schrieb:

> Zur Verfügung habe ich "nur 8 Viewports" die ich wie einzelne kleine
> Displays ansprechen kann.

Machs nicht zu kompliziert.

Du hast 3 'konzeptionelle' Displays.
Je eines für EGT, BPC2 und LPG

Jedes diese 'Displays' besteht aus einer Caption Aray und den möglichen 
Balken.

Vielleicht ist es auch geschickt, verschiedene Display-Typen zu 
erfinden, die unterschiedlichen Aufbau haben (wie sich die opere Caption 
Area zusammensetzt). Musst du entscheiden.

Aber mach nicht den Fehler, für jede Kleinigkeit einen eingenen Viewport 
zu erfinden. Irgendwann kennst du dich nämlich vor lauter Viewports 
nicht mehr aus.

> Schritftgröße
Das ist in der Tat interessant.

Im PDF steht, dass die ASNI Sequenzen unterstützt werden. Da gibt es 
auch welche mit der man den Text mit doppelter Höhe ausgeben kann. Mann 
muss den Text dann auf 2-mal ausgeben: einmal die obere Zeichenhälfte, 
einmal die untere.

von Fly (Gast)


Angehängte Dateien:

Lesenswert?

So ich habe fertig :-)

Es gibt jetzt für EGT, BPC und LPG je ein Viewport der nur aktualisiert 
wird wenn wirklich geänderte Daten ankommen.

Im Anhang habe ich die Dateien angehängt, zur freien Verwendung, 
kritisieren und verbessern.

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.