Forum: Mikrocontroller und Digitale Elektronik LCD 16x4 Initialisierungsproblem


von AndreasB (Gast)


Lesenswert?

Hallo,

iche ersuche gerade verzweifelt mein LCD von Reichelt Displaytech 164A 
im 4-Bit-Modus zu initialisieren. Ich habe mich so gut es ging an das 
Datenblatt gehalten. folgender Anschlussplan:
PB0-->DB4
PB1-->DB5
PB2-->DB6
PB3-->DB7
PB4-->RS
PB5-->R/W
PB6-->EN

Code:
1
void Enable(void)
2
{
3
  // Enable = HIGH
4
  // 1us warten
5
  // Enable = LOW
6
  EN = 1;
7
  delay_us(1);
8
  EN = 0;
9
  
10
}
11
12
void Init_LCD(void)
13
{
14
  // Port B initialisieren
15
  DDRB = 0x7F;
16
  PORTB = 0x00;
17
  // mind. 15ms warten damit der Controller initialisiert ist
18
  delay_ms(16);
19
  // 0x30 senden
20
  PORTB = 0x03;
21
  Enable();
22
  delay_ms(6);
23
  Enable();
24
  delay_us(300);
25
  Enable();
26
  // auf 4-Bit Modus umstellen
27
  PORTB = 0x02;
28
  Enable();
29
  delay_ms(5);
30
  // 2-Zeilen 5x8 Dot
31
  PORTB = 0x08;
32
  Enable();
33
  delay_us(50);
34
  // Clear Display
35
  PORTB = 0x00;
36
  Enable();
37
  PORTB = 0x01;
38
  Enable();
39
  delay_us(5);
40
  // Display an; Cursor an; Blinken an
41
  PORTB = 0x00;
42
  Enable();
43
  PORTB = 0x08;
44
  
45
}
Habe es auch schon mit dem Tutorial verglichen und kann keinen Fehler 
entdecken. Ich hoffe Ihr könnt mir helfen!
Vielen Dank

von AndreasB (Gast)


Lesenswert?

ich habe noch immer keine Lösung finden können ist denn hier niemand der 
mir helfen kann?

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Hi! ich weiß nicht was für ein Display das ist. Ich hatte aber mal ein 
Problem mit einem 16x2 Display von Cxxxxd und dachte auch es ist defekt 
oder die Initialisierung stimmt nicht. Was war's zum Schluß? der 
Kontrasteingang des Displays. Diesen hatte ich auf GND oder +5V (weiß 
nicht mehr genau). Der Effekt: Das Display war korrekt initialisiert und 
hat auch alle Zeichen angezeigt, aber eben mit Kontrast=0. D.h. du 
siehst NICHTS! Könnte bei Dir auch so sein. In dem Fall steuere den 
Kontrasteingang einfach über ein Poti an und schon geht's. Nur ne Idee

von Karl H. (kbuchegg)


Lesenswert?

Die pragmatiche Lösung.
Hol dir die LCD Library von Peter Fleury.
Konfigurier das Header File und wenn du keinen
Hardware Fehler hast, dann läuft das Ding.

von AndreasB (Gast)


Lesenswert?

Kontrast ist OK das Display funktioniert auch mit den Standard Routinen 
vom Codevision. Ich möchte es jedoch mit meinen eigenen Routinen zum 
Laufen bekommen. Also ich weiß dass der Kontrast richtig eingestellt ist 
und das Display funktioniert jedoch gibt es irgendwo in meiner Routine 
ein Problem.

von Peter D. (peda)


Lesenswert?

Da fehlt an mehreren Stellen das wait hinter enable und zum Schluß fehlt 
sogar das enable.

Und nach dem Schalten in den 4Bit Modus mußt Du auch jedesmal 2 Nibble 
senden.
Das fehlt aber schon beim "2-Zeilen 5x8 Dot" setzen.

Kein Wunder, daß Du voll ausm Tritt bist.


Peter

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Also, so habe ich das Display initialisiert, weiß aber noch nicht mal ob 
es der gleich Controller ist, aber vielleicht hilft es dir ja:

#define WARTEN_INIT                 500

void LCDClock(void)
{
  wait(WARTEN_CLOCK);
  LCD_STRLTG|=LCD_ENABLE;            // clock-bit erst mal 
sicherheitshalber auf high
  wait(WARTEN_CLOCK);
  LCD_STRLTG&=~LCD_ENABLE;           // und jetzt auf low. Mit der 
fallenden Flanke werden die Daten vom Display übrenommen.
  LCD_STRLTG=0;                      // Grundzustand
  wait(WARTEN_CLOCK);
}

void LCDInit(void)
{
  wait(WARTEN_INIT);
  LCD_STRLTG = 0;
  LCD_DBS = FKT_INIT;
//  LCD_DBS = 0x30;
  LCDClock();
  wait(WARTEN_INIT);
  LCD_STRLTG = 0;
  LCD_DBS = FKT_INIT;
//  LCD_DBS = 0x30;
  LCDClock();
  wait(WARTEN_INIT);
  LCD_STRLTG = 0;
  LCD_DBS = FKT_INIT;
//  LCD_DBS = 0x30;
  LCDClock();
  wait(WARTEN_INIT);
  //Zeilen & Zeichensatz
  LCD_STRLTG = 0;
  LCD_DBS = FKT_SET|DL_8_BIT|N_2_ZEILEN|F_5_X_10_ZEICHEN_FONT;
  //LCD_DBS = 0x38;//0x38;
  LCDClock();
  wait(WARTEN_INIT);
  //Display ein
  LCD_STRLTG = 0;
  LCD_DBS = FKT_ON_OFF|DISPLAY_EIN;//|CURSOR_SICHTBAR|CURSOR_BLINKT;
//  LCD_DBS = 0x3C;
  LCDClock();
  wait(WARTEN_INIT);
  //Display löschen
  LCD_STRLTG = 0;
  LCD_DBS = FKT_CLEAR_DISPLAY;
//  LCD_DBS = 0x01;
  LCDClock();
  wait(WARTEN_INIT);
  //Entry mode
  LCD_STRLTG = 0;
  LCD_DBS = FKT_ENTRY_MODE|DISPLAYINHALT_SCHIEBEN;
//  LCD_DBS = 0x06;
  LCDClock();
  wait(WARTEN_INIT);
}

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Vergessen:

#define FKT_CLEAR_DISPLAY           1
#define FKT_RETURN_HOME             2
#define FKT_ENTRY_MODE              4
#define FKT_ON_OFF                  8
#define FKT_SHIFT                   16
#define FKT_SET                     32
#define FKT_INIT                    0x30

von AndreasB (Gast)


Lesenswert?

So habe jetzt meine Funktion etwas überarbeitet aber Sie funktioniert 
noch immer nicht:
1
  // Port B initialisieren
2
  DDRB = 0x7F;
3
  PORTB = 0x00;
4
  // mind. 15ms warten damit der Controller initialisiert ist
5
  delay_ms(16);
6
  // 0x30 senden
7
  PORTB = 0x30;
8
  Enable();
9
  delay_ms(6);
10
  Enable();
11
  delay_us(300);
12
  Enable();
13
  delay_ms(50);
14
  // auf 4-Bit Modus umstellen
15
  PORTB = 0x20;
16
  Enable();
17
  delay_ms(5);
18
  // 2-Zeilen 5x8 Dot
19
  PORTB = 0x02;
20
  Enable();
21
  delay_ms(5);
22
  PORTB = 0x08;
23
  Enable();
24
  delay_us(50);
25
  // Clear Display
26
  PORTB = 0x00;
27
  Enable();
28
  delay_ms(5);
29
  PORTB = 0x01;
30
  Enable();
31
  delay_ms(50);
32
  // Display an; Cursor an; Blinken an
33
  PORTB = 0x00;
34
  Enable();
35
  delay_ms(5);
36
  PORTB = 0x08;
37
  Enable();
38
  delay_ms(50);

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Hör mal auf Peter,

Hi Nibble und Low Nibble senden... Das könnte es doch sein!

Gruß
Uli

von AndreasB (Gast)


Lesenswert?

Mache ich nicht genau das?

  // 2-Zeilen 5x8 Dot
  // High Nibble
  PORTB = 0x02;
  Enable();
  delay_ms(5);
  // Low Nibble
  PORTB = 0x08;
  Enable();
  delay_us(50);

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Ja, scheint so. Ich hatte keine Lust Deinen Code auseindanderzupulen. 
Ich kenne den Controller nicht. ist die Reihenfolge auch OK? Little- 
oder big-endian? Sorriy, dass hast Du bestimmt geprüft, aber ich kenne 
das. Manchmal ist man Betriebsblind ;-)

von AndreasB (Gast)


Lesenswert?

Ja die Reihenfolge ist OK. Jetzt blinkt schonmal der Cursor aber 
irgendwie ist nur die erste und die dritte Zeile sichtbar die zweite und 
vierte nicht! hast du vielleicht dafür noch eine Idee?

von Niels H. (monarch35)


Lesenswert?

Aus deinem eigenen Code:

> // 2-Zeilen 5x8 Dot

Was sagt dir das? Ist es nicht logisch, das nur 2 Zeilen sichtbar sind?

von klaus (Gast)


Lesenswert?

hi,

versuch mal, eine Zeile gaaaanz lang zu beschreiben (ich meine 128 
zeichen, nicht 2 stunden). Manchmal beginnt die 2.te zeile nicht direkt 
an der 17.ten Stelle sondern später (z.B. an der 64.ten)
Oder hat das Display vielleicht 2 Controller? Dann müsste eine 2.te 
Enable-Leitung vorhanden sein.
Ausserdem darf man (soweit ich weiss) bei den ersten paar Init-bytes 
kein Hi- und Low-Nibble schicken sondern nur ein einziges. (Habe den 
Code aber nicht gelesen, fiel mir nur gerade so ein)

von jack (Gast)


Lesenswert?

>Aus deinem eigenen Code:

>> // 2-Zeilen 5x8 Dot

>Was sagt dir das? Ist es nicht logisch, das nur 2 Zeilen sichtbar sind?

Eben nicht. Das Display kann nur 1- oder 2-zeilig initialisiert werden,
wobei 1. und 3. eine Zeile sind (80 bis 9F), 2. und 4. auch eine
(C0 bis BF).

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.