Forum: Mikrocontroller und Digitale Elektronik Problem mit Atmega32 und LCD (HD44780 kompatibel)


von Mr. Burns (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe gemäß des folgenden Artikels:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

über einen Atmega32 ein HD44780 kompatibles LCD angesteuert.
Es scheint auch zu funktionieren, jedoch nur teilweise.
Es erscheint der Text "Test" in der 1. Zeile und der Text "Hello World!" 
in der zweiten Zeile. Der Text "Hello World!" ist aber am Ende nichtmehr 
lesbar, es sind dort nur Blöcke zu sehen. (Siehe angehängtes Bild)
Habe alle Anschlüsse mehrmals kontrolliert, konnte aber keinen Fehler 
finden.

Kann mir jemand sagen woran das liegt? Ist das Display kaputt oder muss 
ich irgendwelche Parameter in der lcd-routines.h anpassen?

Danke für jede Hilfe!

von Thomas B. (mrburns)


Lesenswert?

Habe noch was rausgefunden,

das Problem scheint nur in den rechten 8 Zeichen des LCD zu erscheinen.
Habe mal einen längeren Text auch für die erste Zeile programmiert.
Dort erscheinen nun alle rechten acht Zeichen auch so komisch als Block.

Kann mir jemand das erklären?
Bin für jede Hilfe dankbar!

von holger (Gast)


Lesenswert?

>Kann mir jemand das erklären?

Sieht aus wie ein defektes Display.

von Jojo (Gast)


Lesenswert?

Hm, da ja einige Zeichen richtig angezeigt werden und die Zeilen ja auch 
offensichtlich ordnungsgemäß angesprochen werden können, scheint die 
Initialisierung und auch der Anschluß der Pins richtig zu sein.

Du könntest mal versuchen die Zeichen langsamer zu senden. Was ist es 
genau für ein LCD? Einige LCDs haben seltsame Zeichensätze. Aber das 
scheint nicht dein Problem zu sein... Wie sind die LCD-Pins 
beschaltet/verdrahtet? Hast du Pins offen?

Gruß

von Jojo (Gast)


Lesenswert?

Thomas Burns schrieb:
> Habe noch was rausgefunden,
>
> das Problem scheint nur in den rechten 8 Zeichen des LCD zu erscheinen.
> Habe mal einen längeren Text auch für die erste Zeile programmiert.
> Dort erscheinen nun alle rechten acht Zeichen auch so komisch als Block.
>
> Kann mir jemand das erklären?
> Bin für jede Hilfe dankbar!

Ok, jetzt bin ich auch für ein defektes LCD :)

von Jojo S. (Gast)


Lesenswert?

Ist die Busy Leitung auch angeschlossen? Wenn nicht ist die Übertragung 
evtl zu schnell. Oder in der Ausgabe Routine ist ein Fehler und es 
kommen noch undefinierte Zeichen hinterher -> Code posten.

von ich (Gast)


Lesenswert?

Möglich, dass in der Software ein vierzeiliges Display eingestellt ist?

von Thomas B. (mrburns)


Lesenswert?

Hallo,

danke erstmal an alle, die mir hier versuchen zu helfen.
Das verwendete LCD ist ein Zwei-Zeilen LCD blau/weiß mit 5x8 punkten je 
Zeichen. Die Bezeichnung ist EA DIP162-DN3LW.

Der Code sollte in Ordnung sein, er ist Original 1 zu 1 von dem im 
ersten Post genannten Link genommen. Das LCD wird im 4-Bit Modus 
betrieben, Busy bzw. RW liegt auf GND.

>Du könntest mal versuchen die Zeichen langsamer zu senden.
Wie mache ich das?

>Möglich, dass in der Software ein vierzeiliges Display eingestellt ist?
Im Code habe ich das dazu gefunden:

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

Aber das ist nur eine Definition von Konstanten.

Wie gesagt der gesamte Code ist sichtbar unter:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung


Die Beschaltung der LCD ist wie im Projekt (siehe Linke im ersten Post) 
beschrieben:
LCD-Pin  1 (VSS): GND
LCD-Pin  2 (Vcc): 5V
LCD-Pin  3 (Vee): über 4k7 an GND
LCD-Pin  4 (RS) : PD4 am Atmega
LCD-Pin  5 (RW) : GND
LCD-Pin  6 (E)  : PD5 am Atmega

Die nächsten 4 liegen auf GND, da 4 Bit Mode:
LCD-Pin  7
LCD-Pin  8
LCD-Pin  9
LCD-Pin 10

LCD-Pin 11 (DB4): PD0 am Atmega
LCD-Pin 12 (DB5): PD1 am Atmega
LCD-Pin 13 (DB6): PD2 am Atmega
LCD-Pin 14 (DB7): PD3 am Atmega

LCD-Pin 15 und LCD-Pin 16 ist LED (mit Vorwiderstand)

Danke nochmals für weitere Hilfe!

von Martin e. C. (eduardo)


Lesenswert?

Hallo,
was benutzt du als Software?? AVRStudio?? ist die F_CPU richtig 
eingestellt?

von Thomas B. (mrburns)


Lesenswert?

Hallo Martin,

danke erstmal. Ja benutze AVR Studio (5.0).

F_CPU ist über Symbol (Porject Properties) auf 16000000 gesetzt und auch 
im Code in der Datei lcd-routines.h wie folgt:

#ifndef F_CPU
#define F_CPU 16000000
#endif

von Martin e. C. (eduardo)


Lesenswert?

Mit AS5 kenne mich nicht nicht besonders viel aus ich habe es vor paar 
Tage installiert aber die Einstellung über Symbol ... soll richtig sein.
Kannst du alle dateien hier posten? (h. c.)

von Martin e. C. (eduardo)


Lesenswert?

beim compilieren bekommst du keine Warnung?

von Markus B. (mbp-bayern)


Lesenswert?

Thomas Burns schrieb:
> Hallo,
>
> danke erstmal an alle, die mir hier versuchen zu helfen.
> Das verwendete LCD ist ein Zwei-Zeilen LCD blau/weiß mit 5x8 punkten je
> Zeichen. Die Bezeichnung ist EA DIP162-DN3LW.
>
> Der Code sollte in Ordnung sein, er ist Original 1 zu 1 von dem im
> ersten Post genannten Link genommen. Das LCD wird im 4-Bit Modus
> betrieben, Busy bzw. RW liegt auf GND.
>
>>Du könntest mal versuchen die Zeichen langsamer zu senden.
> Wie mache ich das?

Nun wenn Du keine RS232 etc. verwendest,
so könntest Du z.B. in der "lcd-routines.h"
eine falsche Taktfrequenz einstellen,
und ggf. ebenso im Studio selbst.

Wenn du 8 MHz verwendest, so z.B. 16000000
(bzw. 16000000UL falls der Compiler ohne UL Probleme macht)

Wenn du bereits auf 16 MHz Quarz bist,
so kannst Du ja auf internen RC-Oszillator umstellen,
aber pass mit den Fuses gut auf - ich will danach
NICHT "verfust" lesen müssen...

Wenn es ein geringes Timing-Problem war,
so müsstest Du danach sinnvolle Texte lesen können.

Wenn das geklappt hat,
so könnte man die Delays in der selben Datei erhöhen,
und die korrekte Taktfrequenz wieder eintragen.

Vor einigen Monaten habe ich auf basis eines AT89S52
einen Testaufbau realisiert.
Die dafür verwendeten LCD-Routinen habe ich mir aus mehreren Quellen 
zusammengekratzt und komplett umgestrickt.
Erst mit Verwendung des Bussy-Flag (polling) lief es bei mir richtig 
gut.

>
>>Möglich, dass in der Software ein vierzeiliges Display eingestellt ist?
> Im Code habe ich das dazu gefunden:
>
> #define LCD_DDADR_LINE1         0x00
> #define LCD_DDADR_LINE2         0x40
> #define LCD_DDADR_LINE3         0x10
> #define LCD_DDADR_LINE4         0x50
>
> Aber das ist nur eine Definition von Konstanten.
>
> Wie gesagt der gesamte Code ist sichtbar unter:
> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

So beim überfliegen des Codes fällt mir da nix auf,
wo man das genau einstellen könnte;

Aber es steht ja 16 Zeichen im Code,
Der Typbezeichnung nach sollte es ein 16x2 Display sein oder ?

Wenn das nicht stimmen würde, dann würden eher ganze Sätze fehlen
und nicht einzelne Buchstaben nicht passen.

>
>
> Die Beschaltung der LCD ist wie im Projekt (siehe Linke im ersten Post)
> beschrieben:
> LCD-Pin  1 (VSS): GND
> LCD-Pin  2 (Vcc): 5V
> LCD-Pin  3 (Vee): über 4k7 an GND
> LCD-Pin  4 (RS) : PD4 am Atmega
> LCD-Pin  5 (RW) : GND
> LCD-Pin  6 (E)  : PD5 am Atmega
>
> Die nächsten 4 liegen auf GND, da 4 Bit Mode:
> LCD-Pin  7
> LCD-Pin  8
> LCD-Pin  9
> LCD-Pin 10
>
> LCD-Pin 11 (DB4): PD0 am Atmega
> LCD-Pin 12 (DB5): PD1 am Atmega
> LCD-Pin 13 (DB6): PD2 am Atmega
> LCD-Pin 14 (DB7): PD3 am Atmega
>
> LCD-Pin 15 und LCD-Pin 16 ist LED (mit Vorwiderstand)
>
> Danke nochmals für weitere Hilfe!

Die 4 Pins an GND müsste eine saubere Lösung sein;
Bin mir nicht sicher,
glaube aber dass man die zumindest zum Basteln sogar offen lassen kann.

Selbst verwende ich aber 8 Bits,
und dann noch ein 4-Zeiliges Display mit 2 Enables.

MFG:MBP
Markus

von Martin e. C. (eduardo)


Lesenswert?

Markus B. p. schrieb:
> Die 4 Pins an GND müsste eine saubere Lösung sein;
> Bin mir nicht sicher,
> glaube aber dass man die zumindest zum Basteln sogar offen lassen kann.

hmm... Stimmt alle Pin auf GND? Ich habe immer 4 Bit Modus betrieben und 
alle einfach offen lassen, aber daran kann nicht liegen.

von Martin N. (emsen)


Angehängte Dateien:

Lesenswert?

Hallo Mr. Burns,

ich habe deinen Fall (aus dem Tutorial) mal nachgestellt:

ATmega32 (F_CPU 7,372800)
LCD 1602 an Port D (Winstar 1602B-TMI-JT#040). D0 bis D3 "in der Luft"
AS5 (mit avr-toolchain-installer-3.0.0.240-win32.win32.x86, die neueste 
korregierte(!) delay.h extra nochmal zur Sicherheit drübergezogen, evtl. 
liegt darin das Problem?).

Funktioniert einwandfrei.

Im Anhang mal meine funktionierende Hex zum Testen.
-  Achtung: Eingestellt auf 1MHz interner Oszillator!  -


Ach ja, und ich hätte auch noch eine Frage:
beim ersten compilieren kam die Fehlermeldung, eine for-Schleife in 
lcd-routines.c (Zeile 173) sei komisch initialisiert. Ich solle doch den 
Schalter "-std c99" oder "-std gnu99" benutzen - kann der gcc kein C 
mehr???

von Karl H. (kbuchegg)


Lesenswert?

Martin N. schrieb:

> lcd-routines.c (Zeile 173) sei komisch initialisiert. Ich solle doch den
> Schalter "-std c99" oder "-std gnu99" benutzen - kann der gcc kein C
> mehr???

Doch.
Aber auch C hat mehrere Versionen hinter sich. Und vor C99 war so etwas
1
    for ( uint8_t i=0; i<8; i++ )
nicht erlaubt.

von Thomas B. (mrburns)


Lesenswert?

Hallo Martin N (und alle anderen, die mir hier versuchen zu helfen),

ich verwende AVRStudio 5.

Martin:

Habe deine Hex getestet.
(vorher die Fuses auf 1 MHz interner Osz. umgestellt)

Dein Programm funktioniert, aber die rechten 8 Zeichen in der ersten und 
zweiten Zeile sind immernoch nur als Blöcke dargestellt.

Woher hast du die besagte 'neueste delay.h'?
Könnte es damit nochmal probieren.

Ich werde es auch nochmnal mit einer Version probieren, die das 
Status-Bit abfragt. Evtl. die library von Peter Fleury:

http://homepage.hispeed.ch/peterfleury/group__pfleury__lcd.html
Hat die schon jemand getestet?

Wenn das nicht klappt werde ich mir wohl ein weiteres LCD kaufen müssen 
um einen Fehler auszuschließen :-(

Danke nochmals für eure Hilfe hier.

von Martin N. (emsen)


Angehängte Dateien:

Lesenswert?

AS5 = AVR Studio 5

GCC-Home:  http://savannah.nongnu.org/projects/avr-libc

Wenn Du im AS5 den Cursor im Code über "delay.h" stellst, zeigt er dir 
oben den Pfad zur benutzten Datei an.

Beitrag "Delay.h - Zeiten stimmen bei mir nicht"

von Thomas B. (mrburns)


Lesenswert?

Hallo,

habe soeben mit der Library von Peter Fleury getestet.
(Natürlich dafür auch den Pin RS nun korrekt angeschlossen)

Das Programm funktioniert, aber wieder sind die rechten 8 Zeichen in der 
ersten und zweiten Zeile nur als Blöcke erkennbar.

Das heißt wohl für mich, neues LCD kaufen :-(

Werde euch auf dem Laufenden halten...


Danke erstmal für all Eure Mühe!

von Markus B. (mbp-bayern)


Lesenswert?

Hallo;

Gibts was neues ?

MFG:MBP

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.