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)
{
}
}
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
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.
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?
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 ?
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.
>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.
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".
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
>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;)
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 ?
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 ?
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?
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 :)
@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.
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)
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 ?
>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).
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"
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....
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.
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.
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