Forum: Mikrocontroller und Digitale Elektronik DOGM LCD 3-Zeilen initialisieren


von Lokus P. (derschatten)


Lesenswert?

Ich bräuchte mal eure hilfe.
Ich möchte gerne ein DOGM 163 (3 Zeilig) für 5V im 4Bit-Modus 
initialisieren.

Bisher hatte ich mit einem 2Zeiligen keine Probleme. Das lief auf 
Anhieb.

Nur das 3Zeilige bekomme ich nicht hin.

Die Initialisierung läuft quasi soweit das ich eine Anzeige erhalte, nur 
wenn ich dann mit:
1
dogm_gotoxy(0,0);
2
dogm_puts("1 Zeile");
3
dogm_gotoxy(0,1);
4
dogm_puts("2 Zeile");
5
dogm_gotoxy(0,2);
6
dogm_puts("3 Zeile");

meine Zeilen fülle, schreibt er mir nur in die erste Zeile.

Die Initialisierung sieht so aus:
1
void dogm_init(void)
2
{
3
  dogm_port_init();            // initialize ports
4
5
  _delay_ms(10);              // 40ms delay
6
  dogm_write_once(0x30);          // Function Set #1: DL=1
7
  _delay_ms(0.5);              // 2ms delay
8
  dogm_write_once(0x30);          // Function Set #2: DL=1
9
10
  _delay_us(7.5);              // 30us delay
11
  dogm_write_once(0x30);          // Function Set #3: DL=1
12
  _delay_us(7.5);              // 30us delay
13
14
  dogm_chk_busy();            // Check busy flag
15
  dogm_write_once(0x20);          // Function Set #4: DL=0
16
  _delay_us(7.5);              // 30us delay
17
18
19
  dogm_write_check(0, 0x29);        // 4-Bit Datenlänge, 2 Zeilen, Instruction table 1
20
  _delay_us(7.5);              // 30us delay
21
22
  dogm_write_check(0, 0x1C);        // BS: 1/4, 3-zeiliges LCD
23
  _delay_us(7.5);              // 30us delay
24
25
  dogm_write_check(0, 0x51);        // Booster aus, Kontrast C5, C4 setzen
26
  _delay_us(7.5);              // 30us delay
27
28
  dogm_write_check(0, 0x6A);        // Spannungsfolger und Verstärkung setzen
29
  _delay_us(7.5);              // 30us delay
30
31
  dogm_write_check(0, 0x78);        // Kontrast C3, C2, C1 setzen
32
  _delay_us(7.5);              // 30us delay
33
34
  dogm_write_check(0, 0x0C);        // Display ein, Cursor aus, Cursor blinken aus
35
  _delay_us(7.5);              // 30us delay
36
37
  dogm_write_check(0, 0x01);        // Display löschen, Cursor Home
38
  _delay_ms(0.5);              // 2ms delay
39
40
  dogm_write_check(0, 0x06);        // Cursor Auto-Increment
41
  _delay_us(7.5);              // 30us delay
42
43
  dogm_write_check(0, 0x25);        // 4-Bit Datenlänge, 2 Zeilen, Instruction table 0
44
  _delay_us(7.5);              // 30us delay
45
}

Ich habe schon einige Beispiele hier aus dem Forum versucht, aber die 
zeigen mir alle nicht das gewünschte Ergebnis.

von spess53 (Gast)


Lesenswert?

Hi

>meine Zeilen fülle, schreibt er mir nur in die erste Zeile.

Die geänderten Zeilenanfänge  0x00, 0x10, 0x20 hast du beachtet?

MfG Spess

von Lokus P. (derschatten)


Lesenswert?

gute Frage,

gibt es diese Option bei den DOGM LCD überhaupt?
Das läuft doch ausschließlich über die Initialisierung oder?

von Karl H. (kbuchegg)


Lesenswert?

mach mal folgendes
1
  dogm_gotoxy( 0, 0 );
2
  dogm_puts( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" );

taucht irgendwas von dem Text in der 2. bzw. 3. Zeile auf?

von spess53 (Gast)


Lesenswert?

Hi

>gibt es diese Option bei den DOGM LCD überhaupt?
>Das läuft doch ausschließlich über die Initialisierung oder?

Das müssen die dogm_gotoxy-Routine angepasst werden.

MfG Spess

von Lokus P. (derschatten)


Lesenswert?

Karl Heinz schrieb:
> mach mal folgendes
>
1
>   dogm_gotoxy( 0, 0 );
2
>   dogm_puts( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" );
3
>
>
> taucht irgendwas von dem Text in der 2. bzw. 3. Zeile auf?

Das verhält sich recht seltsam.
Die erste Zeile wird normal ausgefüllt, die beiden weiteren Zeilen wird 
dann die Schrift doppelt groß.

Vielleicht liegt es wirklich an dem dogm_gotoxy

Das sieht momentan so aus:
1
void dogm_gotoxy(uint8_t x, uint8_t y)
2
{
3
  uint8_t addr;
4
5
  addr = (y * 0x40) + x;
6
  dogm_write_check(0, 0x80 | addr);
7
}

von Karl H. (kbuchegg)


Lesenswert?

Lokus Pokus schrieb:
> Karl Heinz schrieb:
>> mach mal folgendes

> Das verhält sich recht seltsam.
> Die erste Zeile wird normal ausgefüllt, die beiden weiteren Zeilen wird
> dann die Schrift doppelt groß.
>
> Vielleicht liegt es wirklich an dem dogm_gotoxy

der goto hat nix mit doppelt so hoher Schrift zu tun.

Aber hier in der Init
1
  dogm_write_check(0, 0x06);        // Cursor Auto-Increment
2
  _delay_us(7.5);              // 30us delay
3
4
  dogm_write_check(0, 0x25);        // 4-Bit Datenlänge, 2 Zeilen, Instruction table 0
5
  _delay_us(7.5);              // 30us delay
schaltest du zum SChluss auf dDouble Height und Instruction Table 1

Wie wärs, wenn du dich einfach mal an die Initalisierungssequenz im 
Datenblatt halten würdest, mit der einen Ausnahme, dass du den 4 Bit 
Modus nimmst anstelle des 8 Bit Modus?
Ich denke mal, für den allerersten Versuch macht man nicht viel 
verkehrt, wenn man die vom Hersteller veröffentlichte Version nimmt.
http://www.lcd-module.de/pdf/doma/dog-m.pdf

von WehOhWeh (Gast)


Lesenswert?

Ich habe das Display vor langer Zeit verwendet. Im Code mache ich das 
so:
1
int WriteToDisplay(char  *Text, short length, short line)
2
{
3
    if(length > 16){return(1);}
4
    int error = 0;
5
    int i = 0;
6
    // RS-Pin auf Einstellungen schreiben setzen
7
    oRS_PIN = 0;
8
    //Prüfe, auf welche Zeile geschrieben werden soll und setzt Adresse entsprechend
9
    if (line == 1)      {SPI_Write = 0x80;        __delay_us(100);    } // Setze Adresse auf Zeile 1 = 0x80 + 0x00
10
    else if (line == 2) {SPI_Write = 0x90;        __delay_us(100);    } // Setze Adresse auf Zeile 1 = 0x80 + 0x10
11
    else if (line == 3) {SPI_Write = 0xA0;        __delay_us(100);    } // Setze Adresse auf Zeile 1 = 0x80 + 0x20
12
    else{error=2;}
13
    while(SPI1STATbits.SPITBF){};
14
    // RS-Pin auf Daten schreiben setzen
15
    oRS_PIN = 1;
16
    __delay_us(30);     //execution time of display, see datasheet
17
18
    //Buchstaben aus übergebenem String schreiben
19
    for(i= 0; i<length; i++)
20
    {
21
        SPI_Write = *(Text+i);
22
        while(SPI1STATbits.SPITBF){};
23
        //__delay_us(70);
24
    }
25
    return error;
26
27
}

Das ist lang, lang her,
aber so wie ich das sehe muss man einen entsprechenden Offset auf die 
Addresse geben.

Das ist für ein DOGM mit Siltronics ST7036. Bei den DOG-Displays 
ignoriert man am besten das Datenblatt und schaut direkt, welcher 
Controller drin ist. Dann schaut man da drin nach.

Wenn die zweite und dritte Zeile zusammenfallen, ist vermutlich etwas in 
der Initroutine falsch. Man kann - glaube ich mich zu erinnern - mehrere 
Zeilen zu einer größeren Schrift zusammenfassen. Habs aber nie probiert.

von Lokus P. (derschatten)


Lesenswert?

> Wie wärs, wenn du dich einfach mal an die Initalisierungssequenz im
> Datenblatt halten würdest, mit der einen Ausnahme, dass du den 4 Bit
> Modus nimmst anstelle des 8 Bit Modus?
> Ich denke mal, für den allerersten Versuch macht man nicht viel
> verkehrt, wenn man die vom Hersteller veröffentlichte Version nimmt.
> http://www.lcd-module.de/pdf/doma/dog-m.pdf

Würd ich gerne, wenn ich da durchblicken würde.
Woran erkennst du das hier auf Double Height geschalten wird?

Und wie errechne ich mir den 4Bit Modus?

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Lokus Pokus schrieb:
>> Wie wärs, wenn du dich einfach mal an die Initalisierungssequenz im
>> Datenblatt halten würdest, mit der einen Ausnahme, dass du den 4 Bit
>> Modus nimmst anstelle des 8 Bit Modus?
>> Ich denke mal, für den allerersten Versuch macht man nicht viel
>> verkehrt, wenn man die vom Hersteller veröffentlichte Version nimmt.
>> http://www.lcd-module.de/pdf/doma/dog-m.pdf
>
> Würd ich gerne, wenn ich da durchblicken würde.
> Woran erkennst du das hier auf Double Height geschalten wird?

?
Ähm.
Indem ich ins Datenblatt geschaut habe?`

Da steht das Commando Function Set (Bild)

Wenn Bit 2 auf 1 ist, dann wird auf double Height geschaltet.

Wie lautet dein letztes Kommando in dier Initialisierung an das LCD?
1
  dogm_write_check(0, 0x25);        // 4-Bit Datenlänge, 2 Zeilen, Instruction table 0

Aha. Hex 25.
Mal in die Bits aufdröseln
1
  0x25
2
  +---+---+---+---+---+---+---+---+
3
  | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
4
  +---+---+---+---+---+---+---+---+

und da haben wirs schon
1
    Signatur für
2
    'Function Set'
3
   +--------+
4
   |        |
5
                DL  N  DH  IS2 IS1
6
  +---+---+---+---+---+---+---+---+
7
  | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
8
  +---+---+---+---+---+---+---+---+
9
                        ^
10
                     double
11
                     Height

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Lokus Pokus schrieb:

> Würd ich gerne, wenn ich da durchblicken würde.

?
Wo ist da jetzt das Problem.
Der Hersteller hat dir doch eh ein INitialisierungsbeispiel für 5V 
rausgegeben.
(Bild)
Er war sogar so freundlich, dir auch noch die Hex-Zahlen hinzuschreiben.

> Und wie errechne ich mir den 4Bit Modus?

Den hast du schon.
Hier am Anfang der Init
1
void dogm_init(void)
2
{
3
  dogm_port_init();            // initialize ports
4
5
  _delay_ms(10);              // 40ms delay
6
  dogm_write_once(0x30);          // Function Set #1: DL=1
7
  _delay_ms(0.5);              // 2ms delay
8
  dogm_write_once(0x30);          // Function Set #2: DL=1
9
10
  _delay_us(7.5);              // 30us delay
11
  dogm_write_once(0x30);          // Function Set #3: DL=1
12
  _delay_us(7.5);              // 30us delay
13
14
  dogm_chk_busy();            // Check busy flag
15
  dogm_write_once(0x20);          // Function Set #4: DL=0
16
  _delay_us(7.5);              // 30us delay
17
18
  dogm_write_check(0, 0x29);        // 4-Bit Datenlänge, 2 Zeilen, Instruction table 1
19
  _delay_us(7.5);              // 30us delay
ist bereits korrekt in den 4 Bit Modus geschaltet worden.
Wenn dem nicht so wäre, dann würde gar nichts gehen.

Diese Mehrfachsequenz ersetzt die erste Initialisierung aus dem 
Datenblatt. Anstatt der 0x39 sind es bei dir 0x29. Das eine Bit 
Unterschied
1
0x39
2
  +---+---+---+---+---+---+---+---+
3
  | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 |
4
  +---+---+---+---+---+---+---+---+
5
6
0x29
7
  +---+---+---+---+---+---+---+---+
8
  | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
9
  +---+---+---+---+---+---+---+---+

ist genau das eine Bit, welches im Function Set Kommando für die 
Unterscheidung 8-Bit/4-Bit steht.

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.