Forum: Mikrocontroller und Digitale Elektronik LCD zeigt weißen Streifen


von kalle (Gast)


Lesenswert?

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!

von kalle (Gast)


Lesenswert?

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:
1
#include <avr/io.h>
2
#include "lcd.h"
3
#include <stdlib.h>
4
#define F_CPU 1000000UL
5
#include <util/delay.h>
6
7
int main(void)
8
{
9
  
10
    while (1) 
11
    {  
12
    lcd_init(LCD_DISP_ON);
13
    lcd_home();
14
    lcd_puts("Hello World!");
15
    
16
    while(1);
17
  }
18
}

von fop (Gast)


Lesenswert?

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.

von kalle (Gast)


Lesenswert?

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.

von kalle (Gast)


Lesenswert?

Habe jetzt mal gleich zu Anfang in der Headerdatei, main.c und lcd.c die 
Frequenz wie folgt eingebunden:
1
#ifndef F_CPU
2
#define F_ 1000000UL
3
#endif

Leider hat sich immer noch nichts geändert :(

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von kalle (Gast)


Lesenswert?

1
#ifndef LCD_DATA3_PORT
2
#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?

von kalle (Gast)


Lesenswert?

Hat sonst keiner eine Idee? Ich habe in der Zwischenzeit auch einmal die 
library von mikrocontroller.net ausprobiert, wieder mit dem gleichen 
Ergebnis.

von Bernd K. (movin)


Lesenswert?

Hallo,
ein Bild vom Aufbau könnte auch helfen.

mfg

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>Pin 0-3 sind Datenleitungen

Und welche am LCD? Da musst du D4 bis D7 nehmen.

von kalle (Gast)


Lesenswert?

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?

von Georg G. (df2au)


Lesenswert?

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.

von kalle (Gast)


Lesenswert?

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!

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.