DOGM LCD 3-Zeilen initialisieren

#4029278
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.
#4030461
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
}
#4030494
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
Gast #4030495
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.
#4030533
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?
#4030553
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
Angehängte Dateien:
#4030563
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.
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