LCD mit KS0073

Gast #1333805
Lesenswert?

Dieses Display treibt mich in den Wahnsinn. Ich habe gestern den ganzen 
Tag probiert mir einen Init für dieses Display zu basteln. Leider ohne 
Erfolg..
Also hier ein bisschen gesucht und in den zahlreichen Threads zum Thema 
auch einige Funktionen gefunden, die das Display eigentlich ans laufen 
bringen sollten. Bei mir tun sie das aber nicht und ich weiss nicht mehr 
wo ich noch suchen soll.

Ich habe mich für folgende Funktion entschieden
Beitrag "LCD EA DIP204-4 Initialisieren"

Das Display ist im 4 bit Modus angeschloßen.
In der Display.h habe ich folgende Änderungen vorgenommen
1
#define LCD_DATAPORT    PORTB  //Port für die 4 Datenleitungen
2
#define LCD_DATAPORTDR    DDRB
3
#define LCD_DATA0      0
4
#define LCD_DATA1      1
5
#define LCD_DATA2      2
6
#define LCD_DATA3      3
7
#define LCD_SETPORT      PORTB  //Port für die 3 Steuerleitungen
8
#define LCD_SETPORTDR    DDRB
9
#define LCD_RS        4    //Umschalten zwischen Befehl(Low) und Daten
10
#define LCD_E        5    //Enable bei fallender Flanke

Meine Datenleitungen liegen also auf PortB 0-3 und die beiden 
Steuerleitungen ebenfalls auf PortB Pin 4+5. Vielleicht ist das auch der 
Knackpunkt, denn in der ursprünglichen Version der Funktion liegen die 
Steuerleitungen auf einem anderen Port. Vielleicht funktionieren daher 
die letzten 4 Zeilen des #defines nicht korrekt. Um das zu beurteilen 
kenne ich mich aber zu wenig aus.

Das Display zeigt im jetzigen Zustand nur dunkle Kästchen
Gast #1333888
Lesenswert?

Die Headerdatei suggeriert das die Pins frei
verteilt werden dürfen. Kann man aber nicht.
Es müssen die Bits D4..7 für Daten benutzt werden.
Die Steuersignale dürfen nicht auf demselben Port
wie die Daten liegen. Das Proggi ist einfach
schlecht geschrieben.
Gast #1333922
Lesenswert?

Also muss ich wohl doch selbst ran..
Wie läuft das denn genau mit dem senden im 4 bit Modus? Zuerst das High 
Nibble, dann das Low, OK. Aber muss ich zwischendrin warten? Oder schick 
ich das einfach direkt nach einander?
Gast #1333981
Lesenswert?

init wird :


senden 8bit modus  ( ohne busy )
warten
senden 4bit modus ( ohne busy)  // dasganze 3x ( meist reicht 2x )
warten
senden restliche parameter ( cursor , disp ON , usw ..)


bei den schreibroutinen sendest du zuerst das high , dann das low nibble
damit das univeseller einsetzbar ist hab ich folgendes gemacht :

for( ;i<2;i++)
{
if (i==1) data <<= 4;  // im 2ten durchlauf wird das databyte geschoben
if (data & 0x80) LCD_PORT |= (1<<LCD_D7);
if (data & 0x40) LCD_PORT |= (1<<LCD_D6);
if (data & 0x20) LCD_PORT |= (1<<LCD_D5);
if (data & 0x10) LCD_PORT |= (1<<LCD_D4);
enable_E
 asm volatile("nop");
disable_E
}


LCD_PORT ist eben der PORT wo die datenleitungen dranhängen
LCDDx  ist der passende pin dazu
wenn man möchte kann man LCD_PORT sogar für jeden pin einzeln definieren
also LCD_PORT_1 bis ..._4   dann isses wirklich egal wo welcher pin 
dranhängt
nach dem nibble muss E geenabled werden für 1-2 nops
meist sagt das datenblatt 50-200ns


in der initialisirungsphase hab ich eine abfrage drin die mir nur 1 
durchlauf gibt

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