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))); }
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
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
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
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 | 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.