Forum: Mikrocontroller und Digitale Elektronik ST7565r graphic LCD initialisieren AVR


von Michael (Gast)


Lesenswert?

Ich versuche nun schon seit geraumer Zeit ein EA DOGL128B graphic 
Display an einem Atmega328p zum laufen zu bringen.

Das Display habe ich nach der im Datenblatt gezeichneten "Dual-Supply" 
Schaltung angeschlossen, wobei die Spannung für den Kontrast aus einem 
12V Netzteil geliefert wird.

Die 12V werden dann per 7805 auf 5V heruntergeregelt und dann durch den 
Spannungsabfall an drei Dioden auf 3V gebracht, welche den Controller 
sowie V0 bis V4 am Display versorgen.

Das das nicht ganz ideal ist, ist mir zwar durchaus bewusst, aber einen 
Linearregler für 3V habe ich im Moment leider nicht zur Hand.

Die Anschlüsse des Displays habe ich wie folgt an den Controller 
gehängt:

SI -> MOSI
RESET -> PD2
CS -> PB1
SCL -> SCK
A0 -> PB0

kommuniziert wird per SPI über einen st7565r Displaycontroller.

Leider tut sich bei meinem Versuch das Display zu initialisieren 
überhaupt nichts, auch wenn der Display-Modus auf reverse geändert wird, 
was meiner Meinung nach ja ein invertieren des Hintergrund auch ohne 
senden eines Frames zu Folge haben sollte.

Code verwende ich folgenden:
1
void dogm_send_command(unsigned char data)
2
{
3
  PORTB = 0b00000000;
4
  SPDR = data;
5
}
6
7
int main (void)
8
{
9
10
  DDRD = 0xff;
11
12
  //reset auf high
13
  PORTD = 0b00000100;
14
15
  //A0 auf low -> commands senden, CS auf low
16
  DDRB |= 0b00000011;
17
  PORTB = 0b00000000;
18
19
  //Spi initialisieren
20
  SPCR = 0b010111001;
21
22
  //display reset
23
  PORTD = 0b00000000;
24
  _delay_ms(50);
25
  PORTD = 0b00000100;
26
27
  //display initialisieren
28
  dogm_send_command(0x40);
29
  dogm_send_command(0xA1);
30
  dogm_send_command(0xC0);
31
  dogm_send_command(0b10100111);
32
  dogm_send_command(0xA2);
33
  dogm_send_command(0x2B);
34
  dogm_send_command(0x27);
35
  dogm_send_command(0x81);
36
  dogm_send_command(0x10);
37
  dogm_send_command(0xAC);
38
  dogm_send_command(0x00);
39
  dogm_send_command(0xAF);
40
}

Datenblätter:

dogl128-6e: http://www.lcd-module.de/eng/pdf/grafik/dogl128-6e.pdf
st7565r: http://www.lcd-module.de/eng/pdf/zubehoer/st7565r.pdf

von Michael U. (amiga)


Lesenswert?

Hallo,

Michael schrieb:
> Die 12V werden dann per 7805 auf 5V heruntergeregelt und dann durch den
> Spannungsabfall an drei Dioden auf 3V gebracht, welche den Controller
> sowie V0 bis V4 am Display versorgen.

Verstehe ich nicht so ganz: an V0...V4 hängen doch nur die Kondensatoren 
für die internen LCD-Teilspannungen dran?

Gruß aus Berlin
Michael

von Michael (Gast)


Lesenswert?

ok, mein fehler hab mich beim verfassen des Textes wohl ein wenig 
vertan.
V0 bis V4 liegen natürlich auf Potenzial.

und VDD sowie VDD2 an den 3V.

von GG (Gast)


Lesenswert?

Servus,

du mußt SCK, MOSI, CS als Ausgang definieren.

#define LCD_CS    4  // PB4   = Select      PIN 40
#define SPI_SCK   7  // PB7   = SPI SCK     PIN 37
#define SPI_MOSI  5  // PB5   = SPI MOSI    PIN 36
#define SPI_MISO  6  // PB6   = SPI MISO
#define LCD_A0    0  // PB0   = Display A0  PIN 38
#define LCD_RST   1  // PB1   = Display Res PIN 39

DDRB  |= (1 << LCD_RST) | (1 << LCD_A0) | (1 << SPI_MOSI) | (1 << 
SPI_SCK)|(1 << LCD_CS) | (0 << SPI_MISO);


// SPI Init

SPCR = (1 << SPE) | (1 << MSTR) | (0 << SPR1) | (0 << SPR0); // 4 MBit 
SPI
SPSR = 0;

delay_ms(2); // wichtig

Außerdem die Wartezeit bei der Übertragung einhalten

#define Spi_Busy()          while(!(SPSR & (1<<SPIF)))

// Daten zum Display ausgeben

uint8_t Spi_Io(uint8_t  b)
{
  SPDR = b;
  while (!(SPSR & (1 << SPIF))); //warten bis gesendet
  b =SPDR;
  return SPDR;
}


Den PORTB z.B. als  0b00000000 auf "0" oder "1" setzen ist gefährlich,
nimm lieber PORTB|=(1 << LCD_RST)/PORTB &= ~(1 << LCD_RST)her.

Gruß gg

von Michael (Gast)


Lesenswert?

danke,
es funktioniert aber leider noch immer nicht.

glg

von GG (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe Dir mal meine kompletten Code beigelegt.

Bitte SPI Port an eigenen Proz. anpassen.



Gruß GG

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.