Forum: Mikrocontroller und Digitale Elektronik EA DOG-M LCD-Treiber für Codevision gesucht


von Sebastian (Gast)


Lesenswert?

Hallo,

leider sehe ich auf meinem EA DOG-M-LCD mit den
Standard-Codevision-LCD-Treibern noch nichts, vermutlich weil der
Kontrast softwareseitig noch nicht eingestellt worden ist.
Hat jemand vielleicht schon fertige Softwaretreiber?

Viele Grüße

Sebastian

von TobyTetzi (Gast)


Lesenswert?

Hallo Sebastian,

ich habe die Codevision Lib mal umgeschrieben.
Vielleicht nützt dir das ?

Der Controller wird anders initialisiert, als bei Standart LCDs.

Gruß Toby

von TobyTetzi (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist die Header Datei.
Die Lib kommt gleich.

Gruß Toby

von TobyTetzi (Gast)


Angehängte Dateien:

Lesenswert?

Da ist die Lib.

Ich hatte ein 3x16 LCD, und habe folgende Sonderfunktionen
hinzugefügt.
Außerdem die Initialisierung geändert.

Hiermit lassen sich aus 2 Zeilen eine hohe Zeile machen.

// DOGM Double High Funktion 1,2,3
void lcd_high (char high);

Hiermit kannst du den Kontrast in 15 Schritten ändern.

// DOGM Contrsat Set 1,2,...,10 - 15
void lcd_contrast (char contrast);

Bei Fragen, kannst dich gerne melden.

void lcd_high (char high)
{
switch (high) {
    case 1:
        //3 Zeienbetrieb
        //_lcd_ready(); // RS=0
        //_lcd_write_data(0x29);
        //Zurück zur Tabelle 0:1
        _lcd_ready(); // RS=0
        _lcd_write_data(0X28);
    break;
    case 2:
        //unteren beiden Zeilen Zusammen
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2E);  //Table2
        _lcd_ready(); // RS=0
        _lcd_write_data(0x10);  //UD auf 1
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2C);  //DH auf 1
    break;
    case 3:
         //oberen beiden Zeilen Zusammen
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2E);  //Table2
        _lcd_ready(); // RS=0
        _lcd_write_data(0x18);  //UD auf 0
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2C);  //DH auf 1
    break;
    };
     //Zurück zur Tabelle 0:1
    //_lcd_ready(); // RS=0
    //_lcd_write_data(0X28);
}

void lcd_contrast (char contrast)
{
switch (contrast) {
    case 1:
        _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x71);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 2:
        _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x72);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 3:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x73);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 4:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x74);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 5:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x75);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 6:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x76);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 7:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x77);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 8:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x78);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 9:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x79);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 10:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7A);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 11:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7B);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 12:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7C);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 13:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7D);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 14:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7E);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 15:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7F);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    };
    // Zurück zur Tabelle 0:1
    _lcd_ready(); // RS=0
    _lcd_write_data(0X28);
}

Gruß Toby

von TobyTetzi (Gast)


Lesenswert?

Was mir noch eigefallen ist,

wenn Du irgendwelche Einstellungen vornimmst, z.B. den Kontrast ändern
oder die Zeilenhöhe,
mußt Du beim nächsten Schreibvorgang darauf achten, in welcher
Funktionstabelle du dich befindest.

Falls Du Änderungen vornimmst, sage es mir bitte, da ich diese bestimmt
auch verwenden kann.

Gruß Toby

von Sebastian (Gast)


Lesenswert?

Danke Toby für deine Antwort.

Ich habe deinen Code auch gleich mal ausprobiert.

...

lcd_init(16);
lcd_contrast (15);
lcd_high (0);
lcd_clear();
lcd_gotoxy(0,0);
  lcd_putsf("ABCDEFGHIJklmnop");
lcd_gotoxy(0,1);
  lcd_putsf("1234567890");

...

aber leider sehe ich die zweite Zeile nicht.

Habe ich noch etwas vergessen?

von TobyTetzi (Gast)


Lesenswert?

Hallo,

so sieht die Init bei mir aus:

// LCD module initialization
    lcd_init(16);
    lcd_clear();
    // Setze LCD Kontrast Zurück zur Tabelle 0:1
    lcd_contrast(15);

    lcd_enable = 0;

    lcd_clear();

    lcd_high(1);

Aber wenigstens geht die 1. Zeile schonmal!

Hier liegt dein Fehler:
lcd_high(0);

Du mußt 1,2 oder 3 übergeben.

Gruß Toby

von TobyTetzi (Gast)


Lesenswert?

Hi,

das lcd_enable = 0; kannst Du dir sparen, ist was anderes.

Gruß

von Sebastian (Gast)


Lesenswert?

"Hier liegt dein Fehler:
lcd_high(0);"

Das war nur ein kleiner Test von mir. Mit lcd_high(1) kam das gleiche
heraus-
Du hast wahrscheinlich die Version DOGM163, während ich ein
zweizeiliges Display (DOGM162) habe. Da sind dann bestimmt die
Initialsierungsbefehle anders.

von TobyTetzi (Gast)


Lesenswert?

Hallo,

ich hatte das 163, 3 Zeilig, stimmt.

Schau mal in der Init des Controllers, evtl. ist die 2.Zeile die 3.
Schreib mal in die 3.Zeile was rein.

Gruß Toby

von Sebastian (Gast)


Lesenswert?

Hallo,

es klappt, nur mit der Einschränkung, dass die Zeile dann um acht
Stellen nach links verschoben ist und man entsprechend viele
Leerzeichen einfügen muss.

von MartinS (Gast)


Lesenswert?

Die Adresse des ersten Zeichens ist bestimmt falsch, Die sind bei den 2
Zeilen und 3 Zeilen Displays unterschiedlich.

von TobyTetzi (Gast)


Lesenswert?

Hallo,

wenn du in die 3. Zeile schreibst, oder wann?

Ich dachte, die Anfangsadressen sind gleich, da es der gleiche
Controller ist.
Wenn es so ist, mußt Du diese Startadressen der einzelnen Zeilen in der
Lib ändern:

// initialize the LCD controller
unsigned char lcd_init(unsigned char lcd_columns)
{
#asm
    cbi   __lcd_port,__lcd_enable ;EN=0
    cbi   __lcd_port,__lcd_rs     ;RS=0
#endasm
_lcd_maxx=lcd_columns;
_base_y[2]=lcd_columns+0x90; // hier kannst Du die Adresse der 1.Zeile
ändern
_base_y[3]=lcd_columns+0xA0; // hier die der 2. Zeile

Gruß Toby

von TobyTetzi (Gast)


Lesenswert?

Hi,

ich kann es leider nicht ausprobieren,
habe kein 2 Zeiliges hier,
aber im Functionsset kannst Du von 3 auf 2 Zeilen einstellen.

Gruß Toby

von TobyTetzi (Gast)


Lesenswert?

Ach,

bitte lese im original Datenblatt der Controllers nach der Init.
Mit der auf dem PDF von EA kam ich auch nicht klar.

Es gibt ein Bit, N3 und N.

Bei 3 Zeilen ist es N3=1, N=1.
Bei 2 Zeilen muß es N3=0, N=1 heißen.
Dann hast Du 2 Zeilen initianilisiert.

Ein 2 Zeilen LCD hat ja nur eine Zeile mit 2x 40 Zeichen.
Startadresse 1. ist 00
Startadresse 2. ist 40.

Beim 3 Zeiligen hat man eigentlich 4x20 Zeichen.
Startadresse 1. 00
Startadresse 2. 10
Startadresse 3. 20

Die Startadressen stimmen so, lt. Datenblatt.
Mit den Zeilen bei den Displays kann ich mich auch täuschen.

Gruß Toby

Gruß Toby

von Sebastian (Gast)


Lesenswert?

Hallo Toby,


ich schau es mir dann mal in Ruhe an, vielen Dank nochmal für deine
Hilfe, du hast mir prima weitergeholfen.



Gruß aus einem bayrischen Kuhkaff

Sebastian

von Tobias Tetzlaff (Gast)


Lesenswert?

Hallo nochmal,

ich habe nun ein DOGM 163 W, mit Amber Beleuchtung.

Laut EA Homepage soll der Hintergrung weiß, und die Schrift schwarz
sein.

Bei mir ist er aber eher durchsichtig.

Kann mir das mal wer erklären?

Gruß Toby

von Christoph Söllner (Gast)


Lesenswert?

Hallo, ich mach den Thread nochmal auf, weil ich grad an einem DOG 162,
also nur mit zwei Zeilen dransitze und die Lib nicht zum Laufen bekomme
(4 Bit, 5V Vcc, Anschaltung laut EA DB und CodeVision).

Die lcd_init(16); gibt immer "nicht erkannt" zurück.

Also meine Frage: Hat vielleicht schonmal jemand obige Lib mit einem
162er getestet und laufen gehabt? Weil ich doch meine,
Verdrahtungs-fehler ausschließen zu können.

Und falls nein, hat schon mal jemand eine Init für das 162er
geschieben?

Grüße,
Christoph

von Tobias Tetzlaff (Gast)


Lesenswert?

Hallo Christoph,

für das 162 mußt du die Init ändern, es wird anders Initialisiert.
ich habe leider immer noch kein 162, nur ein 163, sonst könnte ich Dir
weiterhelfen, in dem ich es selber teste.

Gruß Toby

von Christoph Söllner (Gast)


Lesenswert?

Hi *,

Also Deine Lib geht auch mit dem 162er. Einzig und allein müßte ganz
oben die Zeile mit 0x80,0x90 etc. auf 0x80, 0xC0 geändert werden fürs
162er. Auch unten in der lcd_init ändern. Dann tuts einwandfrei.

Ich hatte den Reset auf Masse gelegt. Darum gings nicht :) Es lebe
Kupferlackfädeldraht.

Viele Grüße,
Christoph

von Tobias Tetzlaff (Gast)


Lesenswert?

Hallo Christoph,

das ist ja mal eine tolle Resonanz, Danke dafür!

Gruß Toby

Ach ja, irgendwas stimmt noch nichzt mit der Zeilenhöhe bzw. den User
Chars.

Wenn man User Chars erstellen will, bin ich irgendwie in der falschen
Tabelle.
Dann muß ich erst von 3 auf 2 Zeilenbetrieb (DoubleHigh) umschalten,
und wieder zurück.
Dann gehts.

Vielleicht findest Du ja was raus.

Gruß nochmal!

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.