Forum: Mikrocontroller und Digitale Elektronik Initialisierung LCD EA DOG-M 162 3,3V 8 Bit


von Philipp S. (philipp-s)


Lesenswert?

Hallo,

Habe schon das halbe Forum durchsucht - aber ohne Erfolg!

Problem:
Ich möchte ein EA DOG-M 162 LCD-Display an 3,3V mit 8 Bit Datenbus 
betreiben.
µC: ATmega32 mit 6 MHz (auch schon mit 1 MHz versucht)
E,RS,RW an Port B (Pin 0 1 2)
Daten an Port C (8 Bit)
RST,PSB,VIN fest an +3,3V
CS fest an GND

Als Kondensatoren verwende ich:
- 1u Tantal an VIN und VOUT(+)
- 470n Tantal an CAPN und CAPP(+)

Alles durchgemessen - Kontakte zu ATmega sind OK

Studio und Compiler:
AVRStudio 4 B471 und die neue B5xx, WinAVR2007 und 2006 schon probiert.

Habe die Initialisierungsmethoden nach dem Datenblatt des EA DOG-M und 
nach dem des Controllers ST7036 (mit Beispielcode 8 Bit und 4 Bit) 
erfolglos durchgeführt [und auch diverse andere Methoden aus dem Forum].
Ich warte 50ms und dann schreibe ich die Daten 0x39 0x39 0x14 usw. wie 
in den Datenblättern. Frage: Müssen die ersten beiden 0x39 als 
4-Bit-Nibble gesendet werden, oder kann ich da schon die vollen 8 Bit 
nutzen?
Auch längeres Warten bringt nichts!

Ich messe an: (bei VDD=3,3V)
CAP1N etwa 0 Volt
CAP1P etwa 3 Volt
VOUT etwa 3 Volt
Der Spannungs-Booster funktioniert einfach nicht! Wahrscheinlich ist es 
ein Problem der Initialisierung. Aber wie kann ich sicher sein, dass das 
Display keinen Schaden hat?
Kann das auch ein Problem des RESET sein? Ist ja fest mit 3,3V 
verbunden.

Sind die Werte der Kondensatoren OK?

Bei den durchgeführten Initialisierungen (die ja nicht funktionierten) 
frage ich das Busy-Bit ab - teilweise funktioniert die Abfrage - 
teilweise bleibt er dort hängen. Wenn ich dann mit dem Oszi Tastkopf an 
das RS-Pin tipp, läuft er weiter im Code. Was soll das?

Vielen Dank für Eure Hilfe!
Philipp

PS: Gestern habe ich hier im Forum ein erstes Problem gefunden: Ich 
hatte den JTAG noch aktiv, sodass der Port C gar nicht funktionieren 
konnte. Jetzt ist das aber abgeschaltet - und funktioniert immer noch 
nicht. Kann das Display Schaden genommen haben?

von Ale (Gast)


Lesenswert?

Ich hatte auch probleme mit JTAG und ein LCD, aber hat nach gekalpt 
(nach ich habe die JTAG deaktiviert).

Gibt ein Paar Display dass die 4 bit modus magen gar nicht (ich habe ein 
2x20, est ist langsam und geht nur im 8 bit mode).

Im Datenblatt sagt das Reset kann nach VDD fixirt sein, und dann Interes 
POR geht.

Versucht mit:

Warten > 32 ms
Schreibern 0x38:

E = 0, RS = 0, RW = 1
CS = 0
E = 0, RS = 0, RW = 0
Data im PORTC schreiben
E = 1
nop
E = 0, RS = x, RW = 1

4 ms warten

nochmal

So muss gehen, und 2 Zeihle mode aktiviern.


von Hoppla (Gast)


Lesenswert?

Wie währe es mal mit Deutsch lernen??

von Philipp S. (philipp-s)


Lesenswert?

@Ale:
E = 0, RS = 0, RW = 1
CS = 0
E = 0, RS = 0, RW = 0

Sollte das nicht heißen:
CS = 0
RW = 0, RS = 0, E = 1
Daten senden: z.B.: PORTC = 0x38;
RW = 0, RS = 0, E = 0
usw.

Wird dieser erste Init-Befehl schon als 8 Bit gesendet oder besteht er 
aus zwei Nibble ?


@Hoppla:
Bitte hier keine Anfeindungen! "Wäre" wird ohne "h" geschrieben.

von Ale (Gast)


Lesenswert?

Alees als 8 bit, so nur 1 Byte senden, nicht als 2 Nibblen.



@Happla:


Wie wäre es mal mit Deutsch lernen??

Ich sag es auch !?

währe es ist ein ganz andere Tier !


(nicht gesehen, daß Philipp schon geantwortet hat )


von Oha! (Gast)


Lesenswert?

Ich hatte auch probleme mit JTAG und ein LCD, aber hat nach gekalpt
(nach ich habe die JTAG deaktiviert).

Gibt ein Paar Display dass die 4 bit modus magen gar nicht (ich habe ein
2x20, est ist langsam und geht nur im 8 bit mode).

Im Datenblatt sagt das Reset kann nach VDD fixirt sein, und dann Interes
POR geht.

So muss gehen, und 2 Zeihle mode aktiviern.

Was is das für Sprak????????

von Oha! (Gast)


Lesenswert?

Mudu Deutschbuk kaufen, hat mir auch gehelft.

von A.K. (Gast)


Lesenswert?

Leute, was soll das?

Zwar pflegt hier auch mancher mit Deutsch als Muttersprache seine höchst 
eigene Rechtschreibung, aber wer Deutsch nicht mit der Muttermilch 
aufgesogen hat, dem sollte es vergönnt sein, Fehler machen zu dürfen, 
ohne gleich angegiftet zu werden.

von Ale (Gast)


Lesenswert?

@ Oha!:

Du hast nicht versucht Philipp zu helfen, oder Zeit zu helfen, aber du 
hast Zeit zu sagen, Hei dein Deutsch zu schlecht ist!, Denk zuerst, 
schreib nach (oder besser: nichts).
Ich habe nicht viel Zeit aber ich versuch zu helfen, wenn ich glaube ich 
kann.
Vielleicht du hast genug Zeit (auch) zu sagen was (ich) jede hat falsch 
gescrieben und warum. Das wurde viel mehr helfen !


@A.K. Du hast recht.

von Philipp S. (philipp-s)


Lesenswert?

Hallo, hier mal der C-Code:
1
void LCD_Init(void)
2
{
3
  unsigned char i;
4
5
  LCD_DDR = LCD_DataOut;  // LCD-Port == Output
6
  // ein paar Befehle schicken (Datenblatt EA-DOG-M) ...
7
  LCD_CTRL &= ~(_BV(LCD_RS) | _BV(LCD_RW) | _BV(LCD_E));
8
  _delay_ms(40);
9
10
  LCD_CTRL |= _BV(LCD_E);
11
  LCD_PORT = 0x39;  // 8 bit, 2 Zeilen, Instruction table == 1
12
  _delay_us(5);  
13
  LCD_CTRL &= ~_BV(LCD_E);
14
  _delay_ms(5);
15
16
  LCD_CTRL |= _BV(LCD_E);
17
  LCD_PORT = 0x39;  // 8 bit, 2 Zeilen, Instruction table == 1
18
  _delay_us(5);  
19
  LCD_CTRL &= ~_BV(LCD_E);
20
  _delay_us(30);  
21
22
  Write_LCD(0x14,0);  // Bias set
23
  _delay_us(30);  
24
  Write_LCD(0x78,0);  // Kontrast
25
  _delay_us(30);  
26
  Write_LCD(0x55,0);  // Booster ein + Kontrast
27
  _delay_us(30);  
28
  Write_LCD(0x6d,0);  // Spannungsfolger + Verstärkung
29
  _delay_us(30);  
30
  Write_LCD(0x0f,0);  // Display ein + Cursor blinken
31
  _delay_us(30);  
32
  Write_LCD(0x01,0);  // Clear Display
33
  _delay_us(30);  
34
  Write_LCD(0x06,0);  // Auto Cursor increment
35
  _delay_us(30);  
36
}
37
38
// LCD: ein Byte schreiben
39
void Write_LCD(char Data, unsigned char datenreg)
40
{
41
  while(Read_LCD()&_BV(BusyBit))  // Wartet bis LCD wieder bereit
42
    ;
43
44
  LCD_DDR = LCD_DataOut;      // LCD-Port == AUSGANG
45
  LCD_CTRL &= ~_BV(LCD_RW);    // Schreibsignal  (RW == 0)
46
  if(datenreg)          // Soll ins Seuer- oder Datenregister geschrieben werden?
47
    LCD_CTRL |= _BV(LCD_RS);  // Dataregister   (RS == 1)
48
  else
49
    LCD_CTRL &= ~_BV(LCD_RS);  // Steuerregister (RS == 0)
50
51
  LCD_CTRL |= _BV(LCD_E);
52
  LCD_PORT = Data;
53
  _delay_us(5);  
54
  LCD_CTRL &= ~_BV(LCD_E);
55
}
56
57
// LCD: ein Byte lesen
58
unsigned char Read_LCD(void)
59
{
60
  unsigned char Data;
61
  
62
  LCD_DDR = LCD_DataIn;    // LCD-Port == EINGANG
63
  LCD_CTRL &= ~_BV(LCD_RS);   // RS == 0
64
  LCD_CTRL |= _BV(LCD_RW);   // Lesesignal (RW == 1)
65
66
  LCD_CTRL |= _BV(LCD_E);    // set
67
  _delay_us(100);  
68
  Data = LCD_IN;      // ... lesen ... 
69
  LCD_CTRL &= ~_BV(LCD_E);  // clear  
70
    
71
  return(Data);
72
}

Initialisierung funktioniert nicht!
Kann mir jemand sagen, ob da ein Fehler zu erkennen ist?

von Philipp S. (philipp-s)


Lesenswert?

Problem gelöst!

Bei der Initialisierung des Ports war ein Fehler. Also nicht im obigen 
Code. Jetzt funktioniert es!

Euch allen einen Guten Rutsch ins neue Jahr!

Philipp

von Christian S. (csiebert)


Lesenswert?

Hi

Ist ja schon ne Weile her seit dem letzten Beitrag hier.

Muss ich das Display auf 3,3V geregelt halten oder läuft das auch 
problemlos bei 3,8V oder gar 4V.

Im Datenblatt steht unter Versorgungsspannung 3.3...5V. Das würde ich 
als 3.3V bis 5V interpretieren. Weiter oben steht jedoch "3.3V oder 5V".


Gruß,
Christian

von Hartwig W. (hartwig)


Lesenswert?

Philipp S. schrieb:
> Problem gelöst!
>
> Bei der Initialisierung des Ports war ein Fehler. Also nicht im obigen
> Code. Jetzt funktioniert es!
>
> Euch allen einen Guten Rutsch ins neue Jahr!
>
> Philipp

Hallo Philipp,
der Thread ist zwar 4 Jahre alt, aber vielleicht gibt's Dich noch. Was 
war denn jetzt eigentlich genau der Fehler? Ich versuche genau dasselbe, 
8-bit Mode bei 3.3V und das dogm nimmt einfach keine Befehle an. Erst 
wenn ich die Betriebsspannung auf mindestens 4V anhebe, kann ich es 
initialisieren, also für den 3.3V Betrieb konfigurieren, darunter tut 
sich gar nichts.
Hast Du noch die Unterlagen zu diesem Projekt?
Bin für jede Hilfe dankbar!
Viele Grüße,
Hartwig

von Philipp S. (philipp-s)


Lesenswert?

Hallo Hartwig,

Ist schon eine ganze Weile her. Das Projekt ist (wie viele andere auch) 
nicht fertig geworden. Ist eben nur ein Hobby...

Ich gehe mal davon aus, dass Du die Hardware-Beschaltung, wie im Manual 
des DOG-M beschrieben, realisiert hast. Also sollte es "nur" an der 
Software liegen...

Wenn ich mich recht erinnere, dann hatte ich einen Pin nicht korrekt als 
Ausgang konfiguriert - war ein Eingang mit PullUp. Trivial
Den C-Code fürs Init kann ich hier posten. Das dauert aber noch bis 
Montag - ich bin z.Z. nicht an dem PC mit den Projektdaten.

Grüße, Philipp

von Hartwig W. (hartwig)


Lesenswert?

Philipp S. schrieb:
> Hallo Hartwig,
>
> Ist schon eine ganze Weile her. Das Projekt ist (wie viele andere auch)
> nicht fertig geworden. Ist eben nur ein Hobby...
>
> Ich gehe mal davon aus, dass Du die Hardware-Beschaltung, wie im Manual
> des DOG-M beschrieben, realisiert hast. Also sollte es "nur" an der
> Software liegen...
>
> Wenn ich mich recht erinnere, dann hatte ich einen Pin nicht korrekt als
> Ausgang konfiguriert - war ein Eingang mit PullUp. Trivial
> Den C-Code fürs Init kann ich hier posten. Das dauert aber noch bis
> Montag - ich bin z.Z. nicht an dem PC mit den Projektdaten.
>
> Grüße, Philipp

Super, das wär klasse! Freu' mich drauf. Danke!

von Sesk K. (zeborok)


Lesenswert?

Hast du den Voltage-Boost usw. alles korrekt initialisiert?

Gruß

von Hartwig W. (hartwig)


Lesenswert?

Se Sk. schrieb:
> Hast du den Voltage-Boost usw. alles korrekt initialisiert?
>
> Gruß

Also meine Beobachtungen bisher sind wie folgt:

Es scheint, dass das dogm keine Kommandos annimmt, wenn die 
Betriebsspannung unter 4V liegt. Insofern kann ich unter 3.3V das Modul 
nicht initialisieren.

Also habe ich testweise einen Wechselschalter für seine Betriebsspannung 
eingebaut, und mal zum Initialisieren 5V spendiert und nach dessen 
erfolgreichem Ablauf auf 3.3V umgeschaltet, mit dem Ergebnis:
Das Initialiseren unter 5V funktioniert, Booster und Follower sind 
aktiv.
Jedoch nimmt das Modul unter 3.3V keine weiteren Kommandos an. Wenn ich 
die Betriebsspannung langsam auf 4V oder mehr erhöhe, geht's plötzlich 
wieder.
Das ist beliebig oft reproduzierbar.

Das Modul ist übrigens in Ordnung, habe dasselbe Verhalten auf zwei 
weiteren Modulen nachvollzogen.

Gruß,
Hartwig

von Philipp S. (philipp-s)


Lesenswert?

Hallo,

Deine Beschaltung des Moduls (zusätzliche Kapazitäten für die 
Ladungspumpe bei 3,3V) stimmt auch mit der von Seite 4 aus
http://www.lcd-module.de/deu/pdf/doma/dog-m.pdf
überein?

Philipp

von Hartwig W. (hartwig)


Lesenswert?

Philipp S. schrieb:
> Hallo,
>
> Deine Beschaltung des Moduls (zusätzliche Kapazitäten für die
> Ladungspumpe bei 3,3V) stimmt auch mit der von Seite 4 aus
> http://www.lcd-module.de/deu/pdf/doma/dog-m.pdf
> überein?
>
> Philipp

Jawohl. Das habe ich gefühlte 1000x überprüft :-)

von spess53 (Gast)


Lesenswert?

Hi

>Jawohl. Das habe ich gefühlte 1000x überprüft :-)

Auch die richtigen Kondensatoren benutzt?

MfG Spess

von Hartwig W. (hartwig)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Jawohl. Das habe ich gefühlte 1000x überprüft :-)
>
> Auch die richtigen Kondensatoren benutzt?
>
> MfG Spess

Ich habe verschiedene Werte durchprobiert. CAP1 von 0.1u bis 1u und den 
anderen von 0.47u bis 2.2u. Überall dasselbe Verhalten.

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe verschiedene Werte durchprobiert.

Nicht die Werte. Es sollten Keramik-Cs sein (Aussage von EA).

MfG Spess

von Hartwig W. (hartwig)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Ich habe verschiedene Werte durchprobiert.
>
> Nicht die Werte. Es sollten Keramik-Cs sein (Aussage von EA).
>
> MfG Spess

Auch da habe ich Keramik, Elko und Tantal probiert. Momentan habe ich 
Keramik drin, jeweils 1uF.

von Philipp S. (philipp-s)


Lesenswert?

Hallo Hartwig,

Hier also der letzte Stand des C-Codes:
1
void LCD_Init(void)
2
{
3
  unsigned char i;
4
5
  LCD_DDR = LCD_DataOut;      // LCD-Port == Output
6
  LCD_CTRL &= ~(_BV(LCD_RS) | _BV(LCD_RW) | _BV(LCD_E));
7
  _delay_ms(25);
8
  _delay_ms(25);
9
10
  // ein paar Befehle schicken (Datenblatt EA-DOG-M) ...
11
  LCD_PORT = 0x38;  // 8 bit, 2 Zeilen, Instruction table == 0
12
  LCD_CTRL |= _BV(LCD_E);
13
  LCD_CTRL &= ~_BV(LCD_E);
14
  _delay_us(30);
15
16
  LCD_PORT = 0x39;  // 8 bit, 2 Zeilen, Instruction table == 1
17
  LCD_CTRL |= _BV(LCD_E);
18
  LCD_CTRL &= ~_BV(LCD_E);
19
  _delay_us(30);  
20
21
  Write_LCD(0x14,0);  // Bias
22
  _delay_us(30);
23
  Write_LCD(0x55,0);  // Booster ein + Kontrast
24
  _delay_us(30);
25
  Write_LCD(0x6d,0);  // Spannungsfolger + Verstärkung
26
  _delay_us(30);
27
28
  Write_LCD(0x78,0);  // Kontrast
29
  _delay_us(30);
30
  Write_LCD(0x0c,0);  // Display ein + Cursor blinken
31
  _delay_us(30);
32
  Write_LCD(0x01,0);  // Clear Display
33
  _delay_ms(2);
34
  Write_LCD(0x06,0);  // Auto Cursor increment
35
  _delay_us(30);
36
}
37
38
// LCD: ein Byte schreiben
39
void Write_LCD(char Data, unsigned char datenreg)
40
{
41
  while(Read_LCD() & _BV(BusyBit))// Wartet bis LCD bereit
42
    ;
43
44
  LCD_DDR = LCD_DataOut;      // LCD-Port == AUSGANG
45
  LCD_CTRL &= ~_BV(LCD_RW);    // Schreibsignal  (RW == 0)
46
  if(datenreg)        // Soll ins Seuer- oder Datenregister geschrieben werden?
47
    LCD_CTRL |= _BV(LCD_RS);  // Dataregister   (RS == 1)
48
  else
49
    LCD_CTRL &= ~_BV(LCD_RS);  // Steuerregister (RS == 0)
50
51
  LCD_PORT = Data;
52
  LCD_CTRL |= _BV(LCD_E);
53
  _delay_us(30);
54
  LCD_CTRL &= ~_BV(LCD_E);
55
}
56
57
// LCD: ein Byte lesen
58
unsigned char Read_LCD(void)
59
{
60
  unsigned char Data = 0xff;
61
  
62
  LCD_DDR = LCD_DataIn;    // LCD-Port == EINGANG
63
  LCD_PORT = 0xff;    // Pull-Ups !!
64
  LCD_CTRL |= _BV(LCD_RW);   // Lesesignal (RW == 1)
65
  LCD_CTRL &= ~_BV(LCD_RS);   // RS == 0
66
67
  LCD_CTRL |= _BV(LCD_E);    // set
68
  _delay_us(30);
69
  Data = LCD_IN;      // ... lesen ... 
70
  LCD_CTRL &= ~_BV(LCD_E);  // clear  
71
    
72
  return(Data);
73
}

Die dazugehörigen Definitionen sind natürlich von Deiner Hardware 
abhängig. Bei mir sieht's so aus:
1
// LCD Schnittstelle und PINs
2
#define LCD_CTRL   PORTB  // Port B
3
#define LCD_RS    0    
4
#define LCD_RW    1
5
#define LCD_E    2
6
#define LCD_BL    3
7
8
#define LCD_PORT   PORTC  // Port C  
9
#define LCD_IN    PINC
10
#define LCD_DDR   DDRC
11
#define LCD_DataOut 0xff
12
#define LCD_DataIn  0x00
13
#define BusyBit    7

Viel Erfolg!
Philipp

von Hartwig W. (hartwig)


Lesenswert?

Ganz vielen Dank!!

von Hartwig W. (hartwig)


Lesenswert?

Also, hier ist meine Lösung:
Ich hatte das DOGM über den Parallel Master Port (kurz: PMP) eines PIC32 
im 8bit Modus angesteuert, wobei der PMP das Timing und den Pegel der 
R/W und E Kontrollsignale übernimmt. Bei diesem ist das Enable Signal 
selbst in der Maximalkonfiguration der Waitstates nur ca. 200-250ns 
lang. Ein HD44780 wäre damit zwar zufrieden, aber dem DOGM ist das zu 
kurz.

Ich habe dann den PMP abgeschaltet und alles per Hand gesteuert, und 
grosszügige Delay's eingebaut. Dabei stellte sich heraus, dass das 
Enable-Signal eine Weile auf "High" bleiben muss, damit das DOGM es auch 
mitbekommt. Ich habe ihm 1us spendiert und damit war es dann zufrieden.

Der springende Punkt ist also dieser:
1
// LCD: ein Byte schreiben
2
void Write_LCD(char Data, unsigned char datenreg)
3
{
4
...
5
6
  LCD_PORT = Data;
7
  LCD_CTRL |= _BV(LCD_E);
8
  _delay_us(30);             // Braucht das DOGM bei 3.3V im Parallelmode!!
9
  LCD_CTRL &= ~_BV(LCD_E);
10
}

Ich habe zwar die 30us delay dann hinter dem de-assert vom Enable 
eingefügt anstatt davor, was aber egal sein und so wie im Code Snippet 
oben funktionieren sollte.

Vielen Dank nochmal für die Hilfe!
Gruß,
Hartwig

von spess53 (Gast)


Lesenswert?

Hi

Laut Datenblatt reicht dem ST7036 bei 2,7...4,5V eine Enable H pulse 
time von 200ns. Da sind 30µs wohl etwas übertrieben.

MfG Spess

von Hartwig W. (hartwig)


Lesenswert?

spess53 schrieb:
> Hi
>
> Laut Datenblatt reicht dem ST7036 bei 2,7...4,5V eine Enable H pulse
> time von 200ns. Da sind 30µs wohl etwas übertrieben.
>
> MfG Spess

Jo, da hast Du Recht, das ist schon mit Kanonen auf Spatzen geschossen. 
Ich habe jedoch keine Busy-Flag-Abfrage drin, um mir das Umschalten auf 
Lesen zu sparen. Die Performance ist bei mir momentan nicht sehr 
kritisch, daher geht's zur Not mal so.

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.