Ein Traum in Farbe – Programmierung eines grafischen TFT-Farbdisplays
Als digitale Anzeigeeinheit für selbstgebaute Mess-und Funkgeräte verwendete ich bislang die verbreiteten grün-gelben oder blau-weißen Punktmatrix-LCD-Module. Wegen ihrer sehr eingeschränkten grafschen Darstellungsmöglichkeiten schielte ich neidisch auf die detailreichen, leuchtkräftigen Farbdisplays der Mobiltelefone mit ihren farbenfrohen Bedienoberflächen. Nachdem auch noch die Preise für TFT-Farbdisplays auf oder teilweise sogar deutlich unter das Niveau der Punktmatrixanzeigen sanken, fiel meine Entscheidung, die Herausforderung grafisches Farbdisplay anzunehmen.
Programmierbeispiele
Die Abbildungen zeigen den aktuellen Stand. Leider entspricht die Qualität der Bilder nicht der tatsächlichen optischen Leistung des Displays. Die Belichtungszeit war wohl zu kurz gewählt, so dass sich die Zeilen zu deutlich abbilden. Bessere Bilder folgen.
Code-Beispiel
Technische Daten
3,5" TFT-Grafik-Display der Firma Crytalfontz America Inc.
Typ: CFAF-320-240F-035T
Bildschirmgröße: 70mm × 52mm, aktive Bilddiagonale 89mm
320 × 240 Bildpunkte (76800 Pixel), 16,7 Millionen Farben (RGB)
integrierter Controller von Solomon Typ SSD 2119
50-poliges FFC-Kabel (Flexi-Band-Kabel) mit Nullkraftstecker-Adapter
Spannung: 4,0 V; 2x10 mA / 9 V für die zweizeilige Hintergrundbeleuchtung
16 Datenleitungen, 16 Steuerleitungen, 3,3 V max.
Mikrokontroller
Das TFT-Farbdisplay wird von einem Atmel-Mikrokontroller der neuesten Generation aAngesteuert.. Da das Display alleine 16 Datenleitungen benötigt und für verschiedene Anwendungen noch genügend I/Os zur Verfügung stehen sollen, fiel die Wahl auf einen ATXmega 128 A1 mit 100 Pins.
Platine
Die Platinen-Layout wurde mit dem für Amateurzwecke hervorragend geeigneten SprintLayout 5.0 von ABACOM entworfen und mit der Thermo-Transfer-Methode realisiert. Dabei betrugen die Leiterbahnbreite als auch die Abstände zwischen den Bahnen jeweils 0,25 mm. Im gesamten Herstellungsprozess waren nur wenige Korrekturen erforderlich, nach dem Ätzvorgang mussten lediglich zwei Kupferbrücken zwischen Leiterbahnen durchtrennt werden. Wider Erwarten war das Löten des Hundertfüsslers nicht sehr schwierig. Nach Aufbringen von Flussmittel wurde die Lötkolbenspitze mit nur soviel Lötzinn benetzt, damit keine Brücke zwischen zwei Kontakten entstehen konnte. Die Lötkolbenspitze wurde mit der Spur Lötzinn dann zwischen zwei Pins gehalten, so dass beide gleichzeitig verlötet wurden. Als optisches Hilfsmittel wurde nur eine stark vergrößern de Lupe, ein sogenannter Fadenzähler verwendet.
Vorarbeiten
Jeder noch so lange Weg beginnt mit einem Schritt – jede Grafikprogrammierung beginnt mit einem Pixel. Wenn das erste Pixel leuchtet und auch wieder gelöscht werden kann, ist das Wesentliche geschafft. Aber es dauerte bis zu diesem Ereignis eine ganze Weile. Bis dahin waren erforderlich:
Vorbereitungen | ||||
• | richtiger Anschluss des 50-poligen FFC | |||
• | korrekte Zuordnung aller Daten- und Steuerleitungen | |||
• | Hardware-Abstraktion mit weit über 1000 Möglichkeiten der Display-Initialisierung | |||
• | Einlesen in die 445-seitige ATXmega-Dokumentation |
|||
• |
intensives Studium der 95-seitigen Display Controller-Dokumentation (jede Zeile!) und der 133-seitigen Display-Beschreibung |
|||
• | Initialsierung der 44 Register | |||
Download Initialisierung.pdf
Kaum war alles richtig gemacht – und schon funktionierte das Display. Von der Ansteuerung eines Pixels leitete sich die weitere grafische Programmierung ab. Das Pixel selbst ist durch seine x/y-Koordinate definiert, seine Farbe durch einen 16/18-Bit RGB-Farbcode. Die grafische Programmierung wurde hierarchisch von einfachen grafischen Elementen bis zu komplexen Darstellungen aufgebaut. Programmiert wurde in C mit dem AVR Studio 4.0 von ATMEL. Die kompilierte Software wurde über die PDI-Schnittstelle des ATXmega mit einem schnellen USB- Programmmer transferiert.
Algorithmen in C für: | |||||
• |
Linien: durchgezogene, gestrichelte oder gepunktete Linien, orthograd oder schräg, mittels Bresenheim-Algorithmus |
||||
• | Rechtecke: als Linie oder als Fläche | ||||
• |
Labels: Rechtecke mit abgerundeten Ecken und variablem Eckenradius |
||||
• | Kreise und Kreissegmente: ebenfalls als Linie oder als Fläche, unter Verwendung von geometrischen und algebraischen Algorithmen | ||||
• | dynamische Linien: z.B. beweglicher Zeiger. |
||||
• | Skalen mit geometrisch definierten Skalenstrichen | ||||
• | Generierung von 5 Fonts unterschiedlicher Größe mit einem Fontgenerator | ||||
• | Entwurf einer einfachen Textverarbeitung, dezimalpunktorientierte Zahlendarstellung | ||||
• | Implementierung einer digitalen Signalverarbeitung für ein einfaches Speicher-Oszilloskop |
Anwendungsbeispiele
Mit den grafischen Werkzeugen entwickelte sich die Software für verschiedene Anwendungen fast wie von selbst. Bislang wurden beispielhaft folgende Oberflächen programmiert:
![]() |
Auswahlmenü mit Aktivierungsanzeige, Tasten gesteuert | ||
![]() |
Mittelwellen-Transceiver: Bedienoberfläche mit digitaler Frequenzeinstellung mittels Dreh-Encoder,
Bandbreiteneinstellung, intelligentem S-Meter (Zeigeranzeige, S-Wert mit dB-Angabe über S9 sowie einer absoluten dBm-Wertangabe), Band-Spektroskop |
||
![]() |
Netzteil: Oberfläche für ein digital kontrolliertes Labornetzgerät | ||
![]() |
Digitales Speicheroszilloskop: Digitale Signalverarbeitung, einstellbare Triggerschwelle
mit Freilauf und automatischer Signalvermessung |
||
![]() |
Milliwatt-Meter: Parallele Anzeige in dBm, mW und µV an 50 Ohm, digital einstellbarer Abschwächer | ||
![]() |
Smith-Diagramm als grafische Animation | ||
![]() |
Analoges Zeigerinstrument: universell einsetzbares trägheitsloses Anzeigeinstrument mit einer Auflösung der Skalenanzeige von 300 Pixeln! Zusätzliche Balkenlupe mit weiterer Steigerung der analogen Auflösung um den Faktor 10. Der Anzeigewert oder errechnete Parameter können auch als Digitalwerte mit korrespondierender Masseinheit eingeblendet werden. |
Wird fortgesetzt.
Christian, DL9NL