Hallo Jungs.
Sitze gerade an der Programmierung eines LCD der DOGM-Reihe. Speziell
handelt es sich um ein 204A mit dem SSD1803-Controller. Ich bekomme dem
Display einfach kein Leben eingehaucht.
Mein erster Versuch, das Display mit I2C anzusteuern schlug fehl. Jetzt
wollte ich es mal über SPI probieren aber es funzt auch nicht. Habe
schon zwei unterschiedliche Initialisierungssequenzen ausprobiert -
Leider ohne Erfolg.
Hat jemand Erfahrung oder ähnliche Probleme mit dem Display?
Hier auch mal mein Code:
1 | #include <asf.h>
|
2 | #include "Clock.h"
|
3 | #include "ssd1803a.h"
|
4 | #include <util/delay.h>
|
5 |
|
6 |
|
7 | #define F_CPU 32000000UL
|
8 |
|
9 |
|
10 |
|
11 | #define CONTRSTART 35
|
12 | #define CONTRSPAN 15
|
13 |
|
14 |
|
15 | int main(void)
|
16 | {
|
17 | Clock_init(); // Clock ein
|
18 |
|
19 | PORTE_DIRSET = PIN2_bm;;
|
20 | PORTE_OUTCLR = PIN2_bm;
|
21 |
|
22 | SSD1803A_SPI_Init(); // SPIC init
|
23 | _delay_ms(10);
|
24 | SSD1803A_init_reg (); // LCD ILI9325C init
|
25 | _delay_ms(10);
|
26 |
|
27 | SetContrast(35);
|
28 |
|
29 | SetPostion(LINE1);
|
30 | WriteString("Hello World");
|
31 | SetPostion(LINE2);
|
32 | WriteString("4 Lines 20 chars");
|
33 | SetPostion(LINE3);
|
34 | WriteString("3. Zeile");
|
35 | SetPostion(LINE4);
|
36 | WriteString("Def 8 own char: ");
|
37 | WriteChar(0);
|
38 | WriteChar(2);
|
39 |
|
40 |
|
41 |
|
42 | while(1)
|
43 | {
|
44 | PORTE_OUTTGL = PIN2_bm; //Blink an LED
|
45 | _delay_ms(500);
|
46 |
|
47 | WriteIns(0xFF);
|
48 |
|
49 |
|
50 |
|
51 | }
|
52 | }
|
Die Inititlaisierung:
1 | void SSD1803A_init_reg (void)
|
2 | {
|
3 |
|
4 | LCD_Reset();
|
5 |
|
6 | //************* Start Initial Sequence **********//
|
7 | //init Display
|
8 |
|
9 | /*
|
10 | WriteIns(0x3A); //8-Bit data length extension Bit RE=1; REV=0
|
11 | WriteIns(0x09); //4 line display
|
12 | WriteIns(0x06); //Bottom view
|
13 | WriteIns(0x1E); //Bias setting BS1=1
|
14 | WriteIns(0x39); //8-Bit data length extension Bit RE=0; IS=1
|
15 | WriteIns(0x1B); //BS0=1 -> Bias=1/6
|
16 | WriteIns(0x6E); //Devider on and set value
|
17 | WriteIns(0x57); //Booster on and set contrast (BB1=C5, DB0=C4)
|
18 | WriteIns(0x72); //Set contrast (DB3-DB0=C3-C0)
|
19 | WriteIns(0x38); //8-Bit data length extension Bit RE=0; IS=0
|
20 | */
|
21 | //0x3A, 0x0B, 0x06, 0x3D, 0x6E, 0x54, 0x7C, 0x38, 0x0F, 0x01
|
22 |
|
23 |
|
24 | //init Display
|
25 | WriteIns(0x3A); //8-Bit data length extension Bit RE=1; REV=0
|
26 | WriteIns(0x0B); //4 line display
|
27 | WriteIns(0x06); //Bottom view
|
28 | WriteIns(0x3D); //Bias setting BS1=1
|
29 | WriteIns(0x6E); //8-Bit data length extension Bit RE=0; IS=1
|
30 | WriteIns(0x54); //BS0=1 -> Bias=1/6
|
31 | WriteIns(0x7C); //Devider on and set value
|
32 | WriteIns(0x0F); //Booster on and set contrast (BB1=C5, DB0=C4)
|
33 | WriteIns(0x72); //Set contrast (DB3-DB0=C3-C0)
|
34 | WriteIns(0x01); //8-Bit data length extension Bit RE=0; IS=0
|
35 |
|
36 |
|
37 | ClrDisplay();
|
38 | DisplayOnOff(DISPLAY_ON | CURSOR_ON | BLINK_ON);
|
39 |
|
40 |
|
41 | }
|
Die Schreib-Funktion:
1 | void WriteData(char data)
|
2 | {
|
3 | SET_SSD1803A_E_LOW
|
4 |
|
5 | SPIC_DATA=0xFA;//Send 5 synchronisation bits, RS = 0, R/W = 0
|
6 | Spic_Busy();
|
7 | SPIC_DATA=(data & 0x0F);//send lower data bits
|
8 | Spic_Busy();
|
9 | SPIC_DATA=((data>>4) & 0x0F);//send higher data bits
|
10 | Spic_Busy();
|
11 | SSD1803A_E_HIGH
|
12 | }
|
13 | }
|
Vom Code her müsste es doch eigentlich klappen oder sieht jemand einen
Fehler?
Verschaltet habe ich es wie auf dem Bild im Anhang. An SO, SI und SCLK
sind Pull-Up-Widerstände angebracht.
Noch ein anderes Problem: Das 500ms-Delay in der While-Schleife im
Hauptprogramm ist von viel zu kurzer Dauer. Das tatsächliche Delay
beträgt schätzungweise 50ms. Ich schätze das alle anderen Delays in den
Funktionen ebenfalls viel zu kurz sind. F_CPU ist ja eigentlich im
Hauptprogramm definiert und entspricht auch dem eingestellten Takt...
Woran könnte das liegen?
Viele Grüße