LCD zeigt weißen Streifen

Gast #5212163
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!
Gast #5212169
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
}
Gast #5212174
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.
Gast #5212181
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.
(Firma: matzetronics) #5212195
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.
Gast #5212208
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?
Gast #5212321
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?
Gast #5212334
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren