DOGM132 SPI ansteuerung

Gast #880073
Lesenswert?

Guten Abend,
weiß jemand wie dieses Display richtig angeschlossen wird ?
Ich habe es wie bei den Examples im Datenblatt  angeschlossen.
SCK --->29 CLK
MISO --> 39 RS
MOSI --> 28 SI
SS -->38 CSB

Irgendwie vermute ich das die Belegung falsch zugeordnet ist.

auf 29 habe ich eine Tackt von ca 500kHz
auf 28 ein Signal

Ich verwende das Programm auf einem ATMEGA8535
Beitrag "Mega32/Mega8 SPI funktioniert nicht"
#include <avr/io.h>

void SPI_MasterInit(void);
void SPI_MasterTransmit(char);


void main(void)
{
for{,,}
{
  SPI_MasterInit();
  while(1)
  {
    SPI_MasterTransmit(0xEE);

  }
}
}


void SPI_MasterInit(void)
{
/* Set MOSI, SCK and /SS output, all others input */
DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}


void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}
Gast #880401
Lesenswert?

hab mal nachgeschaut:

SI auf MOSI
SCL auf SCK
A0 auf freien I/O
/CS auf freien I/O
/RS auf freien I/O


i/o mit rs immer auf 1 (ausser für nen reset)
i/o mit cs ist 0-Aktiv, sonst 1
A0 wie benötigt

am besten zwischen jedem befehl kurze pause per delay oder wie auch 
immer


zum senden dann:
1
  unsigned char spidata; //hier das zu sendende datum rein
2

3
  SPDR = spidata;  //Daten in SPDR (Write) register schreiben
4
  
5
  while(!(SPSR & 0x80));   //Auf fertige Übertragung(Flag) warten
6
  
7
  return 0;  //Funktion mit Code 0 verlassen

MfG
#880539
Lesenswert?

Ich habe festgestellt, daß es auf jeden Fall notwendig ist, einen 
Display-Reset vor der Initialisierung durchzuführen (also kurz auf Low, 
dann wieder auf High). Hierfür solltest Du auf jeden Fall noch einen 
I/O-Pin spendieren.

RES kann natürlich auch an den MISO-Pin, wenn man die SPI-Schnittstelle 
nicht anderweitig benutzt und knapp an I/O-Pins ist. Das Display liefert 
keine Daten und deshalb bleibt der MISO-Pin in der Regel frei.

Zwischen den Befehlen ist KEIN! Delay notwendig. Alleine die serielle 
Übertragung reicht als Delay für das Display aus (steht auch so im 
Datenblatt).

Erwin
Gast #882620
Lesenswert?

Super, das Display geht nun so halbwegs. also es zeigt Müll an während 
ich den  AVR Programmiere. Es war die falsche Schaltung ! Die für EA 
DOGMxxx-A.
Ich habe aber ein EA DOGM132B-5.

Jedoch reagiert es Irgendwie nicht auf meine Befehle.

Also Schaltung Display sohlte nun richtig sein. Es  zeigt wires zeug an 
b.z.w. ein komplett weises Bild. Lösche ich den AVR löscht sich auch das 
Display.

Die SPI Schnittstelle am AVR geht, also auf SCK kommt ein Tackt von 8 
Impulsen, und wehrend diesen Impulsen werden passend auf MOSI die Bits 
übertragen.

AO habe ich an SS/PB4 und MISO /PB6 an CS. Diese 2 Schalte ich ein 
b.z.w.
aus (siehe Code).

Ich vermute hier liegt der Fehler!

CS geht laut Datenblatt zu beginn auf 0.
AO wird 1 und 0 zu beginn des Sendens. Siehe Bild.
Ich habe AO auch länger da gelassen, nach dem senden erst eingeschaltet 
...
Alles keine Wirkung.


Was mache ich  noch falsch ?

Wie sende ich Buchstaben oder muß ich jedes Pixel senden.

Wie setze ich ein Pixel?
Angehängte Dateien:
#883912
Lesenswert?

ich schicke mal ein paar Schnippsel aus meinem Code, damit funktioniert 
es bei mir... keine Delays (nur nach einem Hardware-Reset), SPI-Clock 
4MHz, die Init-Sequenz ist 1:1 aus dem Datenblatt...

1
static const PROGMEM unsigned char init_seq[]={
2
    0x0E,  // length of init sequence
3
    0x40,  // Display start line 0
4
    0xA1,  // ADC reverse *)
5
    0xC0,  // Normal COM0~COM31
6
    0xA6,  // Display normal
7
    0xA2,  // Set bias 1/9 (Duty 1/33)
8
    0x2F,  // Booster, Regulator and Follower on
9
    0xF8,  // Set internal Booster to 3x / 4x
10
    0x00,
11
    0x23,  // Contrast set
12
    0x81,
13
    0x1F,
14
    0xAC,  // No indicator
15
    0x00,  // Display on
16
    0xAF
17
};
18

19
void glcd_init(void) {
20
  uint8_t i, length;
21

22
  length = init_seq[0];
23
  GLCD_RESET_lo;
24
  wait(100);
25
  GLCD_RESET_hi;
26

27
  for (i=0; i<length; i++){
28
    glcd_command(pgm_read_byte_near(&init_seq[i+1]));
29

30
  }
31
}
32

33
void glcd_data(uint8_t data) {
34
  GLCD_EN_lo;
35
  GLCD_DATA;
36
  spi_out(data);
37
  while (!spiDone);
38
  GLCD_DATA;
39
  GLCD_EN_hi;
40
}
41

42
void glcd_command(uint8_t command) {
43
  GLCD_EN_lo;
44
  GLCD_COMMAND;
45
  spi_out(command);
46
  while (!spiDone);
47
  GLCD_DATA;
48
  GLCD_EN_hi;
49
}

ich lasse A0 während der ganzen Übertragung im jeweiligen Zustand... 
geht lt. Datenblatt auch anders, aber warum soll ich da 
zwischenreinfunken während der Hardware SPI-Teil die Bits rausschiebt... 
ach ja, spiDone sagt mir ob die Übertragung fertig ist oder nicht... 
geht entweder über den Interrupt
1
ISR(SPI_STC_vect)
 oder auch mit einem Makro zur Abfrage des entsprechenden Flags - wie es 
einem eben gefällt

man kann sicher noch an dem ein oder anderen noch feilen, aber damit 
klapperts einwandfrei, Punkte, Linien, Kreise, Texte etc. über die 
üblichen Verdächtigen - dazu kannst du einfach nochmal die Forumssuche 
bemühen...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren