Hallo,
ich habe hier ein LCD mit dem HD44780 und möchte sie mithilfe der
library von Peter Fleury mit einem Atmega8 ansteuern. Erstmal wollte ich
nur das von ihm zur Verfügung gestellte Testprogramm nutzen, habe aber
keinen Erfolg.
Das Display zeigt in der oberen Zeile einen weißen Streifen, in der
unteren gar nichts. Ich betreibe das LCD an PORTD, habe das auch in der
Headerdatei so angepasst.
1
#ifndef LCD_PORT
2
#define LCD_PORT PORTD /**< port for the LCD lines */
3
#endif
Die Kontrastspannung habe ich mit dem Poti schon variiert, da tut sich
gar nichts.
Alle Verbindungen habe ich untersucht, da passt alles.
Zu Beginn hatte ich die Hintergrundbeleuchtung aus Versehen auf 5V ohne
Vorwiderstand, jetzt ist einer drin, die Hintergrundbeleuchtung
funktioniert auch noch.
Ich nutze den internen Oszillator auf 1MHz, hab das auch so definiert:
1
#include<stdlib.h>
2
#include<avr/io.h>
3
#include<avr/pgmspace.h>
4
#define F_CPU 1000000UL
5
#include<util/delay.h>
6
#include"lcd.h"
Trotzdem hat der Compiler die Warnung "F_CPU not defined" in "delay.h"
ausgegeben. Nach erneutem Compilen hat er dann nichts mehr gesagt.
Ich hoffe, ich habe alle wichtigen Informationen hier genannt, für jede
Hilfe bin ich sehr dankbar!
PS: Weil das Programm von Peter FLeury den PORTD auch als Eingang nutzt,
habe ich es mal mit diesem Testprogramm ausprobiert, mit dem gleichen
Ergebnis:
Das von Dir beschriebene Bild zeigen diese Displays meist, bevor sie
initialisiert wurden. Also klappt vermutlich die Initialisierung nicht.
Zwischen dem Avr und dem Display brauchst Du zumindest die RS und die E
Leitung sowie 4 oder 8 Datenleitungen. Man kann so programmieren, dass
man R/W nicht benötigt. Nur einen Port angeben zu müssen kommt mir
seltsam vor. Kann es sein, dass das nur der Port für die Datenleitungen
ist ?
Wie viele Dateien mit der Endung .c hast Du ? Wenn Du das Define so
einfügst, müsstest Du das in jeder .c-Datei machen, in der es gebraucht
wird. Du kannst meist auch im Projekt Werte definieren lassen, die dann
beim Übersetzen von allen Dateien gültig sind. Dann kann es auch nicht
passieren, dass Du unterschiedliche Werte innerhalb eines Projektes
hast.
Oft werden auch nicht alle Dateien übersetzt, sondern ein spezielles
Programm namens Make bemüht sich darum, nur das übersetzen zu lassen,
was seit der letzten Übersetzung von Deinen Änderungen betroffen ist.
Könnte sein, dass dadurch Warnungen von selber verschwinden, ohne dass
das zu Grunde liegende Problem behoben ist.
Ja, das mit der Initialisierung hatte ich an anderer Stelle auch schon
gelesen. Der PORTD besteht aus 8 Pins; Pin 0-3 sind Datenleitungen, 4
ist RS, 5 ist RW, 6 ist ENABLE.
Ich habe zwei .c Dateien, main.c und lcd.c (von der library).
Dass ich F_CPU in allen Dateien definieren muss ist eine gute Idee! Ich
verschiebe mal die Definition in die Headerdatei, die wird ja in allen
.c Dateien eingebunden.
Du musst die 'lcd.h' auch anpassen auf die benutzten Pins und nicht nur
auf den Port. Wenn du in 'lcd.h' weiter liest, kommt da die Zuordung der
Daten- und Kontrolleitungen zum LCD, die mit deinem Aufbau
übereinstimmen müssen.
Ausserdem muss auch 'XTAL' in dieser Datei auf die benutzte Taktfrequenz
angepasst werden, in deinem Fall also auf 1000000.
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
3
#endif
4
#ifndef LCD_DATA0_PIN
5
#define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */
Das hier nehme ich nur mal beispielhaft, so ist die Zuordnung aller Pins
aufgebaut; was soll ich hier noch ändern? Schließlich bezieht sich
1
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
auf LCD_PORT, welcher weiter oben ja als PORTD definiert wurde.
Und zu XTAL: Ich habe mal ganz naiv in der Header- und .c-Datei
Textsuche gemacht, das aber nicht gefunden. Kannst du mir erklären, was
du damit meinst?
Hat sonst keiner eine Idee? Ich habe in der Zwischenzeit auch einmal die
library von mikrocontroller.net ausprobiert, wieder mit dem gleichen
Ergebnis.
kalle schrieb:> Die Kontrastspannung habe ich mit dem Poti schon variiert, da tut sich> gar nichts.
Wenn alles in Ordnung ist, sollte man durch Variieren der
Kontrastspannung es schaffen, die erste Zeile zwischen "unsichtbar" und
"schwarze Rechtecke" einzustellen.
holger schrieb:> Und welche am LCD? Da musst du D4 bis D7 nehmen.
Habe ich gemacht.
Georg G. schrieb:> Wenn alles in Ordnung ist, sollte man durch Variieren der> Kontrastspannung es schaffen, die erste Zeile zwischen "unsichtbar" und> "schwarze Rechtecke" einzustellen.
Das war der Fall, ich meinte damit, dass keine Buchstaben erschienen
sind.
Ich habe jetzt mal den RW des LCD auf Masse gelegt. Dann den Strom immer
wieder ein- und ausgeschaltet (Nutze übrigens mittlerweile die
mikrocontroller.net-library). Ich habe es so geschafft, mal beliebige
Zeichen und einige wenige Male auch "Hello World" auf dem LCD
anzuzeigen. Können Wackelkontakte auf dem Breadboard dafür
verantwortlich sein?
Was sagt das Datenblatt deines Displays zu den maximalen Anstiegszeiten
der Signale? Bei einigen Herstellern ist das E-Signal extrem kritisch.
Zeig mal ein Bild deines Aufbaus.
Ich glaube, ich habe jetzt das Problem gefunden! Ich habe mal so lange
willkürlich auf den Jumperkabeln herumgedrückt, bis irgendwann das
Display funktioniert hat. Bei näherer Betrachtung habe ich entdeckt,
dass die Kabel eine Art Kleberückstände haben. Naja, das nennt man im
übertragenen Sinne wohl Lehrgeld :/
Ich möchte trotzdem allen herzlich danken, die mir hier weitergeholfen
haben!