Forum: Mikrocontroller und Digitale Elektronik HD44780 Display zeigt nichts an


von Eeeeee (Gast)


Lesenswert?

Hallo,
ich versuche mittels einem ATMEGA32 das Display HD44780 (2x16 Zeichen)zu 
beschreiben, habe mir bereits sämtliche Forenbeiträge durchgelesen, 
unter anderem : 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
Das Programm ist das selbe wie es dort auf der Seite steht, Kontrast 
stimmt, die lcd-routines.c wird genauso wie die headerdatei 
ordnungsgemäß verwendet (der Compiler zeigt jedenfalls keinen 
Fehlermeldung). Das Display leuchtet und zeigt in einer Zeile schwarze 
Balken an. Mehr nicht. Was mache ich falsch??? Bitte um Hilfe.


#ifndef  F_CPU
#define F_CPU 16000000  // Taktfrequenz = 16 MHz
#endif
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include "lcd-routines.h"

int main (void)
{


  DDRD=0xff;    //alle portd´s sind ausgänge

  lcd_init();    //ersten 4 bit bzw datenleitungen benutzen

  lcd_data( 'T' );
  lcd_data( 'e' );
  lcd_data( 's' );
  lcd_data( 't' );


    while(1)
{

}
}

: Verschoben durch User
von Richard T. (richard_t)


Lesenswert?

Hallo,

ist zwar nur eine Vermutung, aber sind die Fuses vom Atmega32 richtig 
gesetzt?

Wenn bis jetzt nur eine Zeile erscheint ist das ein Anzeichen, dass er 
nicht richtig initialisiert wird.

Gruß
Richi

von Eeeeee (Gast)


Lesenswert?

Danke für deine schnelle Antwort!

Wie setze ich denn die Fuses? Und vor allem, wie setze ich sie richtig?

von Holger L. (max5v)


Lesenswert?

Liegt denn der R\W Pin des Displays auf GND ?

F_CPU wurde in der lcd-routines.h ebenfalls angepasst ?

Was die Fuses angeht, müßtest du erstmal verraten was du für einen Quarz 
angeschlossen hast.
Wäre auch von Vorteil wenn du schreibst wie die Fuses zur Zeit aussehen.

: Bearbeitet durch User
von Eeeeee (Gast)


Lesenswert?

Ja, der R/W Pin ist direkt auf GND verdrahtet.

Also um genau zu sagen verwende ich das Atmel Evaluationsboard 2.01 mit 
dem Atmega32. Als Quarz wird dort einer mit 16MHz verwendet. Was genau 
hat es mit den Fuses auf sich? Leider habe ich keine Ahnung von Fuses 
bzw. wie ich sie auslesen oder einstellen kann. Könnte mir da jemand auf 
die Sprünge helfen?

von Eeeeee (Gast)


Lesenswert?

Ja, F_CPU wurde auch in lcd-routines.h angepasst.

von Holger L. (max5v)


Lesenswert?

Ersetz einfach mal jede #define F_CPU (WERT) durch #define F_CPU 1000000
Wenn du die Fuses noch nie geändert hast, sollte der Mega32 auf 1Mhz 
laufen.

Hier http://www.mikrocontroller.net/articles/AVR_Fuses
kannst du dich zu dem Thema ein wenig schlau machen.
In dem aktuellen Atmelstudio werden die Fuses über Tools > 
DeviceProgramming > Fuses ausgelesen\ geschrieben.
Aber bitte nichts daran ändern solange du dich mit dem Thema noch nicht 
auseinander gesetzt hast !

Auf dem Board scheinen eine Menge Jumper zu sitzen, gerade an PORTD.
Die sind hoffentlich alle nicht gesetzt ?

von Eeeeee (Gast)


Lesenswert?

Ok, die Frequenz beträgt jetzt 1 MHz.
Über die Fuses werde ich mich belesen. Dieses Board und dieser ATMEGA32 
wurden aber schon öfters verwendet, ohne Probleme. Kann es denn wirklich 
an den Fuses liegen?

Die Jumper an PORTD sind nicht gesetzt. Anfangs hatte ich das alles auch 
schon auf PORTC verdrahtet (und natürlich die headerdatei lcd-routines.h 
bezüglich der PORTs umgeschrieben), allerdings hatte ich dort das 
gleiche Problem. Mit Verwendung des PORTD´s habe ich die lcd-routines 
wieder auf den alten "standart" Zustand umgeschrieben.

von dummy (Gast)


Lesenswert?

>Ersetz einfach mal jede #define F_CPU (WERT) durch #define F_CPU 1000000

Falsch, lass es bei 16MHz. Länger dürfen die delays sein, aber
nicht zu kurz. Und ich hoffe das es nur ein "#define F_CPU" im
gesammten Projekt gibt.

Ansonsten geht man auch von einer falschen Verdrahtung
bevor man die Software beschuldigt.

von Bernard B. (bernard_b)


Lesenswert?

If you notice one line is fully clear, while the other shows nothing, 
this means the power is connected OK. Even contrast is set properly.

If you don't get any text presented at the screen, there are several 
things to consider, which should be verified :

1) Are you sure the microcontroller is operating ?
   Try to verify this, by writing some sourcecode, to blink a LED
   or switching another device.
   When using an external Xtal, sometimes the fuses are not
   properly set / programmed. Or, there is no 100 nF capacitor located
   near the Vcc pin of an microcontroller. Or,.. what is even more
   embarrassing,.. there's no power to the microcontroller at all.

2) Correct LCD-pins connected to your microcontroller ?
   A HD44870 4-bit control requires different wiring than 8-bit control

3) Physical wiring
   Are all required pins of the LCD really connected to your
   microcontroller ? If not sure : verify this by using a multimeter.

4) Sourcecode - pins
   Did you define the correct pins in your sourcecode, which are
   connected from your microcontroller to the LCD ?

5) Sourcecode - time
   A LCD can display text very rapidly, even refreshed text.
   However, you might not being able to see / notice this. It has
   no use to update a text at an LCD more than 26 times per second.
   After all, a user should be able to read the text.
   If you write a sequence of 4 characters at the same location of
   the LCD, at clockspeed, I bet you're not able to read such text.
   If the sequence uses a delay of 50 ms for each character, you
   might succeed being able to read all 4 characters. More time / delay,
   is even better.

OK,. because you can see a "schwarze Balken", points  1, 2, 3 and 4 are 
of importance for you. If the problem is not in these 4 points, your LCD 
might be defective, although it takes a lot to damage such an LCD.
The other point (5) is for later concern.

All 5 points are based upon my own experience (or better said : 
mistakes), gained over the last 10 years, playing with microcontrollers 
and LCDs.

Sorry, my Deutschsprache is not so good. If I want to reply fast and 
including some technical details, I've to reply in "Englishsprache".

: Bearbeitet durch User
von Eeeeee (Gast)


Lesenswert?

Ok, Frequenz ist wieder auf 16 MHz eingestellt, es ändert sich jedoch 
bei keiner der beiden Frequenzen was.

#define F_CPU kommt in meinem eigentlichen C- Programm (wie oben 
dargestellt)  und in der lcd-routines.h vor.
Die Verdrahtung stimmt, die habe ich schon mehrfach kontrolliert bevor 
ich in dieses Forum geschrieben habe:
PIN1 GND
PIN2 5v
PIN3 Kontrastspannung von 100 mV (schwarze Balken werden ja angezeigt)
PIN4 PD4
PIN5 GND
PIN6 PD5
PIN7-10 frei
PIN11-14 PD0-3
PIN15 4V
PIN16 GND

von Eeeeee (Gast)


Lesenswert?

Hier die verwendete Headerdatei lcd-routines.h

// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
//

#ifndef LCD_ROUTINES_H
#define LCD_ROUTINES_H

//////////////////////////////////////////////////////////////////////// 
////////
// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!

#ifndef F_CPU
#define F_CPU 16000000
#endif

//////////////////////////////////////////////////////////////////////// 
////////
// Pinbelegung für das LCD, an verwendete Pins anpassen
// Alle LCD Pins müssen an einem Port angeschlossen sein und die 4
// Datenleitungen müssen auf aufeinanderfolgenden Pins liegen

//  LCD DB4-DB7 <-->  PORTD Bit PD0-PD3
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_DB        PD0

//  LCD RS      <-->  PORTD Bit PD4     (RS: 1=Data, 0=Command)
#define LCD_RS        PD4

//  LCD EN      <-->  PORTD Bit PD5     (EN: 1-Impuls für Daten)
#define LCD_EN        PD5

//////////////////////////////////////////////////////////////////////// 
////////
// LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)

#define LCD_BOOTUP_MS           15
#define LCD_ENABLE_US           20
#define LCD_WRITEDATA_US        46
#define LCD_COMMAND_US          42

#define LCD_SOFT_RESET_MS1      5
#define LCD_SOFT_RESET_MS2      1
#define LCD_SOFT_RESET_MS3      1
#define LCD_SET_4BITMODE_MS     5

#define LCD_CLEAR_DISPLAY_MS    2
#define LCD_CURSOR_HOME_MS      2

//////////////////////////////////////////////////////////////////////// 
////////
// Zeilendefinitionen des verwendeten LCD
// Die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 
Zeichen passen
// Bei anderen Zeilenlängen müssen diese Einträge angepasst werden

#define LCD_DDADR_LINE1         0x00
#define LCD_DDADR_LINE2         0x40
#define LCD_DDADR_LINE3         0x10
#define LCD_DDADR_LINE4         0x50

//////////////////////////////////////////////////////////////////////// 
////////
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
void lcd_init( void );

//////////////////////////////////////////////////////////////////////// 
////////
// LCD löschen
void lcd_clear( void );

//////////////////////////////////////////////////////////////////////// 
////////
// Cursor in die 1. Zeile, 0-te Spalte
void lcd_home( void );

//////////////////////////////////////////////////////////////////////// 
////////
// Cursor an eine beliebige Position
void lcd_setcursor( uint8_t spalte, uint8_t zeile );

//////////////////////////////////////////////////////////////////////// 
////////
// Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition
void lcd_data( uint8_t data );

//////////////////////////////////////////////////////////////////////// 
////////
// Ausgabe eines Strings an der aktuellen Cursorposition
void lcd_string( const char *data );

//////////////////////////////////////////////////////////////////////// 
////////
// Definition eines benutzerdefinierten Sonderzeichens.
// data muss auf ein Array[8] mit den Zeilencodes des zu definierenden 
Zeichens
// zeigen
void lcd_generatechar( uint8_t code, const uint8_t *data );

//////////////////////////////////////////////////////////////////////// 
////////
// Ausgabe eines Kommandos an das LCD.
void lcd_command( uint8_t data );


//////////////////////////////////////////////////////////////////////// 
////////
// LCD Befehle und Argumente.
// Zur Verwendung in lcd_command

// Clear Display -------------- 0b00000001
#define LCD_CLEAR_DISPLAY       0x01

// Cursor Home ---------------- 0b0000001x
#define LCD_CURSOR_HOME         0x02

// Set Entry Mode ------------- 0b000001xx
#define LCD_SET_ENTRY           0x04

#define LCD_ENTRY_DECREASE      0x00
#define LCD_ENTRY_INCREASE      0x02
#define LCD_ENTRY_NOSHIFT       0x00
#define LCD_ENTRY_SHIFT         0x01

// Set Display ---------------- 0b00001xxx
#define LCD_SET_DISPLAY         0x08

#define LCD_DISPLAY_OFF         0x00
#define LCD_DISPLAY_ON          0x04
#define LCD_CURSOR_OFF          0x00
#define LCD_CURSOR_ON           0x02
#define LCD_BLINKING_OFF        0x00
#define LCD_BLINKING_ON         0x01

// Set Shift ------------------ 0b0001xxxx
#define LCD_SET_SHIFT           0x10

#define LCD_CURSOR_MOVE         0x00
#define LCD_DISPLAY_SHIFT       0x08
#define LCD_SHIFT_LEFT          0x00
#define LCD_SHIFT_RIGHT         0x04

// Set Function --------------- 0b001xxxxx
#define LCD_SET_FUNCTION        0x20

#define LCD_FUNCTION_4BIT       0x00
#define LCD_FUNCTION_8BIT       0x10
#define LCD_FUNCTION_1LINE      0x00
#define LCD_FUNCTION_2LINE      0x08
#define LCD_FUNCTION_5X7        0x00
#define LCD_FUNCTION_5X10       0x04

#define LCD_SOFT_RESET          0x30

// Set CG RAM Address --------- 0b01xxxxxx  (Character Generator RAM)
#define LCD_SET_CGADR           0x40

#define LCD_GC_CHAR0            0
#define LCD_GC_CHAR1            1
#define LCD_GC_CHAR2            2
#define LCD_GC_CHAR3            3
#define LCD_GC_CHAR4            4
#define LCD_GC_CHAR5            5
#define LCD_GC_CHAR6            6
#define LCD_GC_CHAR7            7

// Set DD RAM Address --------- 0b1xxxxxxx  (Display Data RAM)
#define LCD_SET_DDADR           0x80

#endif

von dummy (Gast)


Lesenswert?

>Die Verdrahtung stimmt, die habe ich schon mehrfach kontrolliert bevor
>ich in dieses Forum geschrieben habe:

Nimms mir bitte nicht übel, aber das ist keine Garantie das
dort kein Fehler mehr ist;)

von Holger L. (max5v)


Lesenswert?

dummy schrieb:
>>Ersetz einfach mal jede #define F_CPU (WERT) durch #define F_CPU 1000000
>
> Falsch, lass es bei 16MHz. Länger dürfen die delays sein, aber
> nicht zu kurz. Und ich hoffe das es nur ein "#define F_CPU" im
> gesammten Projekt gibt.

Wenn die Fuses noch nie verstellt wurden, ist der interne Oscillator mit 
1Mhz gewählt, egal ob auf dem Board ein 16Mhz Quarz ist oder nicht.
Deshalb der Vorschlag. Aber solange es dazu keine Informationen gibt ist 
es sowieso egal.

Allerdings hört sich die falschen Verdrahtung gut an.
Bei dem "Extension-Port J4" hast du schon die Pins 36 - 31 genutzt ?

von Bernard B. (bernard_b)


Lesenswert?

I don't know C, but initially I see all datapins are defined correctly 
at the sourcecode. However, the LCD datapins (DB4 .. DB7) are only 
defined by :

#define LCD_DB        PD0

I don't know how it is done in C, but I would assume you define each pin 
in C, doing what.  Like :
- (LCD) DB4 is connected to PD0
- (LCD) DB5 is connected to PD1
- (LCD) DB6 is connected to PD2
- (LCD) DB7 is connected to PD3

I mean, what would happen if you, due to better wiring, you the LCD 
connected like :
- (LCD) DB4 is connected to PD3
- (LCD) DB5 is connected to PD2
- (LCD) DB6 is connected to PD1
- (LCD) DB7 is connected to PD0

I bet "#define LCD_DB PD0" wouldn't do the job than,.. right ?

: Bearbeitet durch User
von Eeeeee (Gast)


Lesenswert?

Nein nehm ich dir nicht übel. Die Verdrahtung ist so wie gerade oben 
beschrieben (jeder einzelne PIN mit der jeweiligen Zugehörigkeit). 
Sollte doch stimmen oder?

von philipp (Gast)


Lesenswert?

Hatte mal das selbe Problem mit einem HD44780 Display und bin fast 
verrückt geworden.
Bei mir war was in der Initialisierung nicht richtig. Ist das Display 
richtig initialisiert zeigt es die schwarzen Balken nicht mehr an!!!
Dann ist es nur "weiß" bzw. gün oder blau...
Ich habe mir damals so weitergeholfen, dass ich an alle Portpins des µc 
LEDs mit einem Breadboard rangesteckt habe. Wenn du alles hast, 
Breadboard, LEDs Wirejumper und die richtigen Vorwiderstände ist das in 
5 min zusammengesteckt.
Nun kannst du Schritt für Schritt die Initialisierungssequenz überprüfen 
und schauen ob dein µC das Bitmuster ausgiebt, was du gerne hättest. Du 
musst die Delays natürlich entwprechend hoch machen sonst ist die Init 
in wenigen ms durch und du siehtst nichts :)

von Eeeeee (Gast)


Lesenswert?

@Bernard B.

>I mean, what would happen if you, due to better wiring, you the LCD
>connected like :
>- (LCD) DB4 is connected to PD3
>- (LCD) DB5 is connected to PD2
>- (LCD) DB6 is connected to PD1
>- (LCD) DB7 is connected to PD0

Es gibt keine Veränderung/ Nothing is happen.

von Bernard B. (bernard_b)


Lesenswert?

4) Sourcecode - pins
   Did you define the correct pins in your sourcecode, which are
   connected from your microcontroller to the LCD ?

At least, I don't see in the sourcecode which datapin of the LCD is 
connected to which pin of the microcontroller. If this is not defined in 
the sourcecode, how should the microcontroller know which pin is 
connected to DB4 .. DB7 ?
To make it more clear, I asked in my former reply, what if you, for 
example reversed wired these DB-lines ? At least, I would expect a 
declaration / "#define" for each DB-pin. (I work with Bascom, and am not 
familiar with C, but in Bascom each pin has to be declared)

von Eeeeee (Gast)


Lesenswert?

>Holger L.
Ich benutze gerade am J4 die PINs 26 bis 31, sowie 39 und 40.
Die anderen habe ich noch nicht verwendet.

von Holger L. (max5v)


Lesenswert?

Wenn man bei einem Mikrocontroller die Pins in einer Reihe liest 
angefangen bei dem ersten Pin zählt man 1 2 3 4 ... Bei der 
Buchsenleiste J4 wäre es allerdings 1 3 5 7 ...

Mikrocontroller
1 2 3 4
8 7 6 5

Buchsenleiste
1 3 5 7
2 4 6 8

Das wurde auch beachtet ?

von Eeeeee (Gast)


Lesenswert?

>Das wurde auch beachtet ?
Guter Tipp, aber Ja, dass habe ich beachtet und zur Sicherheit an den 
einzelnen PINs am MC zu den PINs des Displays mit einem Multimeter 
durchgemessen (Durchgangsprüfung).

von Bernard B. (bernard_b)


Lesenswert?

Eeeeee schrieb:
> @Bernard B.
>
>>I mean, what would happen if you, due to better wiring, you the LCD
>>connected like :
>>- (LCD) DB4 is connected to PD3
>>- (LCD) DB5 is connected to PD2
>>- (LCD) DB6 is connected to PD1
>>- (LCD) DB7 is connected to PD0
>
> Es gibt keine Veränderung/ Nothing is happen.

No, you didn't need to reverse-wiring these datapins. I just wanted to 
point out, probably some "#define" statements are missing. Because if 
you, for example, would have connected the LCD-DB pins in a different 
order, the microcontroller is not aware of it. I would expect -also in 
C- you should use a "#define"-statement for each DB-pin of the LCD.

Something like :
#define LCD_DB4        PD0
#define LCD_DB5        PD1
#define LCD_DB6        PD2
#define LCD_DB7        PD3
NOTE : I DON'T KNOW IF THIS IS CORRECT DEFINED IN C !

Because if you use different wiring, the microcontroller should still 
know which pins are connected to which pins of the LCD. I don't see how 
the microcontroller will know how all 4 DB-pins are wired by solely 
using :
"#define LCD_DB        PD0"

: Bearbeitet durch User
von Eeeeee (Gast)


Lesenswert?

Wenn ich schreibe #define  LCD_DB   PD0 sollte das eigentlich heißen, 
dass die Datenleitungen bei PORTD0 anfangen und dementsprechend 
weitergehen.

von Bernard B. (bernard_b)


Lesenswert?

OK,. fair enough. Than I guess your problem is not embedded in 2), 3) or 
4).

This means, the problem is somewhere in option 1).
At least, if you're sure the code was loaded / burned into the 
microcontroller.

And if you're 100 % sure (*), you did nothing wrong, the LCD must be 
malfunctioning. In such case, consider using a new LCD.

(*) I'm pretty sure you oversee something. Most of the time it's best to 
put the project aside for a day. With a fresh mind, the next day, you'll 
slap your head, because of the stupidity / fault you've made, which 
caused the error you currently face.

If sourcecode is correct, PCB is correct, connections are correct, 
nothing is damaged and it still doesn't work, well, obviously there is 
still somthing overseen. Only, it's hard to admit, and requires some 
time and a fresh mind to realize / discover it.
Trust me,.. been there, done that....

: Bearbeitet durch User
von Holger L. (max5v)


Lesenswert?

Habe grade die Bibiliothek ausprobiert, mit einem sehr günstigen 
"blauen" LCD aus China. Funktioniert wunderbar, allerdings ist mir 
gerade noch aufgefallen das man den Text nicht lesen kann wenn die 
Kontrastspannung zu niedrig ist.
Bei ca. 1 Volt ist der Text gut lesbar, und es sind keine Balken zu 
erkennen.
Bei 100mV nur noch Balken.
Allerdings treten die Balken bei beiden Zeilen auf.

Kannst ja noch schreiben was du genau für ein Display gekauft hast.

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Probier mal die HEX Datei im Anhang.
Das Programm ist nicht mit deiner Lib programmiert
sondern was eigenes. Wenns damit nicht geht tip ich
auf Hardwareproblem.

von Eeeeee (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang ist ein Bild wo man sehen kann wie die Fuses gesetzt sind. Ist 
das richtig?

von Mökki (Gast)


Lesenswert?

Kontrast ?!

von R. F. (rfr)


Lesenswert?

Ich schlage vor, dass er die Verdrahtung bekannt genen soll, und 
irgendjemand programmiert dann auf Basis der Verdrahtung ein Programm, 
welches dann funktionieren muss, wenn kein HW Frehler vorliegt.

Gruss

Robert

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.