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 | void LCD_WRITE_DATA (uint8_t data) |
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: > Das Display lässt auch > seriell ansteuern. und dazu gibt es auch ein Beispiel: Beitrag "EA DOGM162 an SPI"
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
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | |
4 | #ifndef F_CPU
|
5 | #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
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.