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 ATMEGA8535Beitrag "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)));
}
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
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
unsignedcharspidata;//hier das zu sendende datum rein
2
3
SPDR=spidata;//Daten in SPDR (Write) register schreiben
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
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?
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
staticconstPROGMEMunsignedcharinit_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
voidglcd_init(void){
20
uint8_ti,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
voidglcd_data(uint8_tdata){
34
GLCD_EN_lo;
35
GLCD_DATA;
36
spi_out(data);
37
while(!spiDone);
38
GLCD_DATA;
39
GLCD_EN_hi;
40
}
41
42
voidglcd_command(uint8_tcommand){
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...