Forum: Mikrocontroller und Digitale Elektronik Verzweifelt.LCD Display funzt nicht


von Melaine (Gast)


Lesenswert?

Hallo liebe Mikrocontrollergemeinde, ich bin seit ca 20 Stunden am Stück 
verzweifelt am probieren dieses LCD Dipslay zum Laufen zu kriegen.

http://www.pollin.de/shop/dt/NzczOTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_C0802_04.html

Contorller: HD47780

Ich verwende einen Atmega 8.
Ich habe viele fertige Display Treiber (auch von dieser Seite) 
heruntergeladenb und leider nicht zum laufen gebracht.
Danach habe ich mir ALLE!!!!! Tutorialbeiträge hier durchgelesen und 
einen wirklicj 0815 Treiber selbst programmiert keinesfalls schön 
aufgebaut ist, es soll lediglich die im Tutorial angegebenen 
initialisierungen durchführen und ein kleines "a" auf das Display 
schreiben.

>Die Initialisierung funktioniert auch noch einwandfrei, denn die schwarzen Balken 
in der ersten Reihe verschwinden nach 11 sec. (Zeiten sind bewusst mal so hoch 
gewählt)

als Zeichen übertrag eich den AsCII Code des "a" aber das Displaxy 
bleibt einfach leer.

Bin sehr verzweifelt weil ich nach ca 20 Stunden auch nichtmehr weis wo 
ich noch ansetzen soll. Vielleicht findet ja jemand einen Fehler im 
Code, mir ist bewusst dass er nicht elegant ausgeführt ist, abe rich 
wollte zuerts einmal eine einfache Funktion realisieren.






Code:
#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 1000000
#endif

#include <util/delay.h>


int main()
{
DDRD = 0xFF;
_delay_ms(5000);
PORTD = 0b00000011; //Datenleitungen richtig setzen
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_1
_delay_ms(1000);
PORTD &= ~(1<<PD5); //aus_1
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_2
_delay_ms(1000);
PORTD &= ~(1<<PD5); //aus_2
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_3
_delay_ms(1000);
PORTD &= ~(1<<PD5); //aus_3

//4 bit Mode setzen
_delay_ms(1000);
PORTD = 0b00000010;
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(100);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);

PORTD = 0b00000010; //Display aus
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(100);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);

PORTD = 0b00001000; //Display aus
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(1000);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);

PORTD = 0b00000000; //Display löschen
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(100);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);

PORTD = 0b00001000; //Display löschen
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(100);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);


PORTD = 0b00000000;   //Kurosr rechts
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(100);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);

PORTD = 0b00000001;    //Kursor rechts
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(1000);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);

PORTD = 0b00000000;
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(1000);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);

PORTD = 0b00000110;
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(1000);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);

PORTD = 0b00000000;
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(1000);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);

PORTD = 0b00001100;  //Display ein
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(1000);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);



//ab hier zeichen rein ins display

PORTD = 0b00010100;
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(100);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);

PORTD = 0b00010001;
_delay_ms(1000);
PORTD |= (1<<PD5); //ein_4
_delay_ms(1000);
PORTD &= ~(1<<PD5); //aus_4
_delay_ms(1000);



while(1)
{

}



}

von Falk B. (falk)


Lesenswert?

@  Melaine (Gast)

>Hallo liebe Mikrocontrollergemeinde, ich bin seit ca 20 Stunden am Stück
>verzweifelt am probieren dieses LCD Dipslay zum Laufen zu kriegen.

Dann geh mal ins Bett und schlaf dich ordentlich aus, in DEM Zustand 
wird das ganz sicher nichts.

>Contorller: HD47780

>Ich verwende einen Atmega 8.

Wie Millionen Leute vor dir.

>Danach habe ich mir ALLE!!!!! Tutorialbeiträge hier durchgelesen und
>einen wirklicj 0815 Treiber selbst programmiert

Völliger Käse.

>in der ersten Reihe verschwinden nach 11 sec. (Zeiten sind bewusst mal so >hoch
>gewählt)

Man kann alles übertreiben.

>als Zeichen übertrag eich den AsCII Code des "a" aber das Displaxy
>bleibt einfach leer.

Tja, verissen. A und B Note.

>Bin sehr verzweifelt weil ich nach ca 20 Stunden auch nichtmehr weis wo
>ich noch ansetzen soll.

Siehe oben. Kein Witz.

>Code, mir ist bewusst dass er nicht elegant ausgeführt ist, abe rich
>wollte zuerts einmal eine einfache Funktion realisieren.

Nimm den fertigen Code aus dem Tutorial, OHNE jegliche Änderungen und er 
wird funktionieren.

MFG
Falk

von Melaine (Gast)


Lesenswert?

>Hallo, ich hab eden aus dem Tutorial ja versucht, die Ports genau so vershaltet 
und alles nachgeprüft aber es hat nicht funktioniert...selbes 
Bild...initialisierung geht aber kein Text auf dem Display...kannst du nicht mal 
kurz über meinen Code lesen und mir sagen ob da was falsch ist, ansonsten müsste 
ich ein anderes Display bestellen,,,evtl ist das hier ja dann defekt..

von Melaine (Gast)


Lesenswert?

>Tja, verissen. A und B Note.


Was meinst du damit?

von Knut (Gast)


Lesenswert?

Na 20std is man nicht mehr in der Lage Fehler zielorientiert zu finden. 
Geh ins Bett. Morgen findest du den Fehler, is bestimmt nur n Dussel 
Fehler. Wenn nicht, melde dich nochmal.

Gute Nacht


Knut

von Bernd (Gast)


Lesenswert?

Hi Melanie,

es geht doch nichts über wirklich hilfreiche Beiträge.
(Vielen Dank, Falk!)

Timing ist (fast) alles.
IMHO passt Deine Initialisierung nicht.
Sieh Dir noch einmal das Tutorial und vielleicht noch das Datenblatt zum 
HD47780 an.

Bernd

von Melaine (Gast)


Lesenswert?

Hallo...ich bin leider zu ehrgeizig...möchte das gerne huete noch mit 
einem kleinen erfolgserlebniss abschliesen...habe soviel heute gelesen 
und mir soviel mühe gegeben...hat nicht einer einen kostruktiven 
vorschlag...

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Probier mal den Anhang.

von Melaine (Gast)


Lesenswert?

<Hallo Bernd...danke...das Datenblatt habe ich mir heute ganz genau 
angeschaut, auch die erklärungen unter

http://www.sprut.de/electronic/lcd/index.htm


daraus ist auch mein quellcode entstanden...an den zeiten steht immer 
"mindestens" daher erst mal die hohe zeit um zu sehen wann die init 
fertig ist etc....was kann an der init falsch sein...ich hab wirklich 
alles 5 mal geprüft, verdrahtung, dann der einfache code...hab ich was 
übersehen

von Melaine (Gast)


Lesenswert?

@holger,

hi,vielen Dank für den hexcode...hab eihn gerade reingebrannt, leide 
rohne erfolg...arbeitests du da auch im 4 bit mode,,,da past bestimmt 
die makefile garnicht und die pinbelegung...kann das sein?

von usuru (Gast)


Lesenswert?

poste mal Dein Schaltbild

von Melaine (Gast)


Lesenswert?

hi, schaltbild ist genau so realisiert wie beim tutorial 
hier...verdrahtung schon 2 mal geprüft...ich verende das pollin board un 
dhabe die pins über den 40 pol stecker nach außen geführt...die 
verdrahtung müsste passen, habe schon viele andere sachen hiermit 
gemacht und nie probleme gehabt

von holger (Gast)


Lesenswert?

>@holger,
>
>hi,vielen Dank für den hexcode...hab eihn gerade reingebrannt, leide
>rohne erfolg...arbeitests du da auch im 4 bit mode,,,da past bestimmt
>die makefile garnicht und die pinbelegung...kann das sein?

Ja, im 4 Bit Mode. Verschwinden die schwarzen Balken?

von Peter D. (peda)


Lesenswert?

Spaghetticode ist ganz großer Quatsch, ein Schreibfehler und nichts geht 
mehr.

Man schreibt zuerst ne Nibble-Funktion und darauf baut man alles andere 
auf:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=102296


Peter

von Melaine (Gast)


Lesenswert?

hi, holger
die schwarzen balken verschwinden nach 10 sec allerding werden auch 
keine zeichen dargestellt

von holger (Gast)


Lesenswert?

>hi, holger
>die schwarzen balken verschwinden nach 10 sec allerding werden auch
>keine zeichen dargestellt

Dann hast du dein Programm reingebrannt und nicht meins.

von Melaine (Gast)


Lesenswert?

hat mich auch gewundert sorry...sicher dass du das richtige verwendet 
hast, mom ich versuchs nochmal

von Melaine (Gast)


Lesenswert?

also hab mein programm gerade mal mit kürzeren zeiten versehen un ddann 
gehen die balken nach 2 sec weg...
brenne ich dein rein udn mache einen cold restart, dann dauerts 11 
sec...sorry

von void* (Gast)


Lesenswert?

Ein guter Rat:
Geh ins Bett, Erfolgserlebnis hin oder her.
Du kannst ja morgen in aller Ruhe nochmal ran.
Da scheint mehr im Unreinen zu sein, als nur der Code...

Viele Grüße

von holger (Gast)


Angehängte Dateien:

Lesenswert?

>brenne ich dein rein udn mache einen cold restart, dann dauerts 11
>sec...sorry

Ok, war für 16MHz kompiliert. Jetzt noch mal für 1MHz.

von Melaine (Gast)


Lesenswert?

hi...vielen dank...habs grad nochmal reingebrannt...die balken gehen 
jethzt nach 5 sec weg aber leider imme rnoch kein text?

vielleicht ist dad ding einfach im arsch

von El CeDe (Gast)


Lesenswert?

Dreh mal am Kontrast. Was passiert?

von Melaine (Gast)


Lesenswert?

es erscheinen alle balken noch einmal aber viel viel heller wie vor der 
initialisierung

von holger (Gast)


Lesenswert?

>hi...vielen dank...habs grad nochmal reingebrannt...die balken gehen
>jethzt nach 5 sec weg aber leider imme rnoch kein text?

Kontrolliere mal die oberen Datenleitungen DB6,DB7 vom
Display. Das müsste ja PORTD2 und PORTD3 sein. Kommt
da auch was an?

von El CeDe (Gast)


Lesenswert?

Melaine schrieb:
> hi, schaltbild ist genau so realisiert wie beim tutorial
> hier...verdrahtung schon 2 mal geprüft...ich verende das pollin board un
> dhabe die pins über den 40 pol stecker nach außen geführt

Im Tutorial gibt es ein Schaltbild mit dem Pollin Board?
Vielleicht gibt es ja doch einen Konflikt mit "On-Board Hardware" wie 
z.B. Schalter oder gesetztem Jumper.

Ich setze dasselbe Display ein. Hat bei mir sofort funktioniert, die 
Ansteuerung ist also Standard-Konform im 4-Bit-Modus.

Viel Glück

von Melaine (Gast)


Lesenswert?

hi holger...vielen lieben dank bisher...

sorry für die dumme frage...wie soll ich das kontrollieren...messen? wie 
lamge sollte das signal denn anstehen...hab mein oszi leider verliehen 
:-(

von Melaine (Gast)


Lesenswert?

Hallo El CE DE

ich habe die verbindungen so gesetzt wie im pollin board, bzw tutorial 
besfhirben und gerade nochmal alle leitungen kontrolliert...im pollin 
board pdf gibt es ein eklemmenbelegung des 40poligen 
steckers...dementsprechend hab eich alles so verlötet dass die richtigen 
ports vom atmega (Portd d 0-3 und 4,5) auch am dispülay 
ankommen...müsste doch eigentlich so gehen...die jumper sind alle 
runter...

wundert mich, dass die initialisierung gheht, sprich die balken weg 
gehen...hab schon einige sachen mit dem atmega gemacht, leider noch kein 
lcd...und nie solche probleme gehabt...

von W.S. (Gast)


Lesenswert?

Nimm mal deinen, seinen, meinen oder irgendeinen Driver...

Offenbar sind sich hier in diesem Forum alle zu schade, ihre Nase in 
eine der vorhandenen Dokumentationen zu stecken. Nun gut, da setze ich 
halt noch einen draufund poste hier eine Initialisierung, die 
tatsächlich funktioniert. Das Umsetzen von PIC zu Atmel überlasse ich 
dabei Melaine:

; Ausgabe auf LCD mit Warten auf Ready vom LCD
SayIt:   BSF    toRS_LCD

; toRS-LCD muß für Zeichenausgabe gesetzt sein
OutLCD:  MOVWF  RChar
         INCF   Lxpos,F
         CALL   Dir_IN
_ow:     BSF    RW_LCD
         BCF    RS_LCD
         BSF    CE_LCD
         NOP
         NOP
         MOVF   PortB,W
         BCF    CE_LCD
         ANDLW  10000000b
         SKIP   Z
         GOTO   _ow
         CALL   Dir_OUT
         GOTO   _out

; direkte Ausgabe auf LCD ohne Warten.
Out_imm: MOVWF  RChar

_out:    CALL   Dir_OUT
         ; RS einstellen
         SKIP   toRS_LCD
         BCF    RS_LCD
         SKIP   NOT toRS_LCD
         BSF    RS_LCD
         MOVF   PortB,W
         ANDLW  B'00001111'
         MOVWF  RPort

         ; zuerst hi
         MOVF   RChar,W
         ANDLW  B'11110000'
         IORWF  RPort,W
         MOVWF  PortB
         BCF    RW_LCD
         BSF    CE_LCD
         NOP
         NOP
         BCF    CE_LCD

         ; dann lo
         SWAPF  RChar,W
         ANDLW  B'11110000'
         IORWF  RPort,W
         MOVWF  PortB
         BCF    RW_LCD
         BSF    CE_LCD
         NOP
         NOP
         BCF    CE_LCD
         SKIP   toRS_LCD
         RETURN
         MOVLW  5
         GOTO   Wait

; Schreibposition im LCD setzen.

GoZeile2:
         MOVLW  64
         GOTO   SetPosi
GoZeile1:
         CLRW

SetPosi: MOVWF  Lxpos
         IORLW  B'10000000'
         BCF    toRS_LCD
         CALL   OutLCD
         BSF    toRS_LCD
         MOVLW  15
         ANDWF  Lxpos,F
         RETURN


ClrEol:  MOVF   Lxpos,W
         ANDLW  16
         SKIP   Z
         RETURN
         MOVLW  ' '
         CALL   SayIt
         GOTO   ClrEol

; LCD initialisieren
InitLCD:
         BCF      CE_LCD      ; CE lo
         BCF      RS_LCD      ; RS lo
         BCF      RW_LCD      ; R/W auf write
         BCF      toRS_LCD    ; auch in den Flags
         MOVLW    30          ; 30 ms
         CALL     Wait
         BCF      toRS_LCD
         MOVLW    B'00101000' ; 4 Bit Modus
         CALL     Out_imm
         MOVLW    10          ; 10 ms
         CALL     Wait
         MOVLW    00010100b   ; CursorMove+rechts
         CALL     Out_imm
         CALL     Wait_1
         MOVLW    00001100b   ; On+noCursor+noBlink
         CALL     Out_imm
         CALL     Wait_1
         MOVLW    00000110b   ; Increment+noShift
         CALL     Out_imm
         CALL     Wait_1
         MOVLW    00000001b   ; Clear
         CALL     Out_imm
         CALL     Wait_1
         MOVLW    00000011b   ; Clear
         CALL     Out_imm
         CALL     Wait_1
         BSF      toRS_LCD    ; 1 = Zeichenausgabe
         RETURN


Viel Spaß damit

W.S.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

das ist doch das Display, was auch im "Pollin Spiel" verwendet wurde

http://www.pollin.de/shop/dt/MTU4OTgxOTk-/Bausaetze_Module/Bausaetze/Bausatz_Pollin_Spiel_I.html

vielleicht kannst du ja da was im Code nachsehen

von Melaine (Gast)


Lesenswert?

ES GEEEEHHHHT!!!!

@holger...line1 / line2...super  ;-)


eine defekte folienleiterbahn war der grund...leider nur mit lupe zu 
erkennen....vielen lieben dank an alle die geholfen haben...nach 
lötbrücke geht jetzt der hex von holger und auch meiner...super



nochmal vielen lieben dank an alle die geholfen haben...anderer code hat 
zumindest daztu geführt die hardware nochmal genau zu beäugen....ihr 
seit klasse


vielen dank

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

nun aber husch-husch ins Bettchen !

von Martin S. (der_nachbauer)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> nun aber husch-husch ins Bettchen !

Absolut.

Und, liebe Melanie - neben meinen Glückwünschen zu dem verspäteten 
Erfolgserlebnis - gewöhne Dich bitte schon einmal daran, dass manche 
Dinge nicht sofort klappen.

Da braucht man Geduld und Ruhe.

Um so mehr man sich den "kleinen schnellen Erfolg" herbeisehnt, um so 
eher begeht man bei dem Zwang, diesen "eben noch schnell" 
herbeizuführen, aus einem kleinen Fehler im Aufbau einen grossen - oder 
schlimmer: mehrere - zu machen.

Daher: Wenn's wieder einmal gar nicht klappen will, erst einmal die Ruhe 
bewahren, systematisch herangehen (Leitungen durchmessen, Checkliste) - 
und das am Besten erst am folgenden Tag.

-----

Dazu eine kleine Anekdote von mir selbst:

Eines meiner allerersten Aufbauten beinhaltete u.a. eine ISP 
Schnittstelle direkt auf der Zielschaltung, da ich wusste, dass ich 
einige Änderungen [an der Firmware] durchspielen wollen würde - da hatte 
ich von vornherein keine Lust, dann jedes Mal den µC zum flashen 
ausbauen zu müssen.

Als ich die Schaltung jedoch aufgebaut hatte, bekam ich um's Verrecken 
keine Verbindung zu dem µC.

Alles geprüft, Spannung ok, Leitungen und Verdrahtungen ok, Widerstände, 
Kondensatoren, alles bestens in Ordnung.
Sub-D Buchse durchgeprüft, alle Pins passten zu den Anschlüssen, nichts 
zu machen.

Irgendwann, als es schon [sehr] spät wurde, habe ich es erst einmal 
aufgegeben und bin [zugegeben leicht gefrustet] in's Bett.

Am nächsten Morgen jedoch unter der Dusche fiel mir spontan [wie so oft] 
ein, dass da doch was mit dem Reset Pin beim ISP war ...
Ich hatte stumpf in der ansonsten korrekten Schaltung vergessen, auch 
den Reset Pin auf die Sub-D Leiste zu bringen - also befand sich der µC 
trotz bestem Zuredens nie in der benötigten Initialisierungsphase nach 
dem Reset, in der das Flashen überhaupt erst möglich gewesen wäre ...

Im Nachhinein bin ich froh, dass ich erst einmal die Nacht über das 
Problem geschlafen habe. Am Abend zuvor war ich auch auf der Suche nach 
dem "einen schnellen Erfolg noch vor dem Feierabend" - wer weiss, was 
ich da noch probiert [lies: ein- und ausgelötet] hätte ...


In diesem Sinne,

Martin (der Nachbauer)

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.