erstellt 29.01.2012
Meiner erster Versuch ein Display mit dem AVR Atmega 8 anzusteuern
Als erstes hab ich mich für ein LCD Dot-Matrix-Modul, 2x 16 Zeichen entschieden weil, es vom Preis / Leistungsverhältnis mir am nächsten kam.
Ansteuerung per Mikrocontroller
Die Ansteuerung eines Displays mit HD44780 Controller gestaltet sich sowohl was den Hardware- als auch den Softwareaufwand angeht relativ einfach und eignet sich somit sehr gut als Übungsprojekt für Anfänger. Der HD44780-Controller benutzt  8 Datenleitungen(D0 bis D7) sowie den 3 Steuerleitungen RS(Register Select), R/W(Read/Write) und E(Enable). Das Displays wird mit 5V Betriebsspannung versorgt, die Kontrastspannung Vee bekommt man, indem man ein 10k-Poti zwischen VCC und GND anschließt und den mittleren Anschluss als Kontrastspannung verwendet. Bei ca. 4,5 Volt je nach verwendeten Display werden dann die Pixel sichtbar. Optional haben viele Displays noch eine LED-Beleuchtung eingebaut,wie auch hier die von mir verwendete. Möchte man nur einen 8-Bit-Port zur Ansteuerung verwenden, so ist dies möglich, indem man lediglich die Pins D4-D7 sowie die 3 Steuerleitungen an den Controller anschließt, das Display muss dann im 4-Bit-Modus betrieben werden.Es können auch Displays verwendet werden die einen Kompatiblen Controller verwenden, z.B. KS0073.
Das LCD und sein Controller

Die meisten Text-LCDs verwenden den Controller HD44780 oder einen kompatiblen (z.B. KS0070) und haben 14 oder 16 Pins. Die Pinbelegung ist praktisch immer gleich:

LCD
                    Bild
Pin
Bezeichnung
Funktion
1 Vss GND
2 Vcc 5V
3 Vee Kontrastspannung (0V bis 5V)
4 RS Register Select (Befehle/Daten)
5 RW Read/Write
6 E Enable
7 DB0 Datenbit 0
8 DB1 Datenbit 1
9
DB2 Datenbit 2
10 DB3 Datenbit 3
11 DB4 Datenbit 4
12 DB5 Datenbit 5
13 DB6 Datenbit 6
14 DB7 Datenbit 7
15 Anode Plus für Hintergrundbeleuchtung
16 Katode Minus für Hintergrundbeleuchtung
Display
mit weiße Schrift auf blauem Hintergrund
Punktgröße: 5,56 mm
Modulgröße: 80 x 36 x 13 mm
sichtbares Feld: 66 x 16 mm
Controller: KS0070B, HD44780 kompatibel
weiße LED Hintergrundbeleuchtung
Ultra Low-Power 15 ... 60 mA
Achtung: Unbedingt von der richtigen Seite zu zählen anfangen! Meistens ist neben Pin 1 eine kleine 1 auf der LCD-Platine, ansonsten im Datenblatt nachschauen. Bei LCD's mit 16-poligem Anschluss sind meist die beiden letzten Pins ( Pin 15 und 16 )für die Hintergrundbeleuchtung reserviert. Hier unbedingt das Datenblatt zu Rate ziehen weil die Hintergrundbeleuchtung aus Leuchdioden besteht muss der Strom dafür mit einem Vorwiderstand begrenzt werden. Falls kein Datenblatt vorliegt, kann man mit einem Durchgangsprüfer feststellen, welcher Anschluss mit Masse (GND) verbunden ist.
Vss wird ganz einfach an GND angeschlossen und Vcc an 5V.
Vee kann man testweise auch an GND legen. Wenn das LCD dann zu dunkel sein sollte muss man ein 10k-Potentiometer zwischen GND und 5V schalten, mit dem Schleifer an Vee

Bild:LCD_Vee.gif

8 oder 4 Bit Modus

Es gibt zwei verschiedene Möglichkeiten zur Ansteuerung eines solchen Displays: den 8-Bit- oder 4-Bit-Modus.
Für den 8-Bit-Modus werden (wie der Name schon sagt) alle acht Datenleitungen zur Ansteuerung verwendet, somit kann durch einen Zugriff immer ein ganzes Byte übertragen werden
Der 4-bit-Modus verwendet nur die oberen vier Datenleitungen (DB4-DB7). Um ein Byte zu übertragen braucht man somit zwei Zugriffe, wobei zuerst das höherwertige "Nibble" (= 4 Bits), also Bit 4 bis Bit 7 übertragen wird und dann das niederwertige, also Bit 0 bis Bit 3.
Die anderen Datenleitungen des LCD's, die beim Lesezyklus Ausgänge sind, lässt man offen .

Der 4-Bit-Modus hat den Vorteil, dass man 4 IO-Pins weniger benötigt als beim 8-bit-Modus, weshalb ich mich hier für eine Ansteuerung mit 4 Bit entschieden habe. Neben den vier Datenleitungen (DB4, DB5, DB6 und DB7) werden noch die Anschlüsse RS, RW und E benötigt.
Die 4 bit Lösung hat aber auch den Nachteil das zum Schreiben doppelt so oft auf das Display zugegriffen werden muss, wodurch der Programmablauf etwas verzögert wird, was aber in den meisten Fällen keine große Bedeutung hat.

  • Über RS wird ausgewählt, ob man einen Befehl oder ein Datenbyte an das LCD schicken möchte. Ist RS Low, dann wird das ankommende Byte als Befehl interpretiert, ist RS high, dann wird das Byte auf dem LCD angezeigt.
  • RW legt fest, ob geschrieben oder gelesen werden soll. High bedeutet lesen, Low bedeutet schreiben. Wenn man RW auf lesen einstellt und RS auf Befehl, dann kann man das Busy-Flag lesen, das anzeigt ob das LCD den vorhergehenden Befehl fertig verarbeitetet hat. Ist RS auf Daten eingestellt, dann kann man z.B. den Inhalt des Displays lesen - was jedoch nur in den wenigsten Fällen Sinn macht. Deshalb kann man RW dauerhaft auf Low lassen (= an GND anschließen), so dass man noch ein IO-Pin am Controller einspart. Der Nachteil ist, dass man dann das Busy-Flag nicht lesen kann, weswegen man nach jedem Befehl vorsichtshalber ein paar Mikrosekunden warten sollte um dem LCD Zeit zum Ausführen des Befehls zu geben. Dummerweise schwankt die Ausführungszeit von Display zu Display und ist auch von der Betriebsspannung abhängig. Für professionellere Sachen also lieber den IO-Pin opfern und Busy abfragen.
  • Der E Anschluss schließlich signalisiert dem LCD, dass die übrigen Datenleitungen jetzt korrekte Pegel angenommen haben und es die gewünschten Daten von den Datenleitungen bzw. Kommandos von den Datenleitungen übernehmen kann.
Display an Pollin Board
Es folgt eine kurze Beschreibung , wie ein Display an ein Experementierboard der Firma Pollin anzuschließen ist:

Da auf dem Board von Pollin kein Anschluß für ein Display vorgesehen ist, hab ich folgendermaßen zu einer Notlösung gefunden:Das Board besitzt mehrere IC Fassungen, um mit verschiedene Controllern zu Experementieren, da ich aber wahrscheinlich nur mit den etwas größeren arbeite , weil sie mittlerweile zu einen sehr erschwinglichen Preis zu bekommen sind, habe ich mich entschlossen die Fassung für den Tiny-Contoller ersteinmal Zweck zu entfremden, indem ich in der vorhandenen IC-Fassung abermals eine IC-Fassung eingesteckt habe, an denen ich die Anschlüsse für's Display angelötet habe. So habe ich die Möglichkeit, bei Bedarf einfach die zusätzlich eingsteckte Fassung wieder zu entnehmen.

t
Anschluss an den Controller Jetzt da wir wissen, welche Anschlüsse des LCD's benötigt, können wir das LCD mit dem Mikrocontroller verbinden:
Display
Pin am Prozessor

Pin am Display

Bezeichnung am Display
Tiny
Atmega 8
1 Vss 10 GND
2 Vcc 20 5V
3 Vee Mittelanschluß eines 10Kohm Poti siehe oben GND oder Poti (siehe oben)
4 RS 8 PD4 am AVR
5 RW 10 GND
6 E 9 PD5 am AVR
7 DB0 10 GND
8 DB1 10 GND
9 DB2 10 GND
10 DB3 10 GND
11 DB4 2 PD0 am AVR
12 DB5 3 PD1 am AVR
13 DB6 6 PD2 am AVR
14 DB7 7 PD3 am AV
15 Plus für Hintergrundbeleuchtung über 85 Ohm Vorwiderstand 20
16 Minus für Hintergrundbeleuchtung 10
Da kein 85 Ohm Widerstand zu verfügung stand , hab ich mich mit zwei in Reihe gelöteten 47 Ohm Wiedrstände beholfen.
tt
Anschluß an der IC Fassung die eigentlich für den Atmel Tiny vorgesehen ist.
Erstes Programm

Nach Anschluss des Displays am Board, geht es nun daran, das Programm zu schreiben, um einen Text auf's Display zu bringen.
Dazu öffnen wir das Programm WINAVR und geben folgende Zeilen ein: ( In Grün ist nur eine Erklärung und muss nicht eingegeben werden)

 

$regfile = "m8def.dat" 'definieren des verwendeten Chips .......................................' Hier wird Art des Controllers definiert ,hier eine Atmega 8

$crystal = 4000000 'definieren des verwendeten externen Quarz (16MHz)...............' Hier wird der verwendete Quarz angegeben

Config Lcd = 16 * 2 ...............................................................................................................'wir Verwenden Ein Display Mit 16 Mal 2 Zeichen
'---------------------------Programm Anfang------------------------------

Cls..........................................................................................................................................'Display Löschen

Do............................................................................................................................................ 'Schleife anfang

Locate 1 , 1.............................................................................................................................'Locate definiert Ausgabe in Zeile 1 und Spalte 1
Lcd "1.Erfolgreicher" .............................................................................................................'Textausgabe in der ersten Zeile

Locate 2 , 1...............................................................................................................................Definiert Textausgabe in Zeile 2 und Spalte 1
Lcd "Displaytest"...................................................................................................................... Textausgabe in der zweiten Zeile

Waitms 15................................................................................................................................... 'Pause von 15 Millisekunden
Loop............................................................................................................................................'Rücksprung nach Do

Nach dem Kompilieren und anschließenden abspeichern des Programms kann es mit dem Programm " Ponyprg" eingelesen und in den Controller übertragen werden.
Das Ergebnis sieht dann folgendermaßen aus:
Diplaytest
 
FAQ
Erkenne nichts auf dem Display Dann erst einmal die Kontrasteinstellung überprüfen. Den Kontrast so einstellen das die schwarzen Kästchen zu erkennen sind , dann den Kontrast herunterdrehen bis die Kästchen gerade nicht mehr zu sehen sind.
LCD flackert Pausenzeiten also hauptsächlich die "Wait" Befehle überprüfen . Da ein ausgegebener Text erst gelöscht werden muss bevor ein neuer Text angezeigt werden kann, ist möglicherweise die Zeitspanne zwischen dem Löschen [CLS] und der neuen Textausgabe zu lang.
Text läuft in der Anzeige Der Anschluß R/S am Display ist für das Löschen der Anzeige zuständig, möglicherweise ist er nicht richtig Konfiguriert, entweder im Programmiertool ( z.B. Bascom) oder aber sollte die Konfiguration im selbst erstellten Programm erfolgt sein , somit ist die Konfigurationeinstellung im (Bascom Menü) hinfällig, und es sollte die Konfiguration im selbst erstellten Programm überprüft werden.
Text läuft in der Anzeige Der Anschluß R/S am Display ist für das Löschen der Anzeige zuständig, dieser Anschluß muss auf 0 gelegt werden damit die Anzeige gelöscht wird. Wird die Anzeige nicht gelöscht , wird immer wieder Neu geschrieben bis das Display vollgeschrieben ist, dann wird am Anfang des Displays wieder weiter geschrieben, und der alte vorhandene Text überschrieben, somit sieht es dann aus wie Hieroglyphen. Ursache kann ein nicht Konfigurierter Pin sein, und zwar muss der Ausgang am Atmega , welcher den R/S Anschluß am Display steuert als Ausgang definiert sein z.B. (Ddrb = &B10000000 ) setzt  Pin B.7 als Ausgang. 
Kontrast vorhanden aber keine Textanzeige Beim Fabrikneuen Atmega 32 ( nicht beim Atmega 8 ) ist Standardmäßig der Port C als JDTAG Schnittstelle konfiguriert,  bei Anschluß eines DiBeim Fabrikneuen Atmega 32 ( nicht beim Atmega 8 ) ist Standardmäßig der Port C als JDTAG Schnittstelle konfiguriert,  bei Anschluß eines Displays an Port C oder sonstiger Nutzung muss in den Fusebits die JDTAG Schnittstelle deaktiviert werden .splays an Port C oder sonstiger Nutzung muss in den Fusebits die JDTAG Schnittstelle deaktiviert werden .
Keine Anzeige oder nur ein Strich
Überprüfen ob die "$crystal"   Anweisung im Programm den passenden Wert zum Quarz übergeben wurde, wenn beispielsweise in den "FuseBits" der Wert für 16 Mhz Quarz angegeben ist und in der "$Crystal" Anweisung nur 1Mhz angegeben wurde , führt dies zu diesen Erscheinungen.

Aktualisiert 16.08.2013