Guten Tag liebe Mikrocomputergemeinde,
Mein Name ist Christian und ich studiere Elektronik. Ich verzweifle seit
einiger Zeit an der Ansteuerung eines EA DOG XL 160/7 Grafikdisplay
mittels SPI und einem PIC 32.
Das Display zeigt gar nichts an, an VLCD wird jedoch eine Spannung von
circa 12 Volt generiert. Die Initialisierung habe ich bereits mit
mehreren anderen Beiträgen verglichen und ich habe sie identisch.
Als mögliche Fehlerquellen sehe ich meinen Schaltplan (Ich bin Anfänger,
habe wenig Erfahrung was dies angeht) und weiterhin meine Senderoutine.
Beide habe ich als Anhang hinzugefügt. Den Schaltplan habe ich
eigentlich nach dem Beispiel in dem Datenblatt des Displays von EA
erstellt. Bei der Senderoutine bin ich mir zum Beispiel nicht sicher ob
es stimmt dass CS low bleiben muss wenn ein 2 Byte Kommando gesendet
wird, oder ob ich es bezügliche Flankenwechsel in diesem Modus trotzdem
nach abgeschlossenem Senden wieder high setzen sollte.
Ich bedanke mich jetzt schon einmal für die Hilfe.
Mit freundlichen Grüßen
Christian
versuche zunächst einmal, die Initroutine nach dem Datenblatt EXAKT
umzusetzen. Diese funktioniert, nimm das Datenblatt von z.B. Reichelt.
Da du schreibst, dass VLCD da ist, muss das Display eigentlich schon
laufen, denn die charge pump muss man über die SPI einschalten. Daher
denke ich, dass der Fehler an der initroutine oder dahinter liegt, nicht
an der SPI-Funktion an sich.
Siehtst du ein willkührliches Pixelmuster auf dem Display?
Wartest du nach dem Einschalten der Versorgung lange genug, bevor du das
Ding anquatscht?
Poste doch mal deine initroutine...
Das Ding läuft mit einem PIC32, ich verwende es schließlich auch ;-)
Hey WehohWeh,
Danke für die schnelle Antwort. Das mit dem nach dem Einschalten der
Versorgungsspannung lang genug warten werde ich morgen mal Überprüfen,
da bin ich mir nicht sicher.
Im Anhang ist der Sourcecode zu meiner Initroutine. Die Frage ist nur
wie überprüfe ich ob diese richtig funktioniert hat? Eigentlich ja nur
durch eine Ausgabe, deren Implementierung dann wiederum Fehlerpotenzial
bietet.
Das Display zeigt gar nichts an, keine willkürlichen Pixel, nichts, es
ist blank.
Grüße Christian
Hmm, ich hab das anders gemacht.
Meine Initroutine sieht so aus:
1
voidinit_display()
2
{
3
init_hardware();
4
//reset module
5
wait(16000);
6
oDISP_NCSN=1;//display is not selected
7
oDISP_CD=1;//CD is set to data
8
oDISP_NRST=1;//disable reset
9
wait(16000);
10
11
//routine according to datasheed
12
write_command(0xF1);
13
write_command(0x67);//set com electrodes to 103
14
write_command(0xC0);//SEG column and COM to normal
15
write_command(0x40);
16
write_command(0x50);//set display startline to 0
17
write_command(0x2B);//set panelloading to 28..38nF
18
write_command(0x2F);//set panelloading to 28..38nF
19
write_command(0xEB);//set BIAS to 1/12
20
write_command(0x81);//set RAM fill behaviour;
21
write_command(0x5F);//set contrast
22
write_command(0x89);//set RAM addr to autoincrement
23
write_command(0xAF);//switch display on
24
#ifdef USE_DMA
25
dma_spi_init();
26
#endif
27
}
Die habe ich irgendwo geklaut, vor langer langer Zeit. Jedenfalls gehts.
Ich hab noch die dogxl_hardware.c angehängt, da sind auch die SPI-Sachen
drin, allerdings als Software SPI pfusch. Bei der Platine mit PIC32
hatte ich ein kleines Missverständniss beim Peripheral Remapping - das
geht bei meinem PIC für SCK nämlich nicht.
Auf das Timing mit wait() bin ich nicht stolz, es geht aber. Das war
"mal schnell testweise" portiert und es läuft seit dem sehr zuverlässig.
Daher hab ich es nie wieder angeschaut.
Wenn ich das richtig sehe haben wir die Init Routine ja identisch bis
auf den Befehl:
write_command(0x2F); //set panelloading to 28..38nF
Habs auch mal mit diesem versucht klappt auch nicht. Ich habe jetzt
einige Delays eingebaut aber es klappt immer noch nicht.
Und zu guter letzt habe ich vorhin nochmal VLCD gemessen.
Nichts :/ aus welchem Grund auch immer, es liegen auf einmal nur noch 0V
an obwohl ich eigentlich nichts geändert habe.
In dem Fall kann es noch sein dass du ein Timingproblem bei der SPI
hast. Oder natürlich ein Hardwareproblem. Oder falsch gemappte Pins.
Oder ein TRISx-bit ist noch gesetzt. Auch ANSELx ist eine spassige
Fehlerquelle, weil nicht alle immer auf 0x0 initialisiert werden.
Oder die Bedienung der CD-Leitung oder CS passen nicht.
Besorg dir auch das echte Datenblatt vom Display, also das hier:
http://www.lcd-module.de/eng/pdf/zubehoer/uc1610.pdf
Daher wäre es Sinnvoll, sich die Schnittstelle mal mit einem Oszillop
anzuschauen, und das dort gesehene mit dem Datenblatt zu vergleichen.
Sehr schön triggern kann man die SPI ja mit dem Chipselect. Damit kann
man das sogar mit einem uralten analogen Oszi anschauen (in einer
Schleife immer das Gleiche schicken).
Wichtig wäre:
Passt CPOL / CPHA?
Wie sehen die Signale aus (Pegel, Flanken)?
Stimmen die Hilfssignale (CS, NRES, CD)?
Passen Setup / Holdzeiten?
Mit welcher Frequenz sendest du Befehle?
Schon versucht, die Wartezeit nach dem Start auf z.B. 100ms zu erhöhen?
Nimm doch testweise mal die Software-SPI her.
Hey,
Sorry die lange Zeitverzögerung, ich hatte Ferien und brauchte mal eine
Auszeit von der ganzen Lernerei.
Könntest du mir bitte mal deine "display_dogxl.h" zukommen lassen. Mir
geht es vorallem um die Realisierung des FONTS.
Die Chargepump ist an, das lag an einem delay das ich geändert hatte.
Doch auf dem Display steht immer noch gar nichts :/
Vielen Dank
Christian
anbei mal die Sachen für die Fonts.
Die Fonts habe ich hier aus dem Forum, es gibt nur 2:
einen mit 12x8 und einen mit 8x6. Mehr habe ich nicht gebraucht.
Es gibt Optimierungsmöglichkeiten:
Die Funktion SetPixel(); wird naturgemäß oft verwendet. Und die ist
etwas lahm.
Ich hätte noch mehr Grafikfunktionen (Bitmaps, Kreise,
Zeigerinstrument), aber die sind bisher nur auf einem DOGS getestet. Die
Dinger basteln macht zwar spass, ist aber schon viel Arbeit.
Ich würde mir an deiner Stelle eine offene Grafiklibrary suchen. Für
DOGXL gibts hier eine:
Beitrag "Library für EA-DOGM Grafikdisplays inkl. Font-Generator"