Forum: Mikrocontroller und Digitale Elektronik EA DOGM und ARM7


von Ka_deu (Gast)


Angehängte Dateien:

Lesenswert?

Gute Tag,

     Ich habe ein LCD EA DOGM162L-A mit einem ADuc7020 geschaltet und 
schein leider am Display nichts zu bewegen. Ich habe alle Pins getestet 
und es kommt bei High 3.3V. Anbei die Schaltung angehängt.

Vielen Dank für Ihre Hilfe.

von Martin (Gast)


Lesenswert?

Es handelt sich um einen Softwarefehler in Zeile 183.

von Ka_deu (Gast)


Lesenswert?

Welche Softwarefehler meinen Sie ?

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Das sollte ein dezenter Hinweis darauf sein, dass man ohne den 
Programmcode zu sehen nichts zu dem Problem sagen kann.

von Ka_deu (Gast)


Angehängte Dateien:

Lesenswert?

Anbei Programmcode...

von Kai F. (k-ozz)


Lesenswert?

Ausgänge werden so auf high gesetzt: GP1SET = LCD_RS;
Also nicht '|=', sonder nur '='.
Rückgesetzt (auf low) werden sie so: GP1CLR = LCD_RS;
Also nicht das betreffende Bit in GP1DAT löschen, sondern das 
betreffende Bit in GP1CLR setzen!

Vielleicht solltest du dir einfach ein paar Makros schaffen:
1
#define lcd_set_rs() GP1SET = (1 << 23)
2
#define lcd_clear_rs() GP1CLR = (1 << 23)
3
#define lcd_set_e() GP1SET = (1 << 22)
4
#define lcd_clear_e() GP1CLR = (1 << 22)
5
#define lcd_set_rw() GP1SET = (1 << 20)
6
#define lcd_clear_rw() GP1CLR = (1 << 20)
außerdem muß die lcd_send_bits geändert werden (die clear_data kann 
damit entfallen)
1
void lcd_send_bits(int data)
2
{
3
    data &= 0x0F;
4
    GP1CLR = (0x0F << 16);
5
    GP1SET = (data << 16);
6
}
Probier's mal aus!

von Ka_deu (Gast)


Lesenswert?

Danke ich probier´s aus...

von Ka_deu (Gast)


Lesenswert?

Ich hab die makros benutzt, aber leider ohne Erfolg. Ich habe 2 LCD wo 
ich gerade ausprobiert habe. Das prb ich weiss nicht wie kann ich 
testen, ob die LCDs wirklich Daten bekommen, anders gesagt ob sie nicht 
kapput sind.

von Was anderes (Gast)


Lesenswert?

Auf dem P1.x sind doch die SPI Signale, schließe das DOG Modul doch im 
SPI Mode an, dann werden nur noch 4 Leitungen für die Verbindung 
benötigt.

Das Schreiben der Bits/Clk macht dann der SPI, nur noch latchen, warten 
100us dann darf das nächste Byte geschrieben werden.

Ist doch viel einfacher, als das Display über 4-Bit-Bus anzusteuern.

Das Timing ist wichtig, z.B. der CLS Befehl benötigt wirklich die 
angegebenen ms vom Datenblatt.

von Jansus (Gast)


Lesenswert?

Die EADOG-M Displays sind sehr empfindlich was die Initialisierung 
angeht. Außerdem haben sie die nervige Eigenart, dass sie erst nach 
erfolgreicher Initialisierung etwas anzeigen. Mache Dir also keine 
Sorgen, die Dinger gehen meistens und können auch ein bisschen was ab. 
Suche mal nach Code für die Initialisierung (gibt's hier im Forum), 
passe sie auf Deinen Controller an und freue Dich über das Ergebnis!

von Jaouad (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe nochmal mit spi geschaltet, und scheint immer noch nichts am 
display. anbei die schaltung

von Jaouad (Gast)


Angehängte Dateien:

Lesenswert?

und hier noch der Quellecode...

vielen danke für Ihre Hilfe!

von Thilo M. (Gast)


Lesenswert?

Wenn du ein Display mit 3.3V benutzt musst du (bin nicht sicher) die 
interne Ladepumpe zuschalten. Guck' besser nochmal genau ins Datenblatt.

Auch das Zuschalten der Betriebsspannung ist kritisch, lieber die 
Initialisierung erst nach 1s starten, wenn die Versorgung des Moduls 
stabil ist.

von Was Anderes (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Anbei mein C-Code, allerdings für einen ARM-Prozessor LPC23xx.

Initialisierung:
LCD_TaskInit(0);

Zyklischer Aufruf aus dem Main-Loop:
LCD_Task();

Im Interrupt wird die CS Leitung automatisch gelöscht.

Mit dabei sind vollständige Routinen:
LCD_Char(char Dat);
LCD_CLS(unsigned char Lines);
LCD_Locate(int X, int Y);
LCD_Text(char * sText);
LCD_Int(int iVal);
LCD_NibbleHex(unsigned char x);
LCD_ByteToHex(unsigned char cVal);
LCD_IntToHex(int iVal);
LCD_LongToHex(unsigned long iVal);
(Die LCD_Float Routine habe ich noch nicht gebraucht, daher auch nicht 
hinzuerfunden.)

Nur noch die IO's und den verwendetetn Timer anpassen und fertig. Meine 
Routinen warten nicht bis die Daten im LCD sind, sondern buffern diese 
im RAM. Erst der LCD_Task() macht die Ausgabe, getriggert über Timer. 
Damit bleibt die Applikation nicht wegen der LCD Ausgabe stehen. 
Schließlich hat der Prozessor ja noch eine Hauptaufgabe und die ist 
meistens nicht das LCD zu beschreiben.
Alle LCD Befehle die länger als 100us benötigen dürfen nicht verwendet 
werden, daher habe ich das LCD_CLS() anders gemacht.

@Jaouad: Wieso steuerst Du eigentlich das CS Signal nicht an (LOW) wenn 
Du Daten/Steuerwörter übertragen willst und nimmst es dann wieder weg 
(HI)?

Gruß MM

von Was Anderes (Gast)


Angehängte Dateien:

Lesenswert?

Wenn man experimentiert mit dem Display und schrott rein schreibt, dann 
ist die Funktion des Displays kaputt. Am besten man macht es vor jedem 
Versuch Spannungslos damit es sich resetet!
Sonst passiert es, dass man einen guten Quellcode hat aber im Display 
dennoch nichts zu sehen ist.
Gruß MM

von Thilo M. (Gast)


Lesenswert?

>vor jedem Versuch Spannungslos damit es sich resetet!

Dafür hat das Ding einen Reset-Pin. ;)

von Robert Teufel (Gast)


Lesenswert?

@Thilo
da gibt es haeufig gravierende Unterschiede zwischen einem "warm reset" 
und einem "power-on reset". Auch noch zu beachten, die Kondensatoren auf 
einem Board verhindern oft einen power-on reset, wenn man ihnen nicht 
genug Zeit gibt sich zu entladen.

Just my 2 cents, Robert

von Jaouad (Gast)


Lesenswert?

Ja, vielen dank für die Tipps, ich mache jetzt die Änderungen und hoffe 
dass es funktioniert...

von Jaouad (Gast)


Lesenswert?

ich habe gerade bemerkt:

*(seite 55) Serial Clock Period : tSCYC  min = 200ns => 5Mhz
*(seite 66) Im Aduc7020 kann ich max "SPI speed in MHz = 3.482Mhz" 
erreichen.

Kann es daran liegen, dass es nicht funktioniert ?

von Robert Teufel (Gast)


Lesenswert?

>Kann es daran liegen, dass es nicht funktioniert ?
SPI speed, nicht wirklich.
Das hier "*(seite 55) Serial Clock Period : tSCYC  min = 200ns => 5Mhz" 
ist etwas ungluecklich formuliert aber bedeutet ebenfalls 
Maximalgeschwindigkeit. Alsoe die Maximalgeschwindigkeit des Micros ist 
lansamer als die der Peripherie, dann sollte schon mal alles in Ordnung 
sein.

Robert

von Was Anderes (Gast)


Lesenswert?

Mach doch den SPI so langsam wie möglich, mann muss sowiso 100us warten 
bis man das nächste Byte schicken darf, so wie in meinem Codebeispiel.
Dadurch wird das ganze auch unempfindlicher wegen sonstigere Störungen.

An der Geschwindigkeit solltest Du erst anfangen zu Optimieren wenn es 
überhaupt mal funktioniert!

von Jaouad (Gast)


Lesenswert?


von Jaouad (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe die Wartezeiten mit einem Timer genauer beschrieben. Auch noch 
das CS-Signal betrachtet...Code im Anhang.

von piepvogel (Gast)


Lesenswert?

man muss das timing bei diesen EADOG dingern genau einhalten. ich hatte 
mal das problem, dass 3 wollten und ein viertes nicht, weil ich irgendwo 
zu schnell war. also genau die timing-diagramme im datenblatt beachten, 
dann klappt das schon.

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.