www.mikrocontroller.net

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


Autor: Markus R. (maggus)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>

#define LCD_CS PB1    // 0 = active
#define LCD_DC PB0    // command: DC = 0   |    data: DC = 1
#define LCD_RES PD7    // 0 = reset
#define SS PB2
#define MOSI PB3
#define MISO PB4
#define SCK PB5

#define LCD_ENABLE   PORTB&=~(1<<LCD_CS)
#define LCD_DISABLE PORTB|=(1<<LCD_CS)
#define LCD_DATA   PORTB|=(1<<LCD_DC)
#define LCD_COMMAND PORTB&=~(1<<LCD_DC)

// prototypes:
void lcd_command(unsigned char command);
void lcd_data(unsigned char data);
unsigned char spi_putc(unsigned char byte_in);



int main(void)
{  
  DDRD |= (1<<LCD_RES);
  PORTD &= ~(1<<LCD_RES);
  DDRB |= ((1<<SS) | (1<<LCD_CS) | (1<<LCD_DC) | (1<<SCK) | (1<<MOSI));  // output
  DDRB &= ~(1<<MISO); // input
  PORTB |= ((1<<SS) | (1<<LCD_CS) | (1<<LCD_DC));  // pullups
  
  // low pulse to RES-pin to enable LCD
  _delay_ms(100);
  PORTD |= (1<<LCD_RES);
  
  // enable spi
  SPCR |= ((1<<SPE)|(1<<MSTR)|(1<<SPR0)); //Enable SPI, SPI in Master Mode, presc = 16
  

  
  lcd_command(0x21);
  lcd_command(0xC8);
  lcd_command(0x06);
  lcd_command(0x13);
  lcd_command(0x20);
  lcd_command(0x0C);
  
  _delay_ms(100);
  
  lcd_data(0x1F);
  lcd_data(0x1F);
  lcd_data(0x1F);
  
  
  
  
  while(1)
  {
  }
}



void lcd_command(unsigned char command)
{
  LCD_ENABLE;
  
  LCD_COMMAND;
  
  spi_putc(command);
  
  LCD_DISABLE;
}

void lcd_data(unsigned char data)
{
  LCD_ENABLE;
  
  LCD_DATA;
  
  spi_putc(data);
  
  LCD_DISABLE;
}


unsigned char spi_putc(unsigned char byte_in)
{
  SPDR = byte_in;
  while(!(SPSR & (1<<SPIF)));  //Wartet bis Byte gesendet wurde
  unsigned char byte_out = SPDR;
  return byte_out;
}

Gruß,
Markus

Autor: Markus R. (maggus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner ne Idee? Das 3310 Display haben doch schon viele verwendet...

Autor: Markus R. (maggus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Browncoat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
SPI_Send(0x21,CMD);
SPI_Send(0x11,CMD); 
SPI_Send(0x9C,CMD); 
SPI_Send(0x20,CMD); 
SPI_Send(0x0C,CMD); 
SPI_Send(0x40,CMD);
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

Autor: Browncoat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
SPI_Send(0x21,CMD); //Erweiterter Kommandomodus
SPI_Send(0x09,CMD); //Int. HV Generator
SPI_Send(0xFF,CMD); //Vop Max.
SPI_Send(0x16,CMD); //Bias = 2
SPI_Send(0x06,CMD); //Temp. Koeff. =2
SPI_Send(0x20,CMD); //Standart Kommandomodus
SPI_Send(0x0C,CMD); //normaler Modus (invertiert = 0x0D)

MfG BC

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.