Forum: Mikrocontroller und Digitale Elektronik 20x4 LCD an MyAVR Board anbinden


von Tobi G. (topps)


Lesenswert?

Hallo Forum,

ich habe mir ein 2004 LCD 20X4 Zeichen HD44780 zugelegt. Da ich noch ein 
altes MyAVR Board (aus Schulzeiten) mit einem Atmega8 habe, dachte ich 
mir diesen einfach mittels Atmel Studio 6 anzubinden. Doch da fangen die 
Probleme schon an, da meine Programmierkenntnisse solala sind.

Ich hatte mir schon ein paar libs und Anleitungen dazu angeschaut, aber 
irgendwie bekomme ich das LCD nicht eingebunden. (ehrlich gesagt bin ich 
mir auch nicht sicher was ich da alles einbinden muss, da wir damals 
kaum mit  dem Board gearbeitet hatten bzw ein LCD noch nie benutzt 
hatten). Das LCD wollte ich im 4Bit-Modi betreiben mit den 
Datenleitungen DB4-DB7 betreiben.

Hat jemand eine Idee wie ich es vernünftig einbinde (gibt es da schon 
etwas)???
Hatte auch erst mal vor, nur was kleines Textmäßiges und was kleines mit 
Timern auszugeben. vllt ein kleines Beispiel Programm damit ich mich da 
auch mal rein arbeiten kann. Um Hilfe für den kleinen Anfänger wäre ich 
sehr verbunden.

Vielen Dank schon mal im voraus

von Georg G. (df2au)


Lesenswert?

Fang doch mal mit einem Schaltbild an, wie du dir das vorstellst. 
Beispielprogramme für LCD gibt es hier im Forum dann zu Hauf, angefangen 
mit der Fleury Lib, die sehr flexibel ist, bis hin zu sehr speziellen 
Varianten. Aber eins nach dem anderen.

von Icke ®. (49636b65)


Lesenswert?

Das Tutorial durchzuarbeiten, wäre zu einfach?

https://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

von Wolfgang (Gast)


Lesenswert?

Tobi G. schrieb:
> Ich hatte mir schon ein paar libs und Anleitungen dazu angeschaut, aber
> irgendwie bekomme ich das LCD nicht eingebunden.

Dann nimm dir erstmal das Datenblatt und guck dir die Pinbelegung an. 
Sonst ist Chaos und evtl. Defekt vorprogrammiert, bevor die erste 
Programmzeile abgearbeitet ist.
Beitrag "Punkt-Matrix-Anzeigen an Atmega32 will nicht leuchten"

von Tobi G. (topps)


Angehängte Dateien:

Lesenswert?

Im Anhang ist das was ich mir jetzt zusammen gestellt habe. Vllt kann da 
ja jemand mal rein schauen und sagen was mir da fehlt oder was zu viel 
ist. habs versucht zu überspielen, das ging auch, jedoch zeigt das LCD 
immer noch die zwei weißen Balken an, so viel wie ich hier gehört habe 
müsste das ja heißen das es noch nicht initialisiert wurde.

Pin Belegung habe ich wie folgt:
 RS an PortB 4
 RW an GND
 E  an PortB 5
 D0-D3 ist nicht belegt
 D4-D7 an PortB 0-3

von Wolfgang (Gast)


Lesenswert?

Tobi G. schrieb:
> habs versucht zu überspielen, das ging auch, jedoch zeigt das LCD
> immer noch die zwei weißen Balken an, so viel wie ich hier gehört habe
> müsste das ja heißen das es noch nicht initialisiert wurde.

Es kann auch sein, dass das an deiner Beschaltung liegt.
In deiner Pin-Belegungsliste fehlen die Versorgungsspannung und VEE.

von Tobi G. (topps)


Lesenswert?

die habe ich extra raus gelassen weil sie für mich klar waren.

VSS an GND
VDD an 5V
V0 liegt liegt hinterm Poti (Kontrastspannung)
Anode an 5V (Vorwiderstand ist verbaut)
Kathode GND

von grundschüler (Gast)


Lesenswert?

für das myAVR gibt es doch Beispielsoftware, die auf Anhieb 
funktioniert. Für LCDs bietet sich i2c-module an:
http://www.ebay.de/itm/IIC-I2C-TWI-SPI-5V-Serial-Interface-Board-Module-for-Arduino-1602LCD-Display-/201004359626?hash=item2ecccb1fca:g:O2AAAOSwMmBVgi3F
Das erleichtert den richtigen Anschluss und spart i/o-pins.

von aSma>> (Gast)


Lesenswert?

@Tobi Greis

Servus,
Füge bitte nur den Header + .c Datei an, dann gucke ich auch mal drüber.

mfg

von Tobi G. (topps)


Angehängte Dateien:

Lesenswert?

@aSma anbei die .c datei

was begrenzt denn den Header von welcher Datei meinst du ? 
Entschuldigung nochmal für mein Unverständnis bin nicht so in der 
Materie drin

von Tobi G. (topps)


Angehängte Dateien:

Lesenswert?

Anbei auch noch die .h

von grundschüler (Gast)


Lesenswert?

jetzt fehlt noch die main.c in der das lcd initialisiert wird und ein 
Foto vom Anschluss des LCD.

von Forist (Gast)


Lesenswert?

grundschüler schrieb:
> Für LCDs bietet sich i2c-module an:
> Ebay-Artikel Nr. 201004359626
> Das erleichtert den richtigen Anschluss und spart i/o-pins.

Warum willst du Fahrrad fahren. Es gibt doch Boote, die können sogar 
schwimmen. Das spart die Luft in den Reifen.

Hääh ...

von Tobi G. (topps)


Angehängte Dateien:

Lesenswert?

Anbei die main und 2 fotos, wo man vllt aber nicht alles so gut sieht, 
aja falls fragen sind....ich sitzt ja immer noch hiervor :D

von Eberhard H. (sepic) Benutzerseite


Lesenswert?

Es scheint, als hättest Du die Reihenfolge der vier Datenbits 
vertauscht.

von Tobi G. (topps)


Lesenswert?

@Eberhard
:P grad getauscht aber leider auch keine Besserung

von grundschüler (Gast)


Lesenswert?

der code scheint ok zu sein.

Kontrast stimmt?

kleines Testprogramm für die i/o schreiben und mit einem Multimeter die 
Verdrahtung prüfen und mit lcd.h abgleichen:

lcd_init();
for(i=0;i<6;i++){
PORTB|=i<<1;
_delay_ms(2000);
PORTB&=~(i<<1);
}

von topps (Gast)


Lesenswert?

Also das mit dem Kontrast müsste stimmen, damit hebe ich ja auch nur die 
Zeilen hervor

Habe auch schon mehrfach versucht in der main was zu schreiben und paar 
Befehle einzusetzen, aber über die Balken auf dem Display komme ich 
nicht hinaus, aber ich denke es wird einfach nicht initialisert.

Hat denn keiner ein anderes fertiges Programm mit .c und .h datei für 
ein 4x20 Zeilen Display, dann könnte ich vllt mal vergleichen was das 
nicht stimmt

So langsam verzweifel ich mit dem dingen hier :D es wird wahrscheinlich 
ein kleiner Fehler sein aber ich bin halt zu doof um den zu finden, weil 
ich mich auch nicht so gut auskenne

MfG

von Pete K. (pete77)


Lesenswert?

Nicht so ungeduldig. Wenn Du auf die Rückseite des Displays schaust, 
solltest Du zwei Controller erkennen können. Typischerweise werden 20x4 
nämlich nicht nur mit einem Controller angesteuert.
Aber ich kenne das Display nicht, daher ist das nur eine Vermutung.

Wenn Du in das Datenblatt des LCD schaust, wirst Du die Initialisierung 
dort finden, eventuell sind die Timings falsch.

Überprüfe mal das hier aus der lcd.h gegen das Datenblatt:
#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

Gibt es Compiler-Warnungen?

: Bearbeitet durch User
von Udo R. (blackbird)


Lesenswert?

Hallo Tobi,

mMn ist deine Pinbelegung mit
 RS an PortB 4
 RW an GND
 E  an PortB 5
 D0-D3 ist nicht belegt
 D4-D7 an PortB 0-3
nicht korrekt.
Lies die #defines in lcd-routines.h am Anfang durch.
Versuch mal mit:
 RS an PortB2

 E  an PortB3

 D4-D7 an PortB4-B7.

MfG Udo

von Jobst M. (jobstens-de)


Lesenswert?

Pete K. schrieb:
> Typischerweise werden 20x4
> nämlich nicht nur mit einem Controller angesteuert.

Das Display hat, wie auf dem Bild zu sehen, nur einen E Anschluss. Also 
auch nur einen Controller.


Gruß

Jobst

von grundschüler (Gast)


Lesenswert?

Udo R. schrieb:
> PortB4-B7.

beim Atmega8 wird das schwierig.

von Udo R. (blackbird)


Lesenswert?

Dann bitte alles an Port D hängen.
Mfg Udo

von topps (Gast)


Lesenswert?

@ Pete

habe dieses Display gekauft. Leider aber kein Datenblatt dabei.
2004 LCD blue Display Anzeigen 20X4 Zeichen 5V mit HD44780 CP02009 von 
ebay
Bei Datenblättern aus dem inet fand ich aber keine wirklichen Timings 
bzw nur das mit dem display is clear hab ich da gesehen.

Warnungen habe ich beim überspielen nicht erhalten

@Udo

wie grundschüler schon sagt Hat der Atmega8 nicht so viele. PortB0-5

von topps (Gast)


Lesenswert?

Macht das überhaupt ein Unterschied Udo?
habs an PortD muss aber Bei PortD 2-5 die Datenleitungen 
anschließen.(0-1 sind glaube ich schon vom Board selber belegt) 6 an RS 
und 7 an E


jetzt habe ich auf dem Display alle 4 Zeilen dargestellt bzw mit einem 
weißen Balken belegt

von holger (Gast)


Lesenswert?

>jetzt habe ich auf dem Display alle 4 Zeilen dargestellt bzw mit einem
>weißen Balken belegt

Dann dreh mal am Kontrast.

von aSma>> (Gast)


Lesenswert?

Servus,
ändere mal bitte
1
#define LCD_ENABLE_US           20
2
#define LCD_WRITEDATA_US        46
zu
1
#define LCD_ENABLE_US           LCD_WRITEDATA_US
2
#define LCD_WRITEDATA_US        46

mfg

von topps (Gast)


Lesenswert?

@HOLGER am Kontrast drehen bewirkt keine Änderung, außer das die weißen 
Balken weg oder da sind

@aSma habs getauscht und überspielt dann hat es kurz geflackert aber 
auch hier keine Änderung

von aSma>> (Gast)


Lesenswert?

@TO

Hast du den richtigen CPU Takt eingestellt? Lasse mal eine LED in 1s 
Takt blinken.

Werden die Ports richtig angesteuert?
--> Debugmodus und die Initialisierungsroutine mal durchgehen.

Ich bin kein Freund von Arduino. Aber irgendwo tief im Schrank liegt bei 
mir einer. Manchmal können Kleinigkeiten Tage in Anspruch nehmen.

von Udo R. (blackbird)


Lesenswert?

Hi Tobi,

hast du auch noch "myAVR Quickprog" oder womit programmierst du?
Könnte dir dann mal ein hex-file schicken zum Ausprobieren.

MfG Udo

von topps (Gast)


Lesenswert?

Hi Udo

ehm habe nur Atmel Studio 6.2 mit dem ich programmiere.

@aSma CPU von 3686400 stimmt Led hab ich noch nicht probiert weil ich ja 
sonst nix sehe  mit dem debuggen muss ich mal schauen.

ich häts vllt besser mit Arduino gemacht :P ;D da findet man viel ;D

von Udo R. (blackbird)


Angehängte Dateien:

Lesenswert?

Hab gerade mit meinem alten "myAVRBoard mit LCD-Display" am LPT-Port 
herumgespielt und bemerkt, dass das Prog. erst nach dem Brennen läuft 
und auf dem LCD eine Anzeige erscheint, wenn das LPT-Kabel abgezogen 
ist.
Ich häng mal einfach was an: LCD1.asm und die Hex dazu. Ist zwar in 
Assembler, sollte auch in deinem Studio laufen. Sonst einfach mal die 
Hex brennen. Good luck!

MfG Udo

von grundschüler (Gast)


Lesenswert?

Wenn du an den Routinen nichts verändert hast, ist es unwahrscheinlich 
dass der Fehler daran liegt. Ob du Port B, c oder D verwendest, ist 
völlig egal. Mit der oben dargestellten Test-Routine kannst du zum einen 
das Pinout überprüfen, zum anderen merkst du, ob der CPU-Takt stimmt.

von Tobi G. (topps)


Lesenswert?

Hallo Liebe Leutsss,

Nochmals Vielen Dank für ALLE die mich bei meinem Problem unterstützt 
haben.
Den genauen Fehler werde ich wohl nicht erfahren. Habe eure Vorschläge 
getestet und nachgeschaut.

Nach dem gefühlten 1000 Test Tag hatte ich den Mikrocontroller 
angeschlossen und auf einmal gab er meinen Text aus^^. Im Programm wurde 
nichts geändert, komisch das er dann auf einmal ging(ob das an 
irgendwelchen Zeiten lag kaaa). Das war mir dann auch egal die Freude 
hat gesiegt....

Jetzt hab ich schon ein bisschen rum gespielt, paar Texte ausgegeben und 
verschoben. Jetzt hätte ich trotzdem noch ne Frage. Wie sieht denn der 
Befehl aus wenn ich eine Zahl in meiner main ausgeben möchte, das hatte 
ich auch schon probiert jedoch bekomme ich immer ne Fehlermeldung....too 
few arguments... irgendwas scheint zu fehlen :P.

Ich hatte mir vorgestellt, etwas auf dem Display zu zählen. Mit ner LED 
hab ich das schon getestet.

Einfallende Signale möchte ich zählen(counts = counts + 1;) und das dann 
auf dem Display hochzählen lassen..
Kann ich den Befehl einfach in das lcd_number(); übernehmen oder kann 
ich dem nur zahlen vorgeben??? Das versteh ich nicht so ganz

Mit freundlichen Grüßen
topps

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.