Forum: Mikrocontroller und Digitale Elektronik LCD Problem


von Thomas B. (datom)


Angehängte Dateien:

Lesenswert?

Hallo,

seit ein paar Tagen versuche ich ein 4*20 Zeichen LCD (Controller IC
KS0066U) zum laufen zu bekommen, aber es funktioniert nicht.
Als uC verwende ich einen ATMega8, den ich per STK500 programmiere. Das
LCD habe ich per Adapterkabel direkt über einen Erweiterungsstecker des
STK500 mit dem Mikrocontroller verbunden und möchte es im 4-Bit-Modus
betreiben.

Verbunden habe ich:
DB4  mit  PB0
DB5  mit  PB1
DB6  mit  PB2
DB7  mit  PB3
RS   mit  PB4
R/W  mit  PB5
E    mit  PB6

Zum Ansteuern des Displays habe ich ein C Programm geschrieben, das ich
hier mit angefügt habe. Irgendwo muss sich aber ein Fehler
eingeschlichen haben, da nach dem Flashen des ATMega8 keine Reaktionen
auf dem Display zu sehen sind.

Bin für jede Hilfe dankbar!

Thomas

von phagsae (Gast)


Lesenswert?

Hallo Thomas

Erhöhe mal den Kontrast auf maximium.
2 Balken init -> ok

Wo ist die Übertrage() ??

von Thomas B. (datom)


Lesenswert?

Hallo,

erstmal danke für deine Antwort :).

Das mit den Kontrast habe ich auch schon ausprobiert, aber das ändert
gar nix. Die 2 Balken bleiben dann einfach da :).

Die Daten/Befehle werden mit der Funktion lcd_write ans Display
übertragen, oder was meinst du mit übertrage()?

Grüße Tom

von Stefan (Gast)


Lesenswert?

Hallo,
also wenn dein display HD44780 kompatibel ist fehlt auf jeden fall noch
ne Funktion die den Cursor positioniert.

mfg
Stefan

von Stefan (Gast)


Lesenswert?

Hallo nochmal,
außerdem musst du das Display beim initialisieren zuerst so behandeln
als wäre es am 8 bit bus. Also nur ein nibble übertragen. Hier mal mein
Code zum init, der funktioniert einwandfrei.

//********************************************************************
//---------------------------------------------------------------------- 
------
void LCD_instr(unsigned char daten)
{
 unsigned char daten2;
 daten2 = daten / 16;
 LCD_RS_0;                   //Register Select = Instrunction Register
Warte(lcdzeit);
 PORTD = PORTD & 0xF0;
 PORTD = PORTD | daten2;
Warte(lcdzeit);
 LCD_E_1;                   //Enable auf high
Warte(lcdzeit);
 LCD_E_0;                   //Enable=low -> Daten übernehmen
 PORTD = PORTD & 0xF0;
 PORTD = PORTD | daten;
Warte(lcdzeit);
 LCD_E_1;                   //Enable auf high
Warte(lcdzeit);
 LCD_E_0;                   //Enable=low -> Daten übernehmen
Warte(lcdzeit);
}


//---------------------------------------------------------------------- 
------
void init_LCD(void)
{
unsigned char daten;
LCD_E_0;                       //Enable auf low
LCD_RS_0;
Warte(60000);
 daten = 0x03;
 PORTD = PORTD & 0xF0;
 PORTD = PORTD | daten;
Warte(60000);
LCD_E_1;
Warte(60000);
LCD_E_0;
Warte(60000);
 daten = 0x03;
 PORTD = PORTD & 0xF0;
 PORTD = PORTD | daten;
Warte(60000);
LCD_E_1;
Warte(60000);
LCD_E_0;
Warte(60000);
 daten = 0x03;
 PORTD = PORTD & 0xF0;
 PORTD = PORTD | daten;
Warte(60000);
LCD_E_1;
Warte(60000);
LCD_E_0;
Warte(60000);
 daten = 0x02;
 PORTD = PORTD & 0xF0;
 PORTD = PORTD | daten;
Warte(60000);
LCD_E_1;
Warte(60000);
LCD_E_0;
Warte(60000);
LCD_instr(0x28);  //LCD Function Set
Warte(60000);
LCD_instr(0x0C);  //LCD initialisieren
Warte(60000);
LCD_instr(0x01);  //LCD löschen
Warte(60000);


mfg
Stefan

von Thomas B. (datom)


Angehängte Dateien:

Lesenswert?

Hallo Stefan,

meinst du nach der Initialisierung? Hab ich gerade versucht, hat aber
auch nix gebracht.

Ich kann mir eigentlich nur vorstellen, dass irgendwas an der
Initialisierungsroutine falsch ist.
Wie teile ich dem display eigentlich mit dass ich im 4-bit modus
übertrage? Ich kann ja per befehl einstellen, ob ich ein 8bit oder ein
4 bit interface verwende (siehe datenblatt "set function"). Bei der
Initialisierung muss man laut vorgegebener Routine aber angeben dass
man ein 8 bit interface verwendet. Kann das der Fehler sein?

Grüße

von Thomas B. (datom)


Lesenswert?

Hallo Stefan,

hab deinen Code gerade erst gesehen, werde ihn gleich mal
ausprobieren.

Grüße

von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

tag

hier mal mein code. funktioniert bei >10 displays die ich schon verbaut
hab.
portpins kannst du in der header-datei einstellen. die datenpins
sollten allerdings immer die unteren 4 portpins sein, sonst klappt das
ganze so wie es jetzt geschrieben ist nicht.
steuerleitungen können auf dem gleichen port sonst frei gewählt werden.

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.