Forum: Mikrocontroller und Digitale Elektronik EA DOG-M 3,3V 4-Bit


von Jan (Gast)


Lesenswert?

Hallo, ich suche jetzt schon länger nach einer Initialisierung für ein 
EA DOGM162 für 4 Bit und 3,3V. Auf dem Datenblatt sind nur Beispiele für 
8Bit und im Netz hab ich nur Beispiele für 5V gefunden (welche auch 
funktionieren). Wäre für schnelle Hilfe dankbar

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Jan schrieb:
> Hallo, ich suche jetzt schon länger nach einer Initialisierung für ein
> EA DOGM162 für 4 Bit und 3,3V. Auf dem Datenblatt sind nur Beispiele für
> 8Bit und im Netz hab ich nur Beispiele für 5V gefunden (welche auch
> funktionieren). Wäre für schnelle Hilfe dankbar

Booster/"Electronic volume"-Teil des LCD-Controllers ist es egal, auf 
welchem Weg die Registerwerte eingestellt werden. Also Registerwerte zur 
Einstellung von Booster und Kontrast aus den Beispielen für 3,3V 8-Bit 
des Datenblatts entnehmen und über die 4-Bit Schnittstelle übertragen. 
Hatte "hier" zumindest problemlos funktioniert, allerdings mit 
serial-interface/SPI und nicht 4-Bit-Schnittstelle.

von Roman (Gast)


Lesenswert?

Was ist mit dem Beispiel aus dem Datenblatt des Kontrollers? Läuft das 
nicht?

http://www.lcd-module.de/eng/pdf/zubehoer/st7036.pdf

Seite 41 und 42

von Jan (Gast)


Lesenswert?

Ich glaube ich habe mein Fehler gefunden. Ich vermute es liegt an den 
Kondensatoren. Ich habe 2 Elkos mit je 1 uF. Muss ich anstatt Elkos 
Tantal-Kondensatoren nehmen?

von Falk B. (falk)


Lesenswert?

@Jan (Gast)

>Ich glaube ich habe mein Fehler gefunden. Ich vermute es liegt an den
>Kondensatoren. Ich habe 2 Elkos mit je 1 uF. Muss ich anstatt Elkos
>Tantal-Kondensatoren nehmen?

Nein. Aber die Polung muss man beachten.

MfG
Falk

von Jan (Gast)


Lesenswert?

ok die Pollung stimmt, dann muss es doch an der Initiallisierung liegen. 
hier kurz mal der Code dazu. Wenn ich das Datenblatt richtig verstanden 
habe müsste es so funktionieren. Vieleicht hab ich aber irgendwo was 
übersehen.
1
  _delay_ms(400);                       // 40ms delay
2
  dogm_write_once(0x30);                // Function Set #1: DL=1
3
  _delay_ms(2);                         // 2ms delay
4
  dogm_write_once(0x30);                // Function Set #2: DL=1
5
6
  _delay_us(30);                        // 30us delay
7
  dogm_write_once(0x30);                // Function Set #3: DL=1
8
  _delay_us(30);                        // 30us delay
9
10
  dogm_chk_busy();                      // Check busy flag
11
  dogm_write_once(0x20);                // Function Set #4: DL=0
12
13
  _delay_us(30);                        // 30us delay
14
  dogm_write_check(0, 0x29);            // Function Set #5: DL=0, N=1, IS2=0, IS1=1
15
  _delay_us(30);                        // 30us delay
16
17
  dogm_write_check(0, 0x14);            // Bias Set: BS=0, FX=0
18
  _delay_us(30);                        // 30us delay
19
20
  dogm_write_check(0, 0x78);            // Contrast Set: C3=1, C2=C1=C0=0
21
  _delay_us(30);                        // 30us delay
22
23
  dogm_write_check(0, 0x5E);            // Power/ICON/Contrast: Icon=1, Bon=1, C5=1, C4=0
24
  _delay_us(30);                        // 30us delay
25
26
  dogm_write_check(0, 0x6A);            // Follower Ctrl: Fon=1, Rab2=0, Rab1=1, Rab0=0
27
  _delay_us(30);                        // 30us delay
28
29
  dogm_write_check(0, 0x0C);            // DISPLAY ON: D=1, C=0, B=0
30
  _delay_us(30);                        // 30us delay
31
32
  dogm_write_check(0, 0x01);            // CLEAR DISPLAY
33
  _delay_ms(2);                         // 2ms delay
34
35
  dogm_write_check(0, 0x06);            // Entry mode set: I/D=1, S=0
36
  _delay_us(30);

von Roman (Gast)


Lesenswert?

Erhöhe mal die delays, vorallem die ersten beiden, und die 30us evtl mal 
auf 60us. Ich musste an den delays einiges schrauben, bis es 
funktionierte. Ich verwendete allerdings auch immer SPI. Ich fügte auch 
eine zusätzliche Sekunde Wartezeit am Anfang ein...

von Jan (Gast)


Lesenswert?

die Erhöhung der Delays hat leider auch nichts gebracht

von Christoph (Gast)


Lesenswert?

Läuft es bei dir mittlerweile? Habe nämlich auch immer noch Probleme mit 
der Initialisierung.

Grüße

von Jan (Gast)


Lesenswert?

nein leider nicht. ich werde mich mit dem Problem auch leider 
(vielleicht auch zum Glück) nicht weiter beschäftigen, da ich ein 
anderes Display nehmen werden.

von Enrock J. (Firma: studi) (enrock)


Lesenswert?

Servus,

also ich hatte keine Probleme das LCD im 4 Bit-Modus und 3,3 Volt ans 
laufen zu bringen. Programmiere allerdings in Assembler.
Auf Wunsch kann ich gerne mal meine Initialisierung posten!.

Gruß

von Jan (Gast)


Lesenswert?

immer her damit :-)

von Dennis (Gast)


Lesenswert?

Hallo,
versuche seit knapp 2 Tagen dieses Display mit 3,3V und 4Bit zum laufen 
zu bringen. Leider klappt das nicht wie gewünscht...
Kann mir vielleicht jemand mit Quellcode incl. h-Datei auf die Sprünge 
helfen?

Gruß

von Jörg S. (joerg-s)


Lesenswert?

2-Zeilen, 3,3V 4-Bit geschrieben für MSP430:
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
/*!
3
 * \brief LCD Display Dog-M initialisieren auf 3,3V 4-Bit Mode
4
 */
5
void init_LCD (void)
6
{
7
  LCD_SET_WRITE;              // RW auf low
8
  LCD_E_LOW;                  // E auf low
9
  LCD_SET_INSTRUCTION;        // RS auf low
10
11
  delay_ms(40);
12
  put_Data_to_Port(0x03);
13
  LCD_clock();
14
  delay_ms(2);
15
  put_Data_to_Port(0x03);
16
  LCD_clock();
17
  put_Data_to_Port(0x03);
18
  LCD_clock();
19
  put_Data_to_Port(0x02);
20
  LCD_clock();
21
22
  LCD_put_Data_out(FUNCTION_EXT_MODE);  // 8/4 Bit operation, 1/2 Zeilen
23
  LCD_put_Data_out(BIAS_SET);           // Bias
24
  LCD_put_Data_out(POWER_ICON);         // Booster Einstellung
25
  LCD_put_Data_out(FOLLOWER_CTRL);      // Follower Einstellung
26
  LCD_put_Data_out(CONTRAST_SET);       // Kontrast Einstellung
27
  LCD_put_Data_out(ENTRY_MODE_SET);     // Cursor inc. dec.
28
  LCD_put_Data_out(DISPLAY_ON);         // Display ein und Cursor ein/aus, Cursor blinken ein/aus
29
30
  LCD_clear();                          // Display löschen
31
}
32
///////////////////////////////////////////////////////////////////////////////////////////////////
33
34
///////////////////////////////////////////////////////////////////////////////////////////////////
35
/*!
36
 * \brief 1Byte Daten in 2*4Bit stuecken ausgeben
37
 * \param data 8Bit Daten
38
 */
39
void LCD_put_Data_out(unsigned char data)
40
{
41
  put_Data_to_Port(data>>4);            // Oberes Nibble
42
  LCD_clock();                          // Befehl ausfuehren
43
  put_Data_to_Port(data & 0x0F);        // Unteres Nibble
44
  LCD_clock();                          // Befehl ausfuehren
45
}
46
///////////////////////////////////////////////////////////////////////////////////////////////////
47
48
///////////////////////////////////////////////////////////////////////////////////////////////////
49
/*!
50
 * \brief Clock Pin (E) low->high->low damit Display Daten übernimmt
51
 */
52
void LCD_clock (void)
53
{
54
  delay(DELAY_30_US);         // 30µs warten
55
  LCD_E_HIGH;                 // Clock-Bit auf high
56
  delay(DELAY_SHORT);         // High muss min. 200ns anliegen
57
  LCD_E_LOW;                  // und jetzt auf low
58
}
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60
61
///////////////////////////////////////////////////////////////////////////////////////////////////
62
/* ST7036 Kommandos */
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64
#define CMD_CLEAR_DISPLAY     0x01  // Display Inhalt loeschen
65
#define ENTRY_MODE_SET        0x06  // Coursor automatisch erhoehen
66
#define DISPLAY_ON            0x0C  // Display ein, kein Cursor, kein blinken
67
//#define DISPLAY_ON            0x0F  // Display ein, Cursor, Cursor blinken
68
#define FUNCTION_EXT_MODE     0x29  // 4 Bit Mode, 2 Zeilen, Instruction Set (IS2:1)=[0,1]
69
#define FUNCTION_NORM_MODE    0x28  // 4 Bit Mode, 2 Zeilen, Instruction Set (IS2:1)=[0,0]
70
//#define FUNCTION_EXT_MODE     0x39  // 8 Bit Mode, 2 Zeilen, Instruction Set (IS2:1)=[0,1]
71
//#define FUNCTION_NORM_MODE    0x38  // 8 Bit Mode, 2 Zeilen, Instruction Set (IS2:1)=[0,0]
72
#define BIAS_SET              0x14  // 1/5 bias
73
#define POWER_ICON            0x55  // Booster an, C4 an
74
#define FOLLOWER_CTRL         0x6D  // Follower an, Verstaerker mit Rab2/Rab0
75
#define CONTRAST_SET          0x75  // Kontrast
76
#define CGRAM_START_ADD       0x40  // Startadresse fuer selbstdefinierte Zeichen
77
78
#define CURSOR_ON             0x0E//0x0F
79
#define CURSOR_OFF            0x0C
80
///////////////////////////////////////////////////////////////////////////////////////////////////

von Dennis (Gast)


Lesenswert?

Danke für die Antwort.
Wenn ich das richtig sehe ist das zunächst nur die Initialisierung?
Nun müßte ich ja noch Text anzeigen um zu prüfen ob es erfolgreich war. 
Wie tue ich das dann?

von Jörg S. (joerg-s)


Lesenswert?

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
/*!
3
 * \brief String an Display senden
4
 * \param string Datenstring
5
 */
6
void LCD_out_string (char *string)
7
{
8
  LCD_SET_DATA;               // RS auf high (Daten)
9
10
  while (*string != 0) LCD_out_char(*string++);
11
}
12
///////////////////////////////////////////////////////////////////////////////////////////////////
13
14
///////////////////////////////////////////////////////////////////////////////////////////////////
15
/*!
16
 * \brief Char an Display senden
17
 * \param str Einzellnes Char
18
 */
19
void LCD_out_char (char str)
20
{
21
  LCD_SET_DATA;               // RS auf high (Daten)
22
23
  if (str == 0xE4) str = 0x84;// Wenn "ä" geschrieben werden soll, Zeichensatz von LCD benutzen
24
  if (str == 0xF6) str = 0x94;// Wenn "ö" geschrieben werden soll, Zeichensatz von LCD benutzen
25
  if (str == 0xFC) str = 0x81;// Wenn "ü" geschrieben werden soll, Zeichensatz von LCD benutzen
26
  if (str == 0xC4) str = 0x8E;// Wenn "Ä" geschrieben werden soll, Zeichensatz von LCD benutzen
27
  if (str == 0xD6) str = 0x99;// Wenn "Ö" geschrieben werden soll, Zeichensatz von LCD benutzen
28
  if (str == 0xDC) str = 0x9A;// Wenn "Ü" geschrieben werden soll, Zeichensatz von LCD benutzen
29
30
  if (str == 0xB0) str = 0xDF;// Wenn "°" geschrieben werden soll, Zeichensatz von LCD benutzen
31
32
  LCD_put_Data_out(str);      // Char einfach auf Port legen
33
}
34
///////////////////////////////////////////////////////////////////////////////////////////////////

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.