LCD Problem

OP #310190
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
Angehängte Dateien:
OP #310192
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
Gast #310194
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
OP #310195
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
Angehängte Dateien:
Gast #310197
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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren