Frage zu Nokia 3310 Display!
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  LCD (CCS)  |  Frage zu Nokia 3310 Display! « vorheriges nächstes »
Seiten: [1] 2 3 4 Nach unten Drucken
Autor Thema: Frage zu Nokia 3310 Display!  (Gelesen 9970 mal)
 
dewey
Jr. Member
**
Offline Offline

Beiträge: 62


Profil anzeigen
« am: April 16, 2009, 10:22:58 »

Hallo

Ich bin dabei ein Nokia 3310 Display anzusteuern und es klappt auch soweit.
Also ich kann schon irgendwelche pixel setzen.

Das Problem ist allerdings, wenn ich die Spannungsversorgung ausschalte muss ich ca. 5-6 Sekunden warten bis ich wieder einschalten kann. Tue ich das nicht und schalte früher ein dann tut das Display gar nichts. Woran könnte das liegen?? Hat jemand eine Idee?
ich habe an dem Vout Pin des Displays einen 2,2µF Elko. Mindestens sollte ein 1µF Eklo dranhängen!
Wenn ich zum Beispiel meinen PIC so programmiere, dass das Display ein Zeichen anzeigen soll, dann 3sek. warten und dann ein weiteres Zeichen anzeigen soll, dann funktioniert das auch nicht.
Ich glaube dass das mit dem zusammenhängt, das man auch 5 Sekunden warten muss bis wieder eingeschaltet werden kann. Aber weiß einfach nicht wie! Habe schon Einstellungswerte geändert aber das bringt auch nichts.
Bin etwas ratlos! Hoffe mir kann jemand helfen und danke schon im Voraus!

mfg dewe

« Letzte Änderung: April 30, 2009, 10:19:27 von dewey » Gespeichert
dewey
Jr. Member
**
Offline Offline

Beiträge: 62


Profil anzeigen
« Antworten #1 am: April 30, 2009, 10:19:55 »

Hallo ich bins nochmal!

Hier noch der code:
Code:
#include<18F4680.h>
#use delay (clock=20000000)
#fuses HS, NOWDT, NOPROTECT, NOLVP
#include<stdlib.h>
#include<stdio.h>

void main (void) {
   int8 i;

   setup_spi(SPI_MASTER | SPI_CLK_DIV_16);
 
   output_low(PIN_D3);  // SCE- Chip enabled
   delay_us(100);
   //Display reset
   output_high(PIN_B0); // RES 
   delay_us(0.5);
   output_low(PIN_B0); // RES 
   delay_ms(25);
   output_high(PIN_B0); // RES 
 
   
   output_low(PIN_D2);  // D/C -> Command mode
   delay_us(100);
   spi_write(0x21);     // function set: extended instruction set
   spi_write(0x90);     // mittlerer Kontrast
   spi_write(0x13);     
   spi_write(0x20);     // display control set normal mode
   spi_write(0x0C);

   spi_write(0x40);     //Set X/Y Position auf 0/0
   spi_write(0x80);

   output_high(PIN_D2);  // D/C -> DIsplay mode
   delay_us(100);   
   for(i=0; i<20; i++) {
      spi_write(0xFF);
   }
   // bis hier funktionierts; ab dem Delay funktionierts nicht mehr
   //delay_ms(1000);  // warte 1Sekunde
   //spi_write(0xAA); // Setze irgendwelche Pixel
   while(true) {}
}


mfg Dewey
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #2 am: April 30, 2009, 10:59:51 »

Versuche mal testweise vor jedem SPI-Transfer ChipSelect auf low, kurz warten (ca. 1µs), SPI-Transfer durchführen, danach ChipSelect wieder auf high.

Du scheinst ja das ChipSelect nur ganz am Anfang auf low zu ziehen und im Folgenden nicht mehr zu verändern. Dafür ist das ChipSelect eigentlich nicht gedacht, womöglich bringt das den LCD-Controller auf die Dauer (besonders nach langen Wartezeiten ohne Kommunikation) aus dem Konzept. Jedenfalls beim 6610-LCD ist mir dieses Verhalten mal aufgefallen.

gruß
daniel
Gespeichert
dewey
Jr. Member
**
Offline Offline

Beiträge: 62


Profil anzeigen
« Antworten #3 am: April 30, 2009, 11:24:14 »

So hab jetzt mal vor jedem SPI Transfer den SCE auf Low gelegt dann ein bissal gewartet und dann auf high gelegt. Leider hat es keine Veränderung gebracht. Muss immer noch so ca 5-10 Sekunden warten.
und jetzt ist mir auch noch aufgefallen das manchmal zwar das richtige angezeigt wird aber nicht ganz.

ALso ich schicke ja in meinem code 20 mal 8bit, und manchmal ist es so das die ersten 10-15 (bit richtig angezeigt werden und die restlichen entweder gar nicht oder nicht richtig angezeigt werden.

Wie sollt ich den ChipSelect sonst verwenden??? ich habe ihn gleich am anfang auf enable gestellt weil ja sonst gar nichts mit dem Display machen kann und ich jetzt mal nur das Display ansteuern möchte und sonst keine anderen Funktionen des PICs verwenden möchte.

Kann es vielleicht sein das ich irgendwo eine Kapazität noch einbauen muss??
Ich habe am Vout Pin 2,2µF - müsste passen.


mfg
« Letzte Änderung: Mai 02, 2009, 09:49:27 von dewey » Gespeichert
dewey
Jr. Member
**
Offline Offline

Beiträge: 62


Profil anzeigen
« Antworten #4 am: Mai 02, 2009, 09:50:15 »

habe jetzt mal auch vom RES pin einen 100nF Kondi auf Masse gelegt, bringt aber leider auch nichts! Lötstellen habe ich auch schon des öfteren überprüft.

Bin echt ratlos!! Verstehe nicht was ich falsch mache im programm! oder am Aufbau!

mfg
dewe
Gespeichert
dewey
Jr. Member
**
Offline Offline

Beiträge: 62


Profil anzeigen
« Antworten #5 am: Mai 07, 2009, 11:10:03 »

Hallo!

So ich habe jetzt mal den Programmcode modular aufgebaut:

sieht jetzt so aus:
Code:
#include<18F4680.h>
#use delay (clock=20000000)
#fuses HS, NOWDT, NOPROTECT, NOLVP

#include<stdlib.h>
#include<stdio.h>

void init_spi();
void init_lcd();
void write_data(int8 data);
void write_command(int8 command);
void write_data(int8 data);
void write_zeichen();
void clear_ram();
void goto_xy(int8 x, int8 y);

void main (void) {
   init_spi();
   init_lcd();
   delay_us(1000);
   write_zeichen();
     
   while(true) { }
}

void init_spi() {
   setup_spi(SPI_MASTER | SPI_CLK_DIV_16);
}

void init_lcd() {
   output_high(PIN_D2);  //COMMAND MODE: D/C -> 1
   output_high(PIN_D3);  // SCE- Chip disabled
   delay_us(100);

   //Display reset
   output_high(PIN_B0); // RES 
   delay_us(0.5);
   output_low(PIN_B0); // RES 
   delay_ms(20);
   output_high(PIN_B0); // RES 
 
   delay_us(100);
   
   write_command(0x21);   // Enhanced mode
   write_command(0x90);   //Vop
   write_command(0x13);   //bias
   write_command(0x20);   //normalmode
   write_command(0x09);   //All on

   clear_ram();   //clear RAM

   write_command(0x08);   // mod control blank change (all off)
   write_command(0x0c);   // mod control normal change
}

void write_data(int8 data) {
   output_high(PIN_D2);  //DATA MODE: D/C -> 1
   delay_us(100);

   output_low(PIN_D3);   // chip enabled
   delay_us(100);   
   spi_write(data);
   output_high(PIN_D3);   // chip disabled
   delay_us(100);
}

void write_command(int8 command) {
   output_low(PIN_D2);  //COMMAND MODE: D/C -> 0
   delay_us(100);

   output_low(PIN_D3);   // chip enabled
   delay_us(100);   
   spi_write(command);
   output_high(PIN_D3);   // chip disabled
   delay_us(100);
}

void write_zeichen() {
   goto_xy(0,0);
   write_data(0xAA);
   write_data(0xFF);
   write_data(0xAA);
   write_data(0xFF);
   write_data(0xAA);
   write_data(0xFF);
   write_data(0xAA);
}

void clear_ram() {
   int8 i;
   
   goto_xy(0,0);
   for (i=504; i>0; i--) {
     delay_us(500);
     write_data(0x00);
  }
}

void goto_xy(int8 x, int8 y) {
   write_command(0x40|(y&0x07));   // Y axe initialisation: 0100 0yyy
   write_command(0x80|(x&0x7f));   // X axe initialisation: 1xxx xxxx
}

Wenn ich jetzt mal das ignoriere, dass ich ca 10 sek warten muss bis das Display wieder funktioniert.
Die clear_ram() Funktion arbeitet auch nicht richtig. ich sehe auf dem Display wie das Command ALL ON ausgeführt wird (also das Display ist schwarz) und die erste Zeile ist dunkel. Aber genau so bleibt das Display und es ändert sich nichts mehr. Ein weiteres Problem ist, wenn ich Daten zum Display hinschicke dann 3sek warte und dann wieder andere Daten hinschicke, macht das Display das auch nicht. Also bis zum delay funktioniert alles wie es soll und dann tut es nichts mehr.
der Controller hängt sich aber nicht auf!

Hängt das vielleicht irgendwie mit den Einstellwerten BIAS und Vop oder so zusammen?? warum funktioniert die clear_ram() Funktion nicht?? Das Display bringt mich echt noch zur verzweiflung!!
will so ein display aber unbedingt ansteuern!!*ggg*
Überall im Internet lese ich das es so funktionieren sollte! und ich finde einfach keinen Fehler!!
Noch etwas seltsames: ich habe zuhause noch ein Display von einem nokia3330 (das selbe display wie im 3310er) und eines von einem 5110 (LPH7366 glaub ich) haben aber alle den Displaycontroller PCD8544 eingebaut und es funktioniert nur das eine 3310 Display und wenn ich eines der anderen anstecke dann tun diese gar nichts! obwohl es die selbe Ansteuerung ist!! verstehe ich auch nicht!

Hoffe es kann mir jemand weiterhelfen!! Bin für jeden Ratschlag und jede idee dankbar!

mfg
Gespeichert
Steffen
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 1235


Profil anzeigen
« Antworten #6 am: Juni 10, 2009, 07:35:10 »

Schon mal bei den Codebeispielen nachgeschaut?
Da findest Du auf jeden Fall ein funktionierendes Programm.

Gruß
Steffen
Gespeichert
dewey
Jr. Member
**
Offline Offline

Beiträge: 62


Profil anzeigen
« Antworten #7 am: Juni 19, 2009, 11:04:15 »

Hallo!

Ja ich habe schon einige Codebeispiele im Netz gefunden und die haben mir auch sehr weitergeholfen! Im Prinzip ist mein Programm so aufgebaut wie jedes gefundene Programm im Netz! Ich kann halt nur nicht den Code kopieren und in meinen Controller hineinspielen, weil ich einen anderen Controller verwende. Aber das dürfte ja kein Problem sein.
Ich habe jetzt ein Oszilloskop und habe mal den SPI Ausgang gemessen ob der PIC die Daten richtig sendet und habe folgendes festgestellt: Der Clock ist einwandfrei. das erste Datenbit geht um 300ns zu früh auf high! sollte aber erst mit der positiven Flanke vom Clock auf high gehn! Anbei habe ich ein Bild eingefügt wo man das deutlich sehn kann!!

Vielleicht liegt das Problem daran das die Serielle Übertragung nicht korrekt ist?
Woran kann das liegen?
Hoffentlich kann mir jemand helfen!! danke schon im Voraus!!

mfg


* Signal2.JPG (777.1 KB, 3072x2304 - angeschaut 219 Mal.)
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #8 am: Juni 19, 2009, 12:25:19 »

das erste Datenbit geht um 300ns zu früh auf high! sollte aber erst mit der positiven Flanke vom Clock auf high gehn!
Na dann musst Du Deine SPI halt mal entsprechend initialisieren.
Auch an dieser Stelle mal wieder der gutgemeinte Rat: verzichte auf die Wrapper-Funktionen vom CCS Compiler.

Du kannst die Clock Polarity sowie die Flanke, bei der das Datenbit übertragen wird über die Bits CKP und CKE in den SSPSTAT und SSPCON1 Registern konfigurieren (siehe Datenblatt). Du solltest anstatt "setup_spi(..)" zu verwenden lieber die Register von Hand beschreiben. Die CCS Wrapper sind leider häufig buggy und machen den Code schwer nachvollziehbar.

Gruß
Daniel
Gespeichert
dewey
Jr. Member
**
Offline Offline

Beiträge: 62


Profil anzeigen
« Antworten #9 am: Juni 20, 2009, 20:17:00 »

Hallo!

Ich bin jetzt auf den HI-tech compiler umgestiegen und hab mal einen code geschrieben der nur den SPI mode aktiviert und ein Datenbyte sendet. Dann habe ich mit dem Oszi gemessen was mein PIC so tut.
Leider kommt das selbe Ergebnis heraus! ich habe ein Bild gemacht wo man erkennen kann, dass das erste Datenbit 300ns vor der positiven Clockflanke auf high geht. beim 3ten Datenbit und bei den restlichen ist es korrekt. (sieht man im Bild sehr gut)

Hier noch der Code:
Code:
#include <htc.h>
#include "spi.h"
#include "always.h"
#include "delay.h"
#include "clk_freq.h" //make sure that PIC_CLK in this file is correctly defined


//__CONFIG
__CONFIG(1, HS);
__CONFIG(2,  PWRTEN & BORDIS & BORV21 & WDTDIS);
__CONFIG(4, LVPDIS);


void init_spi();
void write_command(char command);


void main(void)
{
   init_spi();

   while(1) {
      write_command(0xAA);
   }
}

void init_spi() {
  // PIN RC3 und RC5 als Ausgang definieren
  TRISC3=0;
  TRISC5=0;
  // setup SPI mode
  CKE = 0;
  CKP = 0;
  // Modus: MASTER, Fosc/16
  SSPM0 = 1;
  SSPM1 = 0;
  SSPM2 = 0;
  SSPM3 = 0;
  // enable SPI
  SSPEN = 1;

}

void write_command(char command) {
   SSPBUF = command;
}

Woran kann das liegen? Hab ich vielleicht irgendetwas vergessen zu konfigurieren??

mfg


* signal3.JPG (69.04 KB, 790x477 - angeschaut 157 Mal.)
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #10 am: Juni 21, 2009, 02:10:58 »

Hi,

Zitat
dass das erste Datenbit 300ns vor der positiven Clockflanke auf high geht.
Das ist doch wunderbar korrekt! 0xAA = B'10101010', bei der ersten steigenden Flanke ist also die Datenleitung bei 1, was absolut korrekt ist. Was dich an den 300ns stört, verstehe ich nicht...
Zitat
beim 3ten Datenbit und bei den restlichen ist es korrekt. (sieht man im Bild sehr gut)
Naja, da ist es nicht 100% ersichtlich ob das alles ok ist, dazu ist die zeitliche Auflösung nicht genau genug.
Ich sehe hier keinen Fehler bei der SPI. Ich glaube da ist was anderes faul.
Ist die Leiung denn stark kapazitiv belastet?

Gruß
Stefan
Gespeichert

dewey
Jr. Member
**
Offline Offline

Beiträge: 62


Profil anzeigen
« Antworten #11 am: Juni 21, 2009, 09:51:29 »

Hallo,
Ja ich hab schon soviel ausprobiert und geändert an dem ganzen das ich schön langsam nicht mehr weiß wo ich Fehler suchen soll.*g*
Das Display zeigt ja auch etwas an. Manchmal richtig manchmal falsch! und wenn ich die Spannungsversorgung ausschalte dann muss ich ziemlich lange warten bis sich der Kondensator am Vout Pin entladen hat und erst dann zeigt mir das Display wieder etwas an!
und da habe ich mir gedacht vielleicht liegts daran das die Daten nicht richtig übertragen werden. Mit dem Oszi hab ich dann das mit den 300ns entdeckt und mir gedacht, dass das nicht ganz korrekt ist und das der Fehler möglicherweise da versteckt ist!
Was die Kapazitive Belastung angeht, glaube nicht das sie stark belastet wird. wodurch wird das beeinflusst??
Habe ein ca 20cm langes 8poliges Flachbandkabel von der Platine zum Display. Die 3,3V erreiche ich mit einem Spannungsteiler.

mfg
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #12 am: Juni 21, 2009, 11:38:54 »

Hallo,

Zitat
Was die Kapazitive Belastung angeht, glaube nicht das sie stark belastet wird. wodurch wird das beeinflusst??
Leitungslänge, Leiterbahnbreite, anschlossene IC's
20cm sollten aber ok sein.
Zitat
Die 3,3V erreiche ich mit einem Spannungsteiler.
Welche? Für die Pegel oder gar für die Versorgung?
Stell doch mal den Schaltplan rein, das würde schon helfen.
Zitat
Das Display zeigt ja auch etwas an. Manchmal richtig manchmal falsch! und wenn ich die Spannungsversorgung ausschalte dann muss ich ziemlich lange warten bis sich der Kondensator am Vout Pin entladen hat und erst dann zeigt mir das Display wieder etwas an!
Sowas klingt ein wenig nach falschem Timing bei der Anstuerung (zB SPI zu schnell), möglichweise passt da auch was mit den Logikpegeln nicht.

Gruß
Stefan
Gespeichert

Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #13 am: Juni 21, 2009, 15:43:06 »

Zitat
Leider kommt das selbe Ergebnis heraus! ich habe ein Bild gemacht wo man erkennen kann, dass das erste Datenbit 300ns vor der positiven Clockflanke auf high geht.
So what? Da der Master die Datenleitung bei der steigenden Flanke ändert, muß der Slave sie bei der fallenden Flanke übernehmen. Das erste Datenbit könnte eine Stunde vor der ersten positiven Flanke des Clock-Signals auf "high" gehen und würde selbst dann keinen Fehler in der SPI-Kommunikation hervorrufen.

Ich weiß nicht, welchen SPI-Modus das Nokia-Display verwendet, aber der Motorola SPI-Modus (0,1)

Zitat
Code:
CKE = 0;
CKP = 0;

ist ziemlich unüblich. Ich würde auf den Motorola SPI Modus (0,0) oder (1,1) tippen, d.h. entweder

Code:
CKP = 0;
CKE = 1;

oder

Code:
CKP = 1;
CKE = 0;

Den Zusammenhang zwischen den Motorola SPI Modi, den PIC-Einstellungen und den CCS-Definitionen findest Du hier.

Viele Grüße

Bernd
Gespeichert

Steffen
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 1235


Profil anzeigen
« Antworten #14 am: Juni 22, 2009, 06:36:09 »

Ja ich habe schon einige Codebeispiele im Netz gefunden und die haben mir auch sehr weitergeholfen! Im Prinzip ist mein Programm so aufgebaut wie jedes gefundene Programm im Netz! Ich kann halt nur nicht den Code kopieren und in meinen Controller hineinspielen, weil ich einen anderen Controller verwende.

Ich habe eigentlich die Codebeispiele hier im Forum gemeint. Dort findest Du funktionsfähige Routinen für den CCS Compiler. Damit könntest Du schon mal evtl. Hardwareprobleme ausschliessen.

Gruß
Steffen
Gespeichert
Seiten: [1] 2 3 4 Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.053 Sekunden mit 19 Zugriffen.
 
Top! Top!