162sten mal DOGM

Gast #3066400
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
Angehängte Dateien:
#3066523
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.
#3066524
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!
Gast #3066853
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!
Angehängte Dateien:
Gast #3066892
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
Gast #3066913
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.
Gast #3066922
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
#3066952
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
#3067052
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.
Gast #3067123
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.
#3067153
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren