www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD 16x4 Initialisierungsproblem


Autor: AndreasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void Enable(void)
{
  // Enable = HIGH
  // 1us warten
  // Enable = LOW
  EN = 1;
  delay_us(1);
  EN = 0;
  
}

void Init_LCD(void)
{
  // Port B initialisieren
  DDRB = 0x7F;
  PORTB = 0x00;
  // mind. 15ms warten damit der Controller initialisiert ist
  delay_ms(16);
  // 0x30 senden
  PORTB = 0x03;
  Enable();
  delay_ms(6);
  Enable();
  delay_us(300);
  Enable();
  // auf 4-Bit Modus umstellen
  PORTB = 0x02;
  Enable();
  delay_ms(5);
  // 2-Zeilen 5x8 Dot
  PORTB = 0x08;
  Enable();
  delay_us(50);
  // Clear Display
  PORTB = 0x00;
  Enable();
  PORTB = 0x01;
  Enable();
  delay_us(5);
  // Display an; Cursor an; Blinken an
  PORTB = 0x00;
  Enable();
  PORTB = 0x08;
  
}
Habe es auch schon mit dem Tutorial verglichen und kann keinen Fehler 
entdecken. Ich hoffe Ihr könnt mir helfen!
Vielen Dank

Autor: AndreasB (Gast)
Datum:

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

Autor: Ulrich M. (Firma: ---) (ulrich1267)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AndreasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ulrich M. (Firma: ---) (ulrich1267)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Ulrich M. (Firma: ---) (ulrich1267)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AndreasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe jetzt meine Funktion etwas überarbeitet aber Sie funktioniert 
noch immer nicht:
  // Port B initialisieren
  DDRB = 0x7F;
  PORTB = 0x00;
  // mind. 15ms warten damit der Controller initialisiert ist
  delay_ms(16);
  // 0x30 senden
  PORTB = 0x30;
  Enable();
  delay_ms(6);
  Enable();
  delay_us(300);
  Enable();
  delay_ms(50);
  // auf 4-Bit Modus umstellen
  PORTB = 0x20;
  Enable();
  delay_ms(5);
  // 2-Zeilen 5x8 Dot
  PORTB = 0x02;
  Enable();
  delay_ms(5);
  PORTB = 0x08;
  Enable();
  delay_us(50);
  // Clear Display
  PORTB = 0x00;
  Enable();
  delay_ms(5);
  PORTB = 0x01;
  Enable();
  delay_ms(50);
  // Display an; Cursor an; Blinken an
  PORTB = 0x00;
  Enable();
  delay_ms(5);
  PORTB = 0x08;
  Enable();
  delay_ms(50);

Autor: Ulrich M. (Firma: ---) (ulrich1267)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hör mal auf Peter,

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

Gruß
Uli

Autor: AndreasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Ulrich M. (Firma: ---) (ulrich1267)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: AndreasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus deinem eigenen Code:

> // 2-Zeilen 5x8 Dot

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

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.