Forum: Mikrocontroller und Digitale Elektronik 3410 display an AVR, code funktioniert nicht


von Markus R. (maggus)


Lesenswert?

Hallo zusammen,

ich möchte ein LCD aus einem NOKIA 3410 per Mega8 ansteuern (Hardware 
SPI). Ich habe mir also das Datenblatt des PCD 8544 und ein paar fertige 
Codes aus dem Netz angeschaut. Die Ansteuerung des Displays sollte ja 
genauso wie beim 3310 funktionieren.

Folgenden Code habe ich dann mal zum initialisieren des Displays 
geschrieben. Alles was das Display nach dem Einschalten der 
Betriebsspannung macht ist, dass der untere Rand des Displays kurz 
aufflackert, dann wird nichts angezeigt. Nach dem Ausschalten wird dann 
noch für ein paar Sekunden (abhängig von der Größe des Kondensators an 
Vlcd) eine horizontale Linie angezeigt. Diese erscheint an rein 
zufälliger Stelle.

Weiß jemand, was an meinem Code fehlt?

Verwendede HW: Mega8L8 @3,0V 4,0Mhz ext. Quarz
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <util/delay.h>
4
5
#define LCD_CS PB1    // 0 = active
6
#define LCD_DC PB0    // command: DC = 0   |    data: DC = 1
7
#define LCD_RES PD7    // 0 = reset
8
#define SS PB2
9
#define MOSI PB3
10
#define MISO PB4
11
#define SCK PB5
12
13
#define LCD_ENABLE   PORTB&=~(1<<LCD_CS)
14
#define LCD_DISABLE PORTB|=(1<<LCD_CS)
15
#define LCD_DATA   PORTB|=(1<<LCD_DC)
16
#define LCD_COMMAND PORTB&=~(1<<LCD_DC)
17
18
// prototypes:
19
void lcd_command(unsigned char command);
20
void lcd_data(unsigned char data);
21
unsigned char spi_putc(unsigned char byte_in);
22
23
24
25
int main(void)
26
{  
27
  DDRD |= (1<<LCD_RES);
28
  PORTD &= ~(1<<LCD_RES);
29
  DDRB |= ((1<<SS) | (1<<LCD_CS) | (1<<LCD_DC) | (1<<SCK) | (1<<MOSI));  // output
30
  DDRB &= ~(1<<MISO); // input
31
  PORTB |= ((1<<SS) | (1<<LCD_CS) | (1<<LCD_DC));  // pullups
32
  
33
  // low pulse to RES-pin to enable LCD
34
  _delay_ms(100);
35
  PORTD |= (1<<LCD_RES);
36
  
37
  // enable spi
38
  SPCR |= ((1<<SPE)|(1<<MSTR)|(1<<SPR0)); //Enable SPI, SPI in Master Mode, presc = 16
39
  
40
41
  
42
  lcd_command(0x21);
43
  lcd_command(0xC8);
44
  lcd_command(0x06);
45
  lcd_command(0x13);
46
  lcd_command(0x20);
47
  lcd_command(0x0C);
48
  
49
  _delay_ms(100);
50
  
51
  lcd_data(0x1F);
52
  lcd_data(0x1F);
53
  lcd_data(0x1F);
54
  
55
  
56
  
57
  
58
  while(1)
59
  {
60
  }
61
}
62
63
64
65
void lcd_command(unsigned char command)
66
{
67
  LCD_ENABLE;
68
  
69
  LCD_COMMAND;
70
  
71
  spi_putc(command);
72
  
73
  LCD_DISABLE;
74
}
75
76
void lcd_data(unsigned char data)
77
{
78
  LCD_ENABLE;
79
  
80
  LCD_DATA;
81
  
82
  spi_putc(data);
83
  
84
  LCD_DISABLE;
85
}
86
87
88
unsigned char spi_putc(unsigned char byte_in)
89
{
90
  SPDR = byte_in;
91
  while(!(SPSR & (1<<SPIF)));  //Wartet bis Byte gesendet wurde
92
  unsigned char byte_out = SPDR;
93
  return byte_out;
94
}

Gruß,
Markus

von Markus R. (maggus)


Lesenswert?

Hat keiner ne Idee? Das 3310 Display haben doch schon viele verwendet...

von Markus R. (maggus)


Lesenswert?

Falls jemand mal vor dem gleichen Problem steht:

Das LCD vom 3410 ließ sich mit diesen Befehlen NICHT ansteuern. Mit 
einem 3310 Display funktioniert es wunderbar.

von Browncoat (Gast)


Lesenswert?

Hallo, habe momentan genau das gleiche Problem, 3310 Display 
funktioniert einwandfrei, das vom 3410 spricht nicht. Hab die 
Initialisierung etwas abgeändert, da ist dann schonmal ein kurzes 
Flackern beim starten zu sehen, das wars aber auch schon. Die 
Initialisierung sieht folgendermaßen bei mir aus:
1
SPI_Send(0x21,CMD);
2
SPI_Send(0x11,CMD); 
3
SPI_Send(0x9C,CMD); 
4
SPI_Send(0x20,CMD); 
5
SPI_Send(0x0C,CMD); 
6
SPI_Send(0x40,CMD);
7
SPI_Send(0x80,CMD);

Die Kontrastspannung liegt hier auch nur bei 6V, beim 3310 Display ist 
die bei etwa 9V.

Ansonsten soll ja die Ansteuerung des 3310 Displays (PCF8812 oder 
OM6026) zum 3310 Display (PCD8544) identisch sein.

Hat jemand noch nen Hinweis für mich?

MfG BC

von Browncoat (Gast)


Lesenswert?

So, also jetzt funktioniert es. Der PCF8812 scheint weniger Tolerant als 
der PCD8544 zu sein. Die Initialisierungsroutine des PCF(3410) 
funktioniert auch mit dem PCD(3310), umgekehrt aber nicht. Das Problem 
bei mir, war die zu geringe Kontrastspannung (Vop). Mit folgender 
Initialisierung funktiniert es jetzt.
1
SPI_Send(0x21,CMD); //Erweiterter Kommandomodus
2
SPI_Send(0x09,CMD); //Int. HV Generator
3
SPI_Send(0xFF,CMD); //Vop Max.
4
SPI_Send(0x16,CMD); //Bias = 2
5
SPI_Send(0x06,CMD); //Temp. Koeff. =2
6
SPI_Send(0x20,CMD); //Standart Kommandomodus
7
SPI_Send(0x0C,CMD); //normaler Modus (invertiert = 0x0D)

MfG BC

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.