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?
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.
@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.
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 )
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????????
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.
@ 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.
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?
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
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
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
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
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!
Hast du den Voltage-Boost usw. alles korrekt initialisiert? Gruß
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
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
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 :-)
Hi
>Jawohl. Das habe ich gefühlte 1000x überprüft :-)
Auch die richtigen Kondensatoren benutzt?
MfG Spess
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.
Hi
>Ich habe verschiedene Werte durchprobiert.
Nicht die Werte. Es sollten Keramik-Cs sein (Aussage von EA).
MfG Spess
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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.