Nokia 3310 Display - Keine Ausgabe, kein gar nix

Hallo!
Vielleicht bin ich übermüdet und finde deshalb nix, aber ich bekomm hier so ein Nokia 3310/5110-Display gerade einfach nicht ans Laufen und dachte ich frag mal, ob irgendwer einen Fehler sieht.

Also, das hier ist im Groben meine Schaltung:

Meine Spannungsversorgung kommt mit ziemlich genau 3,3 Volt aus einem Spannungswandler-IC, das läuft auch sehr gut, wie mir Multimeter und die funktionierende Hintergrundbeleuchtung des LCD anzeigen.

Als IC in der Skizze nutze ich dann einen 74HC4050, um von den 5 Volt des Arduino auf meine 3,3 Volt herunterzukommen. Messungen sagen, dass das ebenfalls klappt.

Dann hab ich mein Display wie folgt (Pinnummern in Klammern) angeschlossen:

Display -> 74HC4050 -> Arduino
(3) SCLK I/O 5 (12) (3)
(4) DIN I/O 4 (10) (4)
(5) D/C I/O 3 (06) (5)
(6) CS I/O 2 (04) (6)
(7) RST I/O 1 (02) (7)

Pin 1 des Displays bekommt 3,3 V Versorgungsspannung (aus der gleichen Quelle wie der 74HC4050), Pin 2 liegt auf Masse, der gleichen wie der 74HC4050, der Arduino und die Spannungsversorgung.

Dazu nutze ich folgenden Code:

#define PIN_SCE   7
#define PIN_RESET 6
#define PIN_DC    5
#define PIN_SDIN  4
#define PIN_SCLK  3

#define LCD_C     LOW
#define LCD_D     HIGH

#define LCD_X     84
#define LCD_Y     48

static const byte ASCII[][5] ={
 {0x00, 0x00, 0x00, 0x00, 0x00} // 20  
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
,{0x00, 0x08, 0x1c, 0x3e, 0x7f} // 3c <  modifiziert, ausgefuellter pfeil
,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
,{0x7f, 0x3e, 0x1c, 0x08, 0x00} // 3e >  modifiziert, ausgefuellter pfeil
,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥
,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j 
,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ?
,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f ?
};

/* cursor an x und y position setzen

x: 0 bis 84
y: 0 bis 5

*/
void gotoXY(int x, int y)
{
  LcdWrite( 0, 0x80 | x);  // Column.
  LcdWrite( 0, 0x40 | y);  // Row.  ?
}

// gibt ein bild aus, speicherung als array
void LcdBmp(char my_array[])
{
  for (int index = 0; index < 504; index++)
  {
    LcdWrite(LCD_D, my_array[index]);
  }
}

// einzelnes zeichen ausgeben
void LcdCharacter(char character)
{
  LcdWrite(LCD_D, 0x00);
  for (int index = 0; index < 5; index++)
  {
    LcdWrite(LCD_D, ASCII[character - 0x20][index]);
  }
  LcdWrite(LCD_D, 0x00);
}

// gibt einen string an der cursorposition aus
void LcdString(char *characters)
{
  while (*characters)
  {
    LcdCharacter(*characters++);
  }
}

// loescht den gesamten bildschirm
void LcdClear(void)
{
  for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
  {
    LcdWrite(LCD_D, 0x00);
  }
}

// funktion um das display zu initialisieren
void LcdInitialise(void)
{
  pinMode(PIN_SCE, OUTPUT);
  pinMode(PIN_RESET, OUTPUT);
  pinMode(PIN_DC, OUTPUT);
  pinMode(PIN_SDIN, OUTPUT);
  pinMode(PIN_SCLK, OUTPUT);
  digitalWrite(PIN_RESET, LOW);
  digitalWrite(PIN_RESET, HIGH);
  
  LcdWrite( LCD_C, 0x21 ); // LCD Extended Commands.
  LcdWrite( LCD_C, 0xB1 ); // Set LCD Vop (Contrast). //B1
  LcdWrite( LCD_C, 0x04 ); // Set Temp coefficent. //0x04
  LcdWrite( LCD_C, 0x14 ); // LCD bias mode 1:48. //0x13
  LcdWrite( LCD_C, 0x0C ); // LCD in normal mode. 0x0d for inverse
  
  LcdWrite(LCD_C, 0x20);
  LcdWrite(LCD_C, 0x0C);
}

void LcdWrite(byte dc, byte data)
{
  digitalWrite(PIN_DC, dc);
  digitalWrite(PIN_SCE, LOW);
  shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
  digitalWrite(PIN_SCE, HIGH);
}

void setup(void)
{
  LcdInitialise();
  LcdClear();
}

void loop(void)
{
  LcdInitialise();
  LcdClear();
  gotoXY(0,2);
  LcdString("Test-Output");
  delay(5000);
  
}

Der entspricht im Großen und Ganzen diesem Beispielcode.

Allerdings tut sich sowohl mit Beispielcode als auch mit meinem gar nix auf dem Display. Hat irgendwer zufällig noch was zur Hand oder sieht einen offensichtlichen Fehler?

Danke!

Vielleicht hilft der Schaltplan etwas:
http://www.reifel.org/PICUserInterface/

Hi

Ich hab die Beschaltung des Displays von dieser Seite: module.ro
Die Pin Nummern sind aber dort anders angegeben. Insofern würde es mich nicht wundern, wenn
es bei Dir nicht funktioniert.

Ausserdem ist mir aufgefallen, dass in dem Code der Resetimpuls recht kurz ist. Das Display
braucht einen recht langen reset Impuls.

Oliver

Vielleicht solltest Du dir mal den Code und die Schematik auf dieser Website anschauen:
http://www.nuelectronics.com/estore/index.php?main_page=product_info&products_id=12&zenid=ba14567404f6797ac6b882eea2957bdb

Code:
http://www.nuelectronics.com/download/projects/nokia_3310_lcd_180110.zip

Schematik:
http://www.nuelectronics.com/download/projects/Nokia_3310_lcd.pdf

So ein Problem hatte ich zu Anfang auch, bei mir war es fehlender Kontakt an der Anschlußleiste.

Drück mal während des Reset die Kontaktleiste vorsichtig kräftig gegen das eigentliche Display, ich hatte dann dafür während der weiteren Entwicklung eine Holzwäscheklammer dauerhaft im Einsatz.

Alternativ gibts das Display bei lipoly.de in einer lötfreundlicheren (und beleuchteten) Fassung.
Vorsicht: Benutz für lipoly am Besten eine Wegwerf-EMail; über die EMail, die ich bei denen angegeben hab, bekomm ich seither SPAM und Phishing-Mails ohne Ende, ich gehe mal davon aus, daß deren Datenbank geklaut wurde...

Kurzes Feedback.

Nachdem ich jetzt den Pegelwandler rausgenommen habe, funktioniert das Display.
Problem ist also eingegrenzt und ich werde mich dieses Bauteiles annehmen. :slight_smile:

Rückmeldung folgt. ;-D