Forum: Mikrocontroller und Digitale Elektronik AVR DOGM128W-6 mit Atmega32 ansteuern


von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich versuche seit mittlerweile über einer Woche das Grafikdisplay 
DOGM128W-6 mithilfe eines Atmega32L 8PU zum Laufen zu bringen. Ich habe 
die letzten Tage mit meinem Team auch intensiv das Internet und das 
Forum hier durchforstet, bisher aber ohne Erfolg. Da wir komplette 
Neulinge im Bereich Mikrocontroller sind, bitte ich euch unsere dummen 
Anfängerfehler zu verzeihen.

Das Display verhält sich so, als ob keine Spannung angeschlossen wäre, 
es bleibt dunkel. Es blinkt kein einziger Pixel auf.

Ich verwende folgende Bauteile:
•  Atmega32L 8PU
•  DOGM128W-6
•  mySmartUSB MK2 (USB Programmer den es beim MyAVR Board dazu gab)

Der USB Programmer wird nach dem Programmieren entfernt, um den als 
Fehlerquelle auszuschließen.

Hier die Pinbelegung:

Display ----- Atmega32(PIN)
SI            MOSI (B5)
CS            CS (B4)
A0            A0 (C2)
SCL           SCK (B7)

Reset ist dauerhaft auf HIGH, da man das Display nicht auslesen kann und 
nur Daten gesendet werden.

Das Display wird in +3,3V Single Supply ohne Hintergrundbeleuchtung 
betrieben. Die Schaltung ist so aufgebaut, wie beim oberen Schaltbild in 
dem Datenblatt des Displays auf Seite 4.
http://www.lcd-module.de/eng/pdf/grafik/dogm128e.pdf
Es werden Kerkos verwendet und ein IC, der die Spannung des MC (5V) auf 
die des Displays (3,3V) senkt.

Im Anhang befindet sich mein verwendeter Code in C, mit dem ich versuche 
das Display zu Initialisieren. Den hab ich aus dem 
Initialisierungsbeispiel von der Herstellerseite. 
http://www.lcd-module.de/deu/disk/development%20service/DOGM128%20ST7565/INIT_DOG_Grafik_7565.c
Ich Programmiere den Mikrocontroller mit dem Programm MyAvr. Was ich 
noch hinzugefügt habe, ist ein simpler Befehl, der irgendwelche Daten 
ans Display schickt, damit ich weiß, ob das Display richtig 
initialisiert hat, und ein Taster, mit dem ich die Initialisierung 
starte.

Was ich bisher versucht habe:
 - mit dem Oszilloskop die am Display ankommenden Signale betrachtet
 - jeden Ausgang einzeln angesteuert und am Display die Spannung 
gemessen

Rein elektronisch sieht also alles gut aus. Daher würde ich mal 
vermuten, dass die Programmierung nicht stimmt.

Wär schön, wenn jemand eine Idee hätte was ich falsch machen könnte. Ich 
bin für jede Hilfe dankbar.

von Thomas E. (thomase)


Lesenswert?

>dogSPIout(0xF0);dogSPIout(0xF0);dogSPIout(0xF0);dogSPIout(0xF0);dogSPIo ut
>(0xF0);dogSPIout(0xF0);

Wenn das die Datenausgabe ist, erreicht ihr damit gar nichts.

Seite 5 im Datenblatt:

1. Pageaddress, A0 == 0
2. Column High Nibble, A0 == 0
3. Column Address Low Nibble, A0 == 0
4. Datenbyte, A0 == 1

mfg.

von Dennis (Gast)


Lesenswert?

Wow, hab nicht mit einer so schnellen Antwort gerechnet.

Ich hab mir die Datenausgabe nochmal angeguckt und zum testen erstmal 
ganz rausgenommen.
Stattdessen hab ich folgene Programmzeile eingefügt
#define DISPAN 0xA5 //Alle Pixel an

und direkt am Ende der Initialisierung
dogSPIout(DISPAN);

Laut Datenblatt sollte das alle Pixel anmachen. Es tut sich aber 
immernoch nix.

Es sind uns beim rumspielen allerdings einige Dinge aufgefallen.

Ist es möglich, dass der interne Quarz des Atmega32 zu ungenau ist für 
das Display? Ich meine nein, aber mein Kollege meint, dass es definitiv 
daran liegt.

Ist es zwingend notwendig den Reset auf LOW und dann wieder auf HIGH zu 
setzen? Wir haben ihn im Augenblick dauerhaft auf HIGH um Pins zu 
sparen, aber die Hälfte der Beispiele die man findet, beinhalten diesen 
Reset.

von Spess53 (Gast)


Lesenswert?

Hi

>Ist es möglich, dass der interne Quarz des Atmega32 zu ungenau ist für
>das Display? Ich meine nein, aber mein Kollege meint, dass es definitiv
>daran liegt.

Sag deinem Kollegen, das er Unsinn redet.

1. Wie sieht denn die Beschaltung aus?
2. Was für Kondensatoren habt du benutzt.
3. Spannung an Pin32 nach der Initialisierung?

>Stattdessen hab ich folgene Programmzeile eingefügt
>#define DISPAN 0xA5 //Alle Pixel an

>und direkt am Ende der Initialisierung
>dogSPIout(DISPAN);

Wozu? Mach einfach ein Programm, das nur alle notwendigen 
Initialisierungen incl. DOG enthält. Nach erfolgreicher Initialisierung 
sind auf dem Display zufällige Pixel zu sehen.

MfG Spess

von Dennis (Gast)


Lesenswert?

Das Display wird in +3,3V Single Supply ohne Hintergrundbeleuchtung
betrieben. Die Schaltung ist so aufgebaut, wie beim oberen Schaltbild in
dem Datenblatt des Displays auf Seite 4.
http://www.lcd-module.de/eng/pdf/grafik/dogm128e.pdf

Als Kondensatoren haben wir 1µF Kerkos genommen, wie im Schaltplan.

Die Spannung kann ich leider morgen erst messen, da ich das Display 
nicht bei mir habe.

Und der Grund warum wir alle Pixel ansteuern wollen, ist der, falls wir 
durch Zufall oder so den Ram gelöscht haben. Sonst probieren wir rum und 
merken noch nichtmal, dass das Display schon geht.

von Spess53 (Gast)


Lesenswert?

Hi

>Als Kondensatoren haben wir 1µF Kerkos genommen, wie im Schaltplan.

Das ist in Ordnung.

Aber deine Initialisierung ist falsch. 'Voltage Regulator Set' fehlt.
'Electronic volume mode set' und 'Static indicator set' sind 2 Byte 
Befehle. Da fehlt jeweils das 2. Byte.
Lass einfach mal den ganzen Firlefanz weg und initialisiere das Display 
wie im Datenblatt.

MfG Spess

von Dennis (Gast)


Lesenswert?

Ich bin nochmal die Initialisierung Zeile für Zeile durchgegangen, und 
da steht alles genau so wie im Datenblatt. Das ist übrigens auch das 
Initialisierungsbeispiel von der Herstellerseite.

Hab aber den ganzen anderen Müll mal rausgelöscht. Morgen hab ich das 
Display wieder, dann probier ich das mal alles aus.

von Spess53 (Gast)


Lesenswert?

Hi

>Ich bin nochmal die Initialisierung Zeile für Zeile durchgegangen, und
>da steht alles genau so wie im Datenblatt. Das ist übrigens auch das
>Initialisierungsbeispiel von der Herstellerseite.

Entschuldige, ich hatte den 2.Befehl in den Zeilen übersehen. Aber 
'contrast' ist $FF zugewiesen. Der Wert kann max. $3F sein. Gängige 
Werte liegen bei $1x.

MfG Spess

von Dennis (Gast)


Lesenswert?

Spess53 schrieb:
> Entschuldige, ich hatte den 2.Befehl in den Zeilen übersehen. Aber
> 'contrast' ist $FF zugewiesen. Der Wert kann max. $3F sein. Gängige
> Werte liegen bei $1x.

Danke für die Info! Ich hoffe ich hab mir das Display damit nicht 
zerschossen.

Wenn sonst alles ok ist bei der Initialisierung, können wir die 
Fehlersuche wenigstens auf die Elektronik beschränken.

von Spess53 (Gast)


Lesenswert?

Hi

>Danke für die Info! Ich hoffe ich hab mir das Display damit nicht
>zerschossen.

Unwahrscheinlich.

MfG Spess

von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

Ok, wir haben das Display heute nochmal getestet.
Dabei ist herausgekommen, dass offenbar ein Fehler in folgender 
Programmschleife stecken muss.

void dogSPIout(char out)
{
  char msk;

  msk = 0x80;
  do
  {
    ClrBit(DOGSCLPORT, DOGSCL);
    if(out & msk)
      SetBit(DOGSIPORT, DOGSI);
    else
      ClrBit(DOGSIPORT, DOGSI);
    SetBit(DOGSCLPORT, DOGSCL);
    msk >>= 1;
  }
  while(msk > 0);
}

Das Problem ist das, dass er nur das erste Bit überträgt und dann aus 
der Schleife rausspringt. Das haben wir herausgefunden, indem wir 1 sec 
delay nach jedem Befehl eingefügt haben und uns die LCD Pins mit Dioden 
anzeigen lassen haben.

Danach bin ich auf die Idee gekommen, eine Variable bis 8 hochzählen zu 
lassen, sodass er auf jeden Fall 8 Durchgänge lang in der Schleife 
bleibt. Anschließend hab ich noch 8 verschiedene Masken machen müssen.
Aber dafür scheint er jetzt die Daten so zu übertragen, wie er es machen 
sollte. Den Code hab ich mal in den Anhang gepackt, auch wenn der 
langsam unübersichtlich wird.

Trotzdem zeigt das Display noch nichts an.

Kann es sein, dass mein Compiler Probleme hat mit ">>=", oder woran 
könnte das liegen, dass der das nicht gemacht hat?

von Spess53 (Gast)


Lesenswert?

Hi

Und die Spannung an Vout nachgemessen?

MfG Spess

von Dennis (Gast)


Lesenswert?

Spess53 schrieb:
> Und die Spannung an Vout nachgemessen?

Sorry, hab ich vergessen zu erwähnen. Die Spannung beträgt 2,8V.
Wobei bei der ersten Messung mit dem Multimeter fing die Spannung bei 5V 
an und ist innerhalb von ca. 5 sec auf 2,8 gefallen. Jetzt ist sie immer 
2,8V

von Spess53 (Gast)


Lesenswert?

Hi

>Sorry, hab ich vergessen zu erwähnen. Die Spannung beträgt 2,8V.

Ohne funktionierende Initialisierung ist das normal. Danach sollten >10V 
anliegen.

MfG Spess

von Dennis (Gast)


Lesenswert?

Thx für die Hilfe. Jetzt weiss ich wenigstens in etwa wo ich den Fehler 
suchen muss.

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.