LCD 16x4 Initialisierungsproblem

Gast #729597
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
(Firma: ---) #729659
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
Gast #729663
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.
#729665
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
(Firma: ---) #729668
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);
}
Gast #729684
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);
Gast #729694
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?
Gast #729924
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)
Gast #729953
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).

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