Forum: Mikrocontroller und Digitale Elektronik DOGM132 SPI ansteuerung


von Micha (Gast)


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)));
}

von Micha (Gast)


Lesenswert?

Niemand ne Idee, wie habt Ihr das Display verdrahtet ?

von Bernhard (Gast)


Lesenswert?

füge mal als erstes kleine delays ein und mache jeden schritt 
nacheineinander also:

Chipselect, 1ms, datenrein, 1ms, dann a0 , 1ms usw. .. bei mir hat das 
schon geholfen

von Bernhard (Gast)


Lesenswert?

nachtrag:

und RS nicht auf miso!!!!!

das ist ein io pin .. also entweder an nen freien io an der cpu oder 
ganz auf VCC per pullup, aber nicht so

MfG

von Bernhard (Gast)


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

von Micha (Gast)


Lesenswert?

Vielen Dank , werde das heut abend gleich mal testen.

Danke

von Erwin R. (er-tronik)


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

von Thilo M. (Gast)


Lesenswert?


von Micha (Gast)


Angehängte Dateien:

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?

von Micha (Gast)


Angehängte Dateien:

Lesenswert?

Programm

von Micha (Gast)


Lesenswert?

.a

von Micha (Gast)


Lesenswert?

.ab

von Manfred B. (vorbeigeschlendert)


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...

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.