PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem beim Ansteuern eines Nokia 3310 Display!



doolitle15
26.02.2009, 15:03
Hallo

Ich möchte ein Nokia 3310 Display mit einem PIC18F4680 ansteuern mein PIC ist mit einem 20MHz Takt ausgestattet. und ich programmiere in c.
Ich habe das display folgender Maßen angschlossen:

PIC Display
RC5 (SDO) -> SDI (PIN 3)
RC3(SCLK) -> SCLK (PIN 2)
RC4 (I/O) -> RES (PIN 8 )
RD3 (I/O) -> cs (SCE) (PIN 5)
RD2 (I/O) -> D/C (PIN 4)

Den Pin1 vom Display habe ich an ca. 3,3V Versorgungsspannung, PIN6 an GND und PIN 7 über einen 0,47µF Kondensator an Masse angeschlossen.

Nun hab ich mir das Datenblatt vom PCD8544 Displaytreiber hergenommen und einfach mal das Programming example programmiert.
Leider macht mein Display gar nichts.
Hier das wesentliche vom Code:



#include<18F4680.h>
#use delay (clock=20000000)
#fuses HS, NOWDT, NOPROTECT, NOLVP
#include<stdlib.h>

void main (void) {
setup_spi(spi_master|SPI_H_TO_L);
output_low(PIN_D3); // cs -> low ;

spi_write(0x21); // function set: extended instruction set
spi_write(0x90); // Vop set +16 ´ b [V]
spi_write(0x20); // function set: normal instruction set
spi_write(0x0C); // display control set normal mode


output_high(PIN_D2); // D/C -> DIsplay mode

spi_write(0xFF);
spi_write(0xFF);
spi_write(0xFF);
spi_write(0xFF);
spi_write(0xFF);
spi_write(0xFF);

while(true) {


}
}



Was sollte bei der Vop set eingstellt werden??
Stimmt der Code vom Prinzip her oder muss ich da anders vorgehen??
Was hab ich falsch gemacht oder habe ich bloß irgendetwas vergessen??
Hoffe mir kann jemand helfen! ich bedanke mich schon mal im Voraus!

mfg

T.J.
26.02.2009, 15:14
Dein Display macht gar nichts? Wie sieht es mit der Kontrastspannung aus?

doolitle15
26.02.2009, 18:36
Hallo

Nein mein Display macht nichts.

Das Display hat ja 8 Anschlüsse. Die 5 Datenleitungen wie oben beschrieben, ein Vdd, Vout und GND.
Vdd hab ich auf 3,3V gelegt und Vout über einen Elko auf Masse.

Jetzt habe ich in dem Datenblatt vom Display gelesen das an Vout gegen Masse ca. 7V anliegen sollten, wenn Vdd 3V ist.
Bei mir liegt da aber nur ein Wert von 1,6V an. Liegt das an den Einstellungen die man beim Initialisieren zum Display schickt? oder könnte möglicherweise das Display kaputt sein??

mfg

T.J.
26.02.2009, 19:01
kaputt sein kann es sicher immer, hast du es denn neu gekauft?

Woher hast du die 3,3V? Woher hast du die Idee einen Kondi zwischen Vout und GND zu schalten? Ist der Kontakt an allen Leitungen IO?

hansen12345
26.02.2009, 19:20
RC4 (I/O) -> RES (PIN 8 )
ist der pin den auch auf high geschalten?
ansonsten ist das display im reset.

doolitle15
26.02.2009, 19:20
Hab das display von einem Handy ausgebaut. das display hat zu dem zeitpunkt noch funktioniert. aber ich dachte mir das ich es vielleicht beim anlöten des flachbandkabels kaputt gemacht hab?

habe die schaltung von http://sandiding.tripod.com/lcd.html
nur das ich einen 18F4680 verwende und die SDI (von display) und den SCLK am SSP vom pic angeschlossen habe.

die 3,3V habe ich über einen spannungsteiler. also von der 5V Versorgungsspannung des pics.

T.J.
27.02.2009, 07:25
Ok. gehen wir davon aus es ist IO. Was ist mit dem Reset Pin? So ein Display sollte beim Start einmal ein Reset bekommen und dann muss dieser Pin8 immer high sein.

ABER: Wenn du versorgungsspannung 3,3V für das Display hast ist das toll. Nur hast du die I/O Signale vom PIC auch von 5V auf 3,3V gewandelt?? Oder kommt das Display damit klar?

Mit "woher hast du die 3,3V" meinte ich: woher weißt du, dass es 3,3V sein müssen?

doolitle15
27.02.2009, 09:47
Das mit dem Reset hab ich auch schon ausprobiert.

Der Reset ist laut Datenblatt invertiert. also hab ich nach anlegen der 3,3V Versorgungsspannung. den Reset kurze Zeit auf HIGH gelegt und dann auf LOW, somit sollte das Display ja resetet sein oder?

ich habe jeden benötigten ausgang des pics mit so einem spannungsteiler ausgestattet.
das mit den 3,3V habe ich aus dem Datenblatt bzw. aus anderen Forums wo es um so ein display ging.

hab jetzt mal das datenblatt vom display Treiber angehängt.

mfg

T.J.
27.02.2009, 10:33
ähm, wenn der Reset invertiert ist (wie übringens sehr oft) dann ist er aktiv wenn du GND anlegst. Damit dein Display also nicht ständig reset macht benötigt dieser Pin 3,3V.

Also:
Reset(High)
wait(5ms)
Reset(LOW)
wait(10ms)
Reset(High)
LOS GEHTS!

doolitle15
27.02.2009, 11:25
sooo hab jetzt das jetzt mal mitn reset so getestet. tut sich leider auch nix.
mein aktueller code schaut jetzt mal so aus.



#include<18F4680.h>
#use delay (clock=20000000)
#fuses HS, NOWDT, NOPROTECT, NOLVP
#include<stdlib.h>

void main (void) {
//int i;
setup_spi(spi_master|SPI_H_TO_L|SPI_CLK_DIV_4);

output_high(PIN_D3); // Chip select

//Display reset
output_high(PIN_C4); // RES
delay_ms(5);
output_low(PIN_C4); // RES
delay_ms(10);
output_high(PIN_C4); // RES

output_low(PIN_D2); // D/C -> Command mode
spi_write(0x21); // function set: extended instruction set
spi_write(0xC8); // mittlerer Kontrast
spi_write(0x06); // Temp. Ausgleich
spi_write(0x13); // bias 1:48
spi_write(0x20); // function set: normal instruction set
spi_write(0x0C); // display control set normal mode

output_high(PIN_D2); // D/C -> DIsplay mode

spi_write(0xFF);
spi_write(0x00);
spi_write(0xFF);
spi_write(0x00);
spi_write(0xFF);
spi_write(0x00);

while(true) {
}
}


im datenblatt steht bei dem programming example das SCE (invertiert) auf LOW gehn soll. das heißt ich muss im Programm auf HIGH legen damit dann LOW am SCE anliegt oder steh ich jetzt komplett auf der Leitung??

mfg

robocat
27.02.2009, 11:54
deine beschaltung sollte eigentlich korrekt sein, damit habe ich das display damals (mit einem atmega8) auch in gang bekommen.

vielleicht kannst du von http://www.microsyl.com/nokialcd/nokialcd.html etwas abgucken.

konkret helfen kann ich leider nicht, weil ich von PICs keine ahnung habe.

gruesse

T.J.
27.02.2009, 14:01
hm, seltsam. Da ich jetzt unsicher bin wie du das mit negativ meinst probier das mit dem Reset halt andersrum ( low, high, low) kommt mir aber komisch vor..

Sendet dein PIC wirklich was auf SPI??

hansen12345
27.02.2009, 15:52
...
setup_spi(spi_master|SPI_H_TO_L|SPI_CLK_DIV_4);

output_low(PIN_D3); // Chip select <--- low aktiviert das lcd

//Display reset
...

wenn das geändert ist sieht der code eigentlich fuktionstüchtig aus.

sollte es dann immer noch nicht funktionieren:
1. liegt es vielleicht am spi modus, der sollte auf CPOL = 0, CPHA = 0 eigenstellt sein.
2. liegt es an der versorgungsspannung z.b. wenn die spannung einbricht wegen der spannungsteiler.
eventuell mal die ganze hardware auf max. 3,3 volt laufen lassen und auf spannungsteiler verzichten, vorausgesetzt der pic kann auch bei dieser spannung arbeiten.

doolitle15
27.02.2009, 18:26
Hallo

soo habe jetzt mal die änderung im code gemacht. funktioniert leider immer noch nicht.

Ich weiß nicht ob der pic wirklich etwas über SPI sendet. kann ich das testen??

@hansen : der pic läuft leider nicht mit 3,3 V betriebsspannung.
was meinst du mit CPOL und CPHA??

mfg

hansen12345
27.02.2009, 19:29
was meinst du mit CPOL und CPHA??
beim pic heisst das anscheinend CKP & CKE und die müssen beide auf null im entsprechenden register sein.

(SPI_L_TO_H | SPI_XMIT_L_TO_H) ??

doolitle15
28.02.2009, 12:06
hallo

habe jetzt die beiden Bits CKE und CPE auf 0 gesetzt und es funktioniert wieder nicht.
code schaut jetzt folgendermaßen aus: (nur die main)


void main() {
// configure SPI
// SMP CKE D/A P S R/W UA BF
// 0 0 0 0 0 0 0 0
#bit SSPSTAT_CKE = 0xb.6
// WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0
// 0 0 1 0 0 0 0 0
// SSPM3-SSPM0: 0000 -> Master Mode; Tosc/4
// SSP Enable Bit: 1
#bit SSPCON1_CKP = 0xb.4

SSPCON1_CKP = 0;
SSPSTAT_CKE = 0;

//int i;
setup_spi(spi_master|SPI_H_TO_L|SPI_CLK_DIV_4);

output_low(PIN_D3); // Chip select

//Display reset
output_high(PIN_C4); // RES
delay_ms(5);
output_low(PIN_C4); // RES
delay_ms(10);
output_high(PIN_C4); // RES

output_low(PIN_D2); // D/C -> Command mode
spi_write(0x21); // function set: extended instruction set
spi_write(0xC8); // mittlerer Kontrast
spi_write(0x06); // Temp. Ausgleich
spi_write(0x13); // bias 1:48
spi_write(0x20); // function set: normal instruction set
spi_write(0x0C); // display control set normal mode

output_high(PIN_D2); // D/C -> DIsplay mode

spi_write(0xFF);
spi_write(0x00);
spi_write(0xFF);
spi_write(0x00);
spi_write(0xFF);
spi_write(0x00);


while(true) {
}
}


also ich habe jetzt nochmal die Spannungen an den Spannungsteilern gemessen und keine Spannungseinbrüche feststellen können.

Am SCK und SDO habe ich eine Spannung von 3,1V müsste stimmen oder??
Vdd 3,4V
RES 3,1V
D/C 3,1V
und am Vout (von dem pin geht der Elko auf Masse) habe ich 2,1V

mfg

hansen12345
28.02.2009, 16:27
das display kann daten über das spi interface mit maximal 4mhz bearbeiten, du hast aber das spi auf 20mhz/4 eingestellt... also den teiler noch erhöhen.



...
SSPCON1_CKP = 0;
SSPSTAT_CKE = 0;

//int i;
setup_spi(spi_master|SPI_H_TO_L|SPI_CLK_DIV_4);
...
ok, du stellst ckp und cke auf null aber setup_spi(... SPI_H_TO_L...) überschreibt die werte doch wieder mit dem wert den SPI_H_TO_L darstellt.
sehe ich das so richtig?

laut der tabelle die ich gefunden habe ist SPI_H_TO_L gleich ckp=1 und cke =1.
http://www.fernando-heitor.de/component/option,com_smf/Itemid,121/topic,1383.msg6469/#msg6469

doolitle15
28.02.2009, 17:05
hallo

ja stimmt du hattest recht, war ein blödsinn von mir.

Jetzt habe ich noch folgendes geändert: setup_spi(spi_master|SPI_CLK_DIV_16);

dann habe ich das Programm in den pic gespielt und ausprobiert.
das display hat genau das angezeigt was es sollte.

Sooo und dann habe ich die spannungsversorgung unterbrochen und wieder angelegt und jetzt tut sich nichts mehr!! jetzt wird der display controller kaputt sein, das display tut gar nix mehr!!
oder kann das noch andere gründe haben??

mfg

doolitle15
28.02.2009, 17:09
ich bins nochmal.

Das Problem hat sich gelöst. ein schlechter KOntakt an der Versorgung vom LCD.

Vielen dank das ihr mir geholfen habt. Das Display funktioniert einwandfrei!!

Nochmal danke!!

mfg

doolitle15
28.02.2009, 20:14
Jetzt werd ich bald wahnsinnig!!

Das Display hat eine zeitlang super funktioniert!! und dann wollt ichs nochmal einschalten und jetzt tut sich schon wieda nichts, obwohl ich am code nichts geändert habe.

Jetzt habe ich mir schon gedacht das es an der 3,4V Vdd Versorgung liegt, weil im Datenblatt steht max. 3,3V. Joo und jetzt der Controller kaputt ist. kann das sein oder sollten 3,4V eh kein Problem darstellen??

mfg

hansen12345
01.03.2009, 01:33
im datenblatt seite 17 bei "LIMITING VALUES" steht:
1. das an VDD maximal 5 volt anliegen darf wenn die kontrastspannung vom lcd intern erzeugt wird.

2. das die eingänge des displays im high zustand nicht größer als vdd + 0,5 volt sein dürfen.
also z.b. wenn vdd 3,3 volt ist und die eingänge mit 5 volt angesteuert werden könnte es sein das der controller dadurch schaden genommen hat.

nachdem du aber in den datenleitungen spannungsteiler hast und die betriebsspannung von 3,3 volt im normalen arbeits bereich liegt, sollte der display controller eigentlich noch ok sein.

überprüfe nochmal genau alle lötstellen/kontakte.

doolitle15
01.03.2009, 10:42
Hallo!

So hab jetzt alle Lötstellen überprüft und nachgelötet. Sollte jetzt gut verlötet sein.

Wenn ich die Spannungsversorgung einschalte funktioniert das display. schalte ich irgendwann ab und kurze zeit später wieder ein funktioniert es nicht mehr. wenn ich dann nach einiger zeit später(keine ahnung wie lange, bin essen gegangen, war sicha eine halbe stunde weg) schalte ich wieder ein funktionierts plötzlich wieder.
aber wenn ich ausschalte 5min warte oda so dann gehts auch ned.

Woran kann das wieda liegen? kanns sein das ich bei Vout einen größeren Kondensator nehmen sollte??
Oder kann es sein das der CLK teiler schon zu hoch ist. jetzt würde es mit 1,25Mhz laufen. vielleicht ist das schon zu niedrig??
setup_spi(spi_master|SPI_CLK_DIV_16);

mfg

T.J.
01.03.2009, 11:10
wichtig ist, dass die Lötstellen und Kontakte alle OK sind. Darauf bin ich schon oft reingefallen. Hast du irgendwo n Kondi der einen falschen Zustand speichert? Das würde dazu passen, dass es nach lager Zeit wieder geht.

Aber schön, dass es jetzt überhaupt klappt!!!

hansen12345
01.03.2009, 13:22
kanns sein das ich bei Vout einen größeren Kondensator nehmen sollte??
laut datenblatt seite 23 soll man als minimum einen 1µF kondensator nehmen.


jetzt würde es mit 1,25Mhz laufen. vielleicht ist das schon zu niedrig??
seite 20 sagt, frequenzen von 0 bis 4 mhz kann das display bearbeiten.


Woran kann das wieda liegen?
also die fehlerbeschreibung sieht wie T.J. auch schon sagte nach einem kondensator aus der sich nach dem ausschalten nur langsam entleert und dadurch die lange wartezeit verursacht.

doolitle15
01.03.2009, 14:56
Hallo

Jaa ich habe den Übeltäter schon. Es liegt am Elko der von Vout auf Masse geht. Ich habe einen 2,2µF Kondensator sollte also genügen.

Wenn ich einschalte dann lädt sich der auf ca 7 V auf so wie es im Datenblatt steht und wenn ich ausschalte dann entlädt er sich ganz langsam. und wenn er entladen ist dann funktionierts wieder.

So was kann ich jetzt machen damit sich der schneller entlädt. einen widerstand parallel geht ja nicht, da ja sonst keine 7V mehr anliegen.
Wie könnt ich das machen??

mfg

hansen12345
01.03.2009, 16:25
wie verhält sich den das display nach dem ausschalten?
normalerweise sollte es nach dem ausschalten einen schwarzen balken anzeigen der nach kurzer zeit verschwindet, was auf die entladung des elkos hindeutet.

eventuell hilft es was wenn man die kontrastspannung verkleinern:
spi_write(0x90); // Kontrast a+16*b

versuchen könnte man auch bevor man ausschaltet den internen dc/dc wandler für den kontrast abzuschalten z.b. durch einen reset puls wird VOP6 bis VOP0 auf 0 initialisiert.

doolitle15
01.03.2009, 16:41
hmmm , ja manchmal kommt so ein schwarzer balken und manchmal nicht!

und manchmal ist es auch so das die paar pixel die ich anzeigen lassen will, an einer anderen stelle sind als bei vorhergehenden einschalten.

hab jetzt mal die Vop auf 0x90 gestellt aber ist noch immer so wie vorher.

wie soll ich vor dem ausschalten den internen dc/dc ausschalten?
ich weiß ja nicht wann ich ausschalte und wenn ich einmal ausgeschalten habe dann ist es ja zu spät? oder versteh ich da jetzt was falsch??

mfg

hansen12345
01.03.2009, 17:43
wie soll ich vor dem ausschalten den internen dc/dc ausschalten?
ich weiß ja nicht wann ich ausschalte ...
ist schon richtig... aber nur mal zum testen z.b.:
display anschalten ein paar sekunden was anzeigen lassen danach einen reset puls den man erkennt das auf dem lcd nichts mehr angezeigt wird erst dann ausschalten.



hab jetzt mal die Vop auf 0x90 gestellt aber ist noch immer so wie vorher.
initialisiere mal das display nur mit folgenden befehlen ohne die extras wie temp. ausgleich usw.

...
output_low(PIN_D2); // D/C -> Command mode
spi_write(0x21); // function set: extended instruction set
spi_write(0x90); // Kontrast 16
spi_write(0x20); // function set: normal instruction set
spi_write(0x0C); // display control set normal mode

output_high(PIN_D2); // D/C -> DIsplay mode
...

wenn jetzt das problem immer noch da ist, kann es nur noch an der restlichen beschaltung liegen z.b. schlechte kontakte oder weiter kondensatoren in der schaltung die einen falschen zustand speichern.
aber der 2,2µF elko sollte nicht das problem verursachen, hatte auch einen 2,2µF benutzt und das hat einwandfrei funktioniert.


pixel die ich anzeigen lassen will, an einer anderen stelle sind als bei vorhergehenden einschalten.
da must du vorher die ram adresse setzen wo die pixel auftauchen sollen.

doolitle15
01.03.2009, 18:38
soo hab jetzt mein display jetzt mal mit den änderungen ausprobiert, aber ist leider immer noch das selbe wie vorher.
ich versteh nicht warum der Elko durch die änderung der einstellungen sich schneller entladen sollte.
durch die einstellung der Kontrastspannung würde sich ja nur die spannung ändern die am Vout anliegt und somit wird halt auch der elko mit einer niedrigeren spannung geladen(ändert ja dann nix am entladen) oder lieg ich da falsch??
der entladet sich immer noch ganz langsam und erst wenn sobald er entladen ist funktionierts wieder.

ich hab von meinen Elko den + Anschluss auf Vout und den - Anschluss auf masse.. passt ja auch oder?? (irgendwie blöde frage jetzt aber naja man weiß ja nie!)

mfg

hansen12345
01.03.2009, 19:16
ich versteh nicht warum der Elko durch die änderung der einstellungen sich schneller entladen sollte.
so hab ich das nicht gemeint, wollte nur sicher gehen das es nicht an der software liegt. bei mir hat es mit diesen einstellungen und einem 2,2µF elko funktioniert auch wenn ich im sekunden takt an und aus geschalten habe.


...Elko den + Anschluss auf Vout und den - Anschluss auf masse...
ist schon richtig so.



der entladet sich immer noch ganz langsam und erst wenn sobald er entladen ist funktionierts wieder.
wirklich sehr komisch, normalerweise sollte das doch egal sein da der elko eh wieder aufgeladen werden muss.

doolitle15
01.03.2009, 19:26
ja also das mit dem reseten hat funktioniert. also an da software liegts wohl nicht.

hmm sehr komisch!! ich werd mal den Kondensator austauschen!! vielleicht änderts was!

mfg

doolitle15
05.03.2009, 17:38
Hallo

Hab jetzt mal den Kondensator ausgetauscht, aber es ändert nichts. entladet sich weiterhin sehr sehr sehr langsam.

Ich danke euch für eure Hilfe. Jetzt funktioniert das Display wenigstens!!
bis auf das mit dem Elko!
Wenn da vielleicht noch jemand eine Idee hat was das Problem sein könnte dann meldet euch bitte! Danke!

mfg

PICture
05.03.2009, 23:06
Hallo doolitle15!

Ich kann dir wahrscheinlich nicht viel helfen, aber schau dir, bitte, diesen Tread an, vielleicht fällt dir was ein:

https://www.roboternetz.de/phpBB2/viewtopic.php?p=124669#124669

MfG

doolitle15
28.03.2009, 11:21
Hallo ich bins mal wieder mit einem neuen Problem!*g*

Ich habe jetzt mal ein Display aus einem nokia 5110 (LPH7366) ausgebaut und an mein Board angeschlossen. Ich habe auf dem Board die 8 Pin Buchse auf 9 Pins erweitert und so umgeändert wie es hundertemale im Internet zu finden ist. Habe den stecker vom 3310 display auch so umgeändert dass ich dieses display auch auf der 9 pin buchse anschließen kann.

Bei dem LPH7366 kommt ja nur der OSC Pin dazu den man einfach auf Vdd anschließt und sonst ist dieses display ja genau gleich wie das vom 3310er!

Naja wenn ich jetzt das 3310 anschließe dann funktioniert dieses (bis auf das Problem das wir hier schon besprochen haben) und wenn ich das LPH7366 anschließe dann geht gar nichts!!
irgendwie seltsam oder?? muss man beim LPH7366 irgendwas umstellen (also bei den init werten)??

danke schon im voraus

mfg