Mikrocontroller-Einstieg mit myAVR Teil 7/7
Aus ELVjournal
03/2007
0 Kommentare
Keine
Angst vor dem Einstieg in die Welt der Mikrocontroller-Programmierung!
Die myAVR-Sets enthalten alles Nötige für den schnellen und fundierten
Beginn der Programmierer-Karriere – Experimentier-Board mit
ATMEL-Controller, Lehrbuch, Softwarepaket, Kabel, sämtliches Zubehör.
Im siebtenTeil unserer Serie zur Programmierung des AVR besprechen wir
die Grundlagen der Programmierung zur Ansteuerung von LC-Displays.Punkt für Punkt – LC-Displays
LC-Displays
gibt es in zahlreichen Formen, hauptsächlich sind dies die
anwendungskonfigurierten Displays, die einem festen Verwendungszweck
zugeordnet sind und nur bedingt anderweitig nutzbar sind, die
Punktmatrix-Displays, die auf unterschiedlichen Zeilenzahlen und
Zeilenlängen meist Zeichen in einer 5x7- bzw. 5x10-Punktmatrix
darstellen können. Die dritte große Klasse sind die frei
programmierbaren Grafik-Displays, die in horizontaler und vertikaler
Richtung jeweils eine bestimmte Bildpunktzahl darstellen können. Dies
kann einfarbig (z. B. bei vielen Messgeräten) oder mehrfarbig (z. B. bei
TFT-Farbbildschirmen) erfolgen. Für einfache Text- und
Pseudografik-Anzeigen genügen jedoch die beschriebenen alphanumerischen
Punktmatrix-Displays. Hier können Texte, Ziffern und Pseudografiken
angezeigt werden, die in einem Zeichen-ROM des LCD-Controllers abgelegt
sind. Zusätzlich verfügt der LCD-Controller über einen kleinen
RAM-Bereich (CGRAM), in den selbst kreierte Zeichen ladbar und von dort
abrufbar sind.
LCD-Controller? Ja, jedes Display verfügt über einen eigenen Controller,
der dem Steuerrechner, in unserem Fall dem AVR, viel Arbeit abnimmt. Er
empfängt Steuerbefehle und Daten und steuert darauf basierend die
entsprechende Ausgabe auf der Anzeige aus. Das spart u. a. unzählige
Leitungen, denn je Anzeigezeile sind 8 Zeilenleitungen und bis zu 80
Segmentleitungen zu verwalten. Für die Initialisierung und den Ablauf
der Anzeige sind einige Zeitfaktoren einzuhalten, auch das erledigt zum
Teil der LCD-Controller, der auf einer Platine unmittelbar hinter dem
eigentlichen LCD-Panel sitzt. Nach außen hin agiert dieser Controller
mit einer standardisierten Schnittstelle (Abbildung 1), die bei allen
Displays dieser Art gleich ist. Hier taucht spätestens der Begriff
„HD44780-kompatibel“ auf. Das bezeichnet den am häufigsten eingesetzten
LCD-Controller HD44780 von Hitachi, der neben dem Samsung KS00xx quasi
den Industriestandard bildet. Er kann Displays mit bis zu 2 Zeilen und
jeweils 8 Zeichen ansteuern. Für größere Displays erfolgt eine
Kaskadierung mehrerer Controller bzw. der Einsatz komplexerer Controller
anderer Familien, die sich aber nach außen über genau die gleiche
Schnittstelle zeigen wie ein einzelner Display-Controller.
|
Bild 1: Standard-Anschlussbelegung der parallelen LCD-Schnittstelle und Aufbau des LCD-Moduls |
Wie
man Abbildung 1 entnehmen kann, genügen 11 Leitungen, um die
Kommunikation zwischen Steuer- und Anzeigecontroller zu regeln. Dazu
kommen die Spannungsversorgung (Vss [Masse], Vdd [Versorgungsspannung]),
die Kontrasteinstellung des Displays (Vo) und die seit einigen Jahren
zum Standard gehörende Displaybeleuchtung (BLA, BLK) mittels LEDs. Diese
Art der Schnittstelle nennt man 8/4-Bit-Parallel-Interface, je nach
Programmierung des Display-Controllers sind also die 8-Bit-Daten
parallel als volles Byte (8 Bit) oder als zwei Halbbytes (je 4Bit, Low-
und High-Teil) übertragbar. Neben diesem Parallel-Interface gibt es noch
mehrere Arten von seriellen Schnittstellen, die wir an dieser Stelle
jedoch nicht näher betrachten wollen.
Wie die Schnittstelle in der Praxis aussieht, zeigt Abbildung 2. Hier
sieht man die typischen 14- bis 16-poligen Anschlussreihen. Einige
Displays erfordern den getrennten Anschluss der Hintergrundbeleuchtung,
älteren Displays fehlt der ganz.
|
Bild
2: Einige typische Displays mit ihren Anschlüssen. Oben das
myAVR-LCD-Add-on, dessen Display die typische einreihige, 16-polige
Schnittstelle anbietet. Darunter links ein 2x8-Display mit weit
verbreiteter 14-poliger Schnittstelle und extra Backlight-Anschlüssen.
Rechts danaben ein Display mit einreihigem 14-poligen Anschluss und
abgesetztem Backlight-Anschluss. Unten ein älteres Display mit
14-poligem Anschluss, ohne Beleuchtung. |
So
einheitlich die Schnittstelle ist, so unterschiedlich fällt, Display
für Display, die Zuordnung der Anzeigedaten (Display-Organisation) in
dessen Speicher aus. Das stellt gerade den Einsteiger vor Probleme, wenn
er für ein vorhandenes Programm ein abweichendes Display einsetzen
möchte. Glücklicherweise liefert jeder Display-Hersteller ein
Datenblatt, in dem die Speicherorganisation detailliert aufgeführt wird.
So kann man das Beschreiben des Anzeige-RAMs im Display-Controller
genau auf dessen Organisation ausrichten.
|
Tabelle 1: Befehlstabelle des Display-Controllers |
Zum
Verständnis eines Displays samt seinem Controller gehört auch die zu
jedem Display gehörende Befehls- und Timing-Tabelle (Tabelle 1 zeigt ein
Beispiel). Hier findet man alle relevanten Display-Befehle, deren
Erklärung und Ausführungszeiten. Letztere sind bei der Programmierung
besonders wichtig, um das Zeitregime bei der Befehls- und
Datenübermittlung einzuhalten. Denn der Display-Controller ist im
Verhältnis zum Steuer-Controller, also unserem AVR, viel langsamer –
darauf muss man sich einstellen!
|
Bild
3: Die Zeitabläufe (Timing) beim Übertragen von Kommandos (oben, RS =
0) und Zeichen (unten, RS = 1). Bei jedem Enable-Impuls erfolgt die
Übernahme eines Kommando- bzw. Zeichen-Halbbytes in den
Display-Controller. |
In
der Praxis diktiert die Abfolge von Steuerbefehlen und Daten das
Geschehen an der Schnittstelle. In Abbildung 3 ist das vereinfachte
Timing-Diagramm dazu gezeigt. Für die Arbeit mit dem AVR-Controller
sind hier vier Dinge wichtig:
1. Es muss der Display-Controller unterscheiden können, ob jetzt ein
Kommando oder Daten übertragen werden sollen. Dies erkennt er, wie wir
in Tabelle 1 sehen, über den Zustand der Leitung RS.
2. Der Enable-Impuls, der dazu dient, das kommende Kommando bzw. die
Daten in den Display-Controller-RAM zu übernehmen, muss zum richtigen
Zeitpunkt gesendet werden. Mit dessen fallender Flanke erfolgt die
Übernahme.
3. Für unsere AVR-Anwendungen ist kein Lesen aus dem Display-Controller
nötig, deshalb liegt R/W immer auf „low“.
4. Da die meisten AVR-Controller keine Extra-Pins für den Anschluss
eines Displays aufweisen (es gibt wenige Spezialtypen hierfür), nutzt
man die Option des Display-Controllers, ihn im 4-Bit-Modus zu bedienen.
Das erfordert dann auf der AVR-Seite nur wenige Controller-I/O-Pins für
die Ausgabe auf das Display.
Da der AVR vergleichsweise flott getaktet ist, kann man bei
I/O-Pin-Mangel zu einem Trick greifen: Während der Display-Controller
noch damit beschäftigt ist, die geschickten Daten auf das Display zu
bringen, kann man die betreffenden I/O-Pins des AVR „schnell“ auf
Eingabe umschalten und z. B. zum Abfragen von Tastenzuständen nutzen. So
können geschickte Programmierer auch Displays an AVRs mit sehr wenigen
I/O-Pins betreiben.Das myAVR-LCD-Add-on
|
Bild 4: Das LCD-Board mit der Pin- und Port-Belegung für die LCD-Ansteuerung |
Damit
kommen wir zum speziell für die Nutzung am myAVR-Board konzipierten
myAVR-LCD-Add-on (Abbildung 4). Das kommt mit einigen der AVR-Kits oder
ist preiswert einzeln als Bausatz oder betriebsfertige Platine
erhältlich. Die trägt ein zweizeiliges, je 16-stelliges LC-Display mit
Hintergrundbeleuchtung, das ein HD44780-kompatibles Interface besitzt.
Der Kontrast ist über einen Trimmer auf der Platine einstellbar. Die
Hintergrundbeleuchtung ist über einen Jumper wahlweise fest an +5 V
gelegt oder, vom AVR gesteuert, schalt- bzw. dimmbar.
Man erkennt sehr schnell, dass hier tatsächlich nur 4 Pins für die
Daten- und Kommandoausgabe und 2 Pins zur Steuerung erforderlich sind,
die Platine nutzt den Port D des AVR-Controllers. Will man die
Beleuchtung vom AVR aus schalten oder dimmen, kommt noch Port B1 hinzu.
Somit stehen noch (fast) alle Pins der Ports B und C für andere Zwecke
zur Verfügung. Die sind für weitere Add-on-Platinen zu einer
Buchsenleiste durchgeschleift.
Die Folge ist, dass alle Programmierungen des LC-Displays im 4-Bit-Modus
erfolgen müssen!
In der Begleitdokumentation zum myAVR-LCD-Add-on sowie im
myAVR-LCD-Lernheft sind alle Informationen zur Hardware, so u. a. auch
die Speicherorganisation des verwendeten Displays, der Zeichensatz und
weitere Infos ausführlich dargestellt, weshalb wir hier nicht weiter
darauf eingehen wollen. Wenden wir uns also der Programmierpraxis zu!Die Initialisierung des Displays
Wie
der AVR erfordert auch der Display-Controller eine Reihe von Maßnahmen,
um ihn definiert zu starten – das Display ist zu initialisieren. Dieser
Part ist äußerst wichtig, hier gibt es die meisten „unerklärlichen“
Fehler im späteren Betrieb. Darum sind die Startbedingungen, die im
AVR-Lehrmaterial noch einmal detailliert erläutert sind, akribisch zu
beachten!
Zur Initialisierung sind Display-Controller und AVR einige Mitteilungen
zu machen, die diese in die Lage versetzen, miteinander zu
kommunizieren:
1. Der AVR ist so zu initialisieren, dass Port D als Ausgang geschaltet
ist.
2. Dem Display-Controller ist eine Wartezeit entsprechend Datenblatt zu
gewähren, damit er hochfahren kann.
3. Der Display-Controller ist in den 4-Bit-Mode zu schalten, um das
bereits besprochene 4-Bit-Interface nutzen zu können (Bit 4 „DL“ in der
Zeile „Function Set“ der Kommando-Übersicht auf 0 setzen).
4. Dem Display-Controller ist mit dem Befehl „Function Set“ mitzuteilen,
wie viele Zeilen des Displays (Bit 3 „N“ in der Zeile „Function Set“
der Kommando-Übersicht; 0 für 1 Zeile, 1 für beide Zeilen setzen) und
welche Zeichenmatrix (Bit 2 „F“ in der Zeile „Function Set“ der
Kommando-Übersicht; 0 für 5 x 7, 1 für 5 x 10 setzen) verwendet werden
soll. Wir werden beide Zeilen und die 5x7-Matrix verwenden.
5. Mit dem Befehl „LCD off“ (siehe Tabelle 1) wird das Display zunächst
abgeschaltet, um keine undefinierten Ausgaben zu erhalten.
6. Mit dem Befehl „LCD clear“ (siehe Tabelle 1) erfolgt das
Überschreiben des gesamten Display-Controller-RAMs mit Leerzeichen und
das Rücksetzen des Display-Cursors auf das erste Zeichen der ersten
Zeile. So ist der Start klar definiert.
7. Mit dem Kommando „Entry Mode Set“ (siehe Tabelle 1) wird der
Einfügemodus für die Zeichen festgelegt.
8. Zuletzt wird mit dem Befehl „LCD on“ das Display eingeschaltet.
|
Bild
5: Der allgemeine Befehlsablauf bei der Display-Initialisierung
(Befehle und Wartezeiten siehe Tabelle 1 und Assemblerlisting, zum
Ablauf der Function-Set-Sequenz siehe Text) |
Der
gesamte Ablauf ist in Abbildung 5 noch einmal zusammengefasst. Die
einzelnen Programmteile in Assembler hierzu finden sich im Gesamtlisting
als entsprechende Unterprogramme. Zu beachten ist, dass der
LCD-Controller zunächst ja auf den 8-Bit-Modus konfiguriert ist. Da wir
aber nur 4 Datenleitungen nutzen und jedes Kommando, wie auch die Daten,
in Form von zwei Halbbytes übertragen, geht „natürlich“ beim ersten
Kommando „Function Set“ ein Halbbyte verloren. Deshalb ist das Kommando
anschließend nochmals komplett zu übertragen und erscheint in Abbildung 5
so quasi zweieinhalb Mal. Wichtig sind auch die angegebenen Wartezeiten
zwischen den Befehlen. Sie sind (aufgerundet und an die
AVR-Teilerfaktoren angepasst) ebenfalls als Unterprogramme im
Gesamtlisting untergebracht (siehe z. B. LCD-Enable-Interrupt und die
Wait-Sequenzen, die immer wieder neu aufgerufen werden).Das erste LCD-Projekt
Nachdem
die Initialisierung geschafft ist, machen wir uns an das erste
Programm, um einen kleinen Text auf dem Display anzeigen zu lassen.
Wenn wir das Gesamt-Listing betrachten, finden wir viele alte Bekannte,
so zuerst die Grundstruktur des AVR-Assemblerprogramms. Für das erste
Programm benötigen wir in der Interrupt-Vektortabelle nur den
Power-on-Reset. Die folgende Start-Sequenz für den AVR-Controller ist
ebenfalls bereits bekannt.
Bevor wir das Hauptprogramm betrachten, gehen wir etwas weiter hinunter
und finden dort die bereits angesprochenen Warte-Routinen und die im
vorherigen Kapitel ausführlich beschriebene Initialisierung des
Displays.
Von „LCD_data“ bis „LCD_enable“ gibt es etwas Neues – die
Steuer-Routinen für die Übertragung der Kommandos und Daten an den
LCD-Controller.
Die Sprungmarken „LCD_data“ bzw. „LCD_cmd“ schalten die Leitung RS um,
um so anzukündigen, welche Art von Daten nun folgen.
Unter „LCD-out“ erfolgt dann die Ausgabe an den LCD-Controller in der
Reihenfolge: 1 oberes Halbbyte separieren 2 oberes Halbbyte und
RS-Zustand an Port D bereitstellen 3 Enable-Impuls an den
LCD-Controller schicken 4 unteres Halbbyte separieren 5 unteres Halbbyte
und RS-Zustand an Port D bereitstellen 6 Enable-Impuls an den
LCD-Controller schicken, dazu dient das Unterprogramm „LCD-enable“, das
das Enable-Signal für kurze Zeit setzt 7 Ausführungszeit des
LCD-Controllers abwartenIn
dieser Weise findet man alle Unterprogramme und Sprungmarken immer
wieder als Standard für die LCD-Ansteuerung vor. Natürlich gibt es noch
eine Anzahl weiterer Kommandos, so kann man den Cursor ein- und
ausschalten, ihn blinken lassen, Zeichen an bestimmten Stellen im
Display erscheinen lassen usw. All dies beschreibt das myAVR-Lernheft
für das LCD-Add-on detailliert. Wir haben uns hier allein auf die in
unserem Programmbeispiel verwendeten Kommandos beschränkt. Fehlt nur
noch das Hauptprogramm! Und das gestaltet sich in diesem Falle recht
einfach. Wir laden ein ASCII-Zeichen in ein Register und lassen es über
die Sprungmarke „LCD_data“ und das Unterprogramm „LCD_out“ in zwei
4-Bit-Teilen an den LCD-Controller ausgeben. Da dessen Zeichensatz
ebenfalls weitgehend dem ASCII-Zeichensatz entspricht, ist hier die
Eingabe sehr einfach, man muss sich nicht mit Binärdaten mühen, die
ASCII-Zeichen werden automatisch umgesetzt. Anders wäre dies bei selbst
kreierten Zeichen – auch das ist möglich. Das Lernheft zeigt hier sehr
interessante und ausführliche Beispiele, wie man es macht. So findet man
hier u. a. auch ein Beispiel zur Umsetzung eines Analogwertes per ADC
in eine adäquate LCD-Anzeige und Programmieranleitungen für C und
BASCOM. Unseres Erachtens nach ist dieses Lernheft ohnehin eine der
eingängigsten deutschen LCD-Programmieranleitungen auf dem Markt. Ist
alles compiliert und auf den AVR gebrannt, sollte nun „Hallo myAVR“ im
Display der auf das myAVR-Board gesteckten LCD-Add-on-Platine
erscheinen. Mit diesem einfachen Beispiel gelingt ideal der Einstieg in
die LCD-Programmierung, man kann das Programm gleich als Spielwiese
benutzen, längere Texte anzeigen lassen, beide Zeilen belegen, Texte an
gewünschter Stelle im Display erscheinen lassen usw. Viel Spaß! Fachbeitrag online und als PDF-Download herunterladen
Inhalt
Sie erhalten den Artikel in 2 Versionen:
als Online-Version
als PDF (5 Seiten)
Sie erhalten folgende Artikel:
- Mikrocontroller-Einstieg mit myAVR Teil 7/7
weitere Fachbeiträge | Foren | |
Hinterlassen Sie einen Kommentar: