Hallo zusammen,
nach zwei Tagen Foren lesen und Internet durchforsten, wage ich es mal
einen eigenen Thread aufzumachen.
Wie schon zu erwarten ist zeigt mein DOGM162 Display leider nichts an.
Ich habe bereits dutzende initialisierungen ausprobiert (ok, sagen wir
ca. 5...), leider jedoch ohne Erfolg.
Ich benutze einen ATMEGA32 mit einem externen Quarz. Der Quarz läuft mit
2.4576 Mhz. Die Entwicklungsumgebung ist selbst zusammen gelötet.
So wie ich das sehe, müsste nach der Initialisierung ein Curser blinken.
Bisher sehe ich aber leider keinen. Mein Betriebsmodus ist 5V und 4Bit.
Die Ports sind wie folgt verdrahtet:
#define LED_PORT DDRC
#define LEDS PORTC
#define LCD_PORT DDRD
#define LCD PORTD
#define OUTPUT 0xFF
#define INPUT 0x0
#define DB4 3
#define DB5 2
#define DB6 1
#define DB7 0
#define E 4
#define RW 5 //unused
#define RS 6
RW ist auf GND.
Die LEDs habe ich nur zum Test mit drauf. Mein Code befindet sich im
Anhang.
Ich würde mich sehr drüber freuen, wenn jemand mal über meine
Initialisierung schauen könnte.
Danke schonmal im Voraus.
Gruß
Alex
Alex schrieb:> So wie ich das sehe, müsste nach der Initialisierung ein Curser blinken.> Bisher sehe ich aber leider keinen.
Du Witzbold! GLCD Displays haben keinen Cursor, ausser du schreibst
einen aus dem Font drauf!
Und ist das auch so angeschlossen:
http://www.lcd-module.de/pdf/doma/dog-m.pdf ??
gray dog schrieb:> Du Witzbold! GLCD Displays haben keinen Cursor, ausser du schreibst> einen aus dem Font drauf!
Komiker! :-)
Sogar in dem von Dir verlinkten Datenblatt wird der Cursor beschrieben!
@TO: Was ist mit Deinem Kontrast!? Den muß man hier per SW einstellen.
Mal ein wenig dran drehen ...
Gruß
Jobst
Alex schrieb:> Wie schon zu erwarten ist zeigt mein DOGM162 Display leider nichts an.> Ich habe bereits dutzende initialisierungen ausprobiert (ok, sagen wir> ca. 5...), leider jedoch ohne Erfolg.
Du solltest selbst ein bischen mitdenken. Das bringt dir mehr als
irgendwo Code zu klauen.
Im weiter oben verlinkten Datenblatt (ok. dort findet sich ein Link zum
Datenblatt des Controllers und dort ist es drinnen) findet sich doch die
genaue Sequenz wie man in den 4-Bit Modus initialisiert.
> Ich würde mich sehr drüber freuen, wenn jemand mal über meine> Initialisierung schauen könnte.
Du wirst doch deinen Code mal mit dem dort angegebenen Flussdiagramm
vergleichen können?
Hinweis!
Mitten in der Initialisierung ist ein Wechsel drinnen! Die ersten paar
Function-Set Kommandos werden gegeben, indem man nur 4 Bits ausgibt.
Aber mitten in der Initialisierung ist dann ein Bruch sobald das Display
in den 4-Bit MOdus kommt. Ab da werden dann 8 Bit ausgegeben indem man 2
4-Bit Einheiten hintereinander ausgibt. Die ganzen Clear Display und
Zeilenmodus etc. Kommandos laufen dann schon über diesen 2*4 Bit
Mechanismus. D.h. das hier in deinem Code
1
LCD_WRITE_DATA(0b0001);//OSC
2
LCD_TAKE_DATA();
3
_delay_us(50);
4
LCD_WRITE_DATA(0b0111);//Contrast
5
LCD_TAKE_DATA();
6
_delay_us(50);
7
LCD_WRITE_DATA(0b0101);//Power
8
LCD_TAKE_DATA();
9
_delay_us(50);
10
LCD_WRITE_DATA(0b0110);//Follower
11
LCD_TAKE_DATA();
12
_delay_us(50);
13
LCD_WRITE_DATA(0b1111);//Display
14
_delay_ms(10);
15
}
ist kompletter Unsinn! Das muss dir doch dein Hausverstand sagen, dass
du irgendwann in der Initialisierungssequenz das LCD so weit hast, dass
du ihm pro zu übertragender Einheit wieder 8 Bit auf die Reise schicken
musst. Im Falle des 4-Bit Modus dann eben, indem man 2*4 Bit pro zu
übertragender Einheit überträgt.
http://www.lcd-module.de/eng/pdf/zubehoer/st7036.pdf
Seite 41
Da ist alles ganz genau aufgeschlüsselt. Inklusive aller Zeiten,
inklusive aller Daten-Nibbles (ein Nibble ist eine 4-Bit Einheit) die zu
übertragen sind.
Spess53 schrieb:> Hi>>> LCD |= (0 << E);>> Überlege mal was da passiert.>> MfG Spess
Und hier genauso:
1
voidLCD_WRITE_DATA(uint8_tdata)
2
{
3
if(data&0b0001)
4
LCD|=(1<<DB4);
5
else
6
LCD|=(0<<DB4);
7
8
if(data&0b0010)
9
LCD|=(1<<DB5);
10
else
11
LCD|=(0<<DB5);
12
13
if(data&0b0100)
14
LCD|=(1<<DB6);
15
else
16
LCD|=(0<<DB6);
17
18
if(data&0b1000)
19
LCD|=(1<<DB7);
20
else
21
LCD|=(0<<DB7);
22
}
Herrgott! Da fehlts ja an den banalsten Grundlagen!
Bitmanipulation
Bring doch erst mal eine LED zum leuchten/erlöschen/blinken, ehe du dich
am super-duper-hyper LCD versuchst, für das du keine fertigen Funktionen
finden kannst! Ihr wollt immer laufen (und das gleich noch bei Olympia,
weils dort im Stadion so schön glitzert) noch bevor ihr gehen könnt.
Sowas KANN nur in die Hose gehen!
Spess53 schrieb:> Überlege mal was da passiert.> > LCD |= (0 << E);> MfG Spess
Da hast du recht, das war wohl nichts...
Korrigiert zu LCD &= ~(1 << E)
(Der von Karl Heinz Buchegger aufgeführte Teil wurde auch korrigiert).
Karl Heinz Buchegger schrieb:
> Hinweis!> Mitten in der Initialisierung ist ein Wechsel drinnen! Die ersten paar> Function-Set Kommandos werden gegeben, indem man nur 4 Bits ausgibt...
Aha! Jetzt weis ich auch mal wofür die zweite Zeile da ist. Habe den
Code soweit angepasst. Leider gibts immer noch keinen Output.
Gray Dog schrieb:
> Und ist das auch so angeschlossen:>> http://www.lcd-module.de/pdf/doma/dog-m.pdf ??
Ja, das PDF habe ich auch. Genau nach dem PDF habe ich es verdrahtet.
Ich kann die vom Mikrocontroller ausgegebenen Werte an den Display-Pins
messen.
Sprich, nach der Initialisierung kann ich 4,1V an den Pins 28, 29, 30 &
31 messen.
Ich habe meinen aktuellen Code nochmal angehangen.
Danke für die bisherige Hilfe!
Hi
>Ich habe meinen aktuellen Code nochmal angehangen.
Was mir als erstes auffällt: Bei den ersten 4 Function Set-Befehlen
dürfen nur 4 Bit ausgegeben werden. Dein LCD_WRITE_DATA gibt 2 x 4 Bit
aus.
MfG Spess
spess53 schrieb:> Was mir als erstes auffällt: Bei den ersten 4 Function Set-Befehlen> dürfen nur 4 Bit ausgegeben werden. Dein LCD_WRITE_DATA gibt 2 x 4 Bit> aus.
Stimmt.
Habe die Übergabe der ersten vier Function Set-Befehle jetzt abgeändert.
Sie werden nun direkt an "LCD" übergeben:
1
_delay_ms(100);
2
LCD=0b1100;//Function #1
3
LCD_TAKE_DATA();
4
_delay_ms(4);
5
LCD=0b1100;//Function #2
6
LCD_TAKE_DATA();
7
_delay_us(50);
8
LCD=0b1100;//Function #3
9
LCD_TAKE_DATA();
10
_delay_us(50);
11
LCD=0b0100;//Function #4
12
LCD_TAKE_DATA();
13
_delay_us(50);
14
LCD_WRITE_DATA(0b00100101);//Function #5
15
_delay_us(50);
Die Bits müssen allerdings umgekehrt übergeben werden (MSB und LSB
vertauscht), da an diesem Punkt noch keine Zuweisung der Ports erfolgt
ist.
Danke für den Hinweis! Noch immer keine Funktion.
Hi
>Die Bits müssen allerdings umgekehrt übergeben werden (MSB und LSB>vertauscht), da an diesem Punkt noch keine Zuweisung der Ports erfolgt>ist.
????
Warum nimmst du eigentlich 4Bit Parallel Mode? Das Display lässt auch
seriell ansteuern.
MfG Spess
spess53 schrieb:> Warum nimmst du eigentlich 4Bit Parallel Mode? Das Display lässt auch> seriell ansteuern.
Glaubst du der TE weiß den Unterschied oder hat ne Ahnung davon welche
Auswirkungen das hat? Hier wird doch nur Code geklaut der nicht im
Ansatz verstanden wird und das was hinzukommt ist himmelschreiender Müll
(0<<PB0).
Und da fängst du mit SPI an. Jetzt muss er wieder nach Code googlen den
er kopieren kann. Es muss erstmal ein grundlegendes Verständis für das
Display und den benutzten Bus da sein. Vorher kann man das vergessen.
gruß cyblord
#warning "F_CPU war noch nicht definiert, wird nun mit 2457600 definiert"
6
#define F_CPU 2457600UL /* Quarz mit 2.4576 Mhz */
7
#endif
Zum 11973. Mal:
Die Warnungen des Compilers sind zum ignorieren da!
Sind ja nur Warnings. Da macht man nochmal ein Build und schon sind sie
alle weg. Problem gelöst.
Aber wenn das Timing dann nicht stimmt, schliesslich hat sich jemand
etwas dabei "_delay_us(50);" gedacht, dann funktioniert es nicht.
mfg.
Ich bin im st7036.pdf nochmal die Instruction Description ab Seite 29
durchgegangen. Entsprechend konnte ich noch ein paar Bits ändern. Was
mir aber immer wieder auffällt, sind die Angaben zu OPF1 und OPF2.
Beides sollte wohl 0 sein. Einzustellen ist das über die ITO-Options
(Siehe Seite 12). Nur finde ich in dem PDF keine weiteren Informationen,
was denn nun diese ITO-Options sind.
Den parallel-Mode habe ich gewählt, da wir das Display schonmal mit
einem 8051 in der Schule im 4Bit parallel-Mode genutzt haben. Nun würde
ich es aber gern Privat mit einem ATMEGA32 betreiben. Das war also eher
aus dem Grund, weil wir es damals auch schon so gemacht haben. In der
Schule war die Initialisierung jedoch schon Vorgegeben und für mich, als
Anfänger, recht kryptisch gestaltet.
Offtopic:
cyblord ---- schrieb:> Glaubst du der TE weiß den Unterschied oder hat ne Ahnung davon welche> Auswirkungen das hat? Hier wird doch nur Code geklaut der nicht im> Ansatz verstanden wird und das was hinzukommt ist himmelschreiender Müll> (0<<PB0).>> Und da fängst du mit SPI an. Jetzt muss er wieder nach Code googlen den> er kopieren kann. Es muss erstmal ein grundlegendes Verständis für das> Display und den benutzten Bus da sein. Vorher kann man das vergessen.>> gruß cyblord
Oh super, danke dir!
Auch wenn spess53 nicht alles erklärt, so kann ich mich trotzdem darüber
informieren und ggf. Änderungen vornehmen. Aber sag mir doch bitte was
ich aus deiner Antwort lernen kann. Ich denke nicht sehr viel.
Alex schrieb:> Oh super, danke dir!
Bitte immer gerne.
> Auch wenn spess53 nicht alles erklärt, so kann ich mich trotzdem darüber> informieren und ggf. Änderungen vornehmen.
Dann informier dich mal. Vor allem mal über die Grundlagen, weit abseits
von LCDs. Das wäre bitter nötig.
> Aber sag mir doch bitte was> ich aus deiner Antwort lernen kann. Ich denke nicht sehr viel.
Ja sorry ich hätte direkt fertigen Code posten sollen, das wäre dir
natürlich lieber gewesen. So kannst du natürlich nichts damit anfangen.
gruß cyblord