Forum: Mikrocontroller und Digitale Elektronik 162sten mal DOGM


von Alex (Gast)


Angehängte Dateien:

Lesenswert?

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

von gray dog (Gast)


Lesenswert?

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 ??

von Jobst M. (jobstens-de)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

Hi

>  LCD |= (0 << E);

Überlege mal was da passiert.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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!

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

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!

von spess53 (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Einen Makro für RS zu definieren macht noch keine Steuerung draus.

von spess53 (Gast)


Lesenswert?

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

von Düsendieb (Gast)


Lesenswert?

spess53 schrieb:
> Das Display lässt auch
> seriell ansteuern.

und dazu gibt es auch ein Beispiel:
Beitrag "EA DOGM162 an SPI"

von Cyblord -. (cyblord)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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
Noch kein Account? Hier anmelden.