Hallo an alle, ich bin dabei ein LCD Module (CFAF320240) mit dem Atmega 128 und STK600 anzusteuern.Mein Display tut nichts wenn ich das test program laufe lasse. Was mache ich falsch ? Bitte um Hilfe ! Danke im voraus #include<avr/io.h> #include <util/delay.h> // control line pins #define LCD_CD PC7 // Command (DC for Parallel Interface) #define LCD_WR PC6 // RW (read an write cycle indicator) #define LCD_RD PC5 // Enable signal or Read strobe signal #define LCD_CS PC4 // Chip Select #define LCD_RES PC2 // RESET // macros for control lines #define CLR_CD PORTC &= ~(1<<LCD_CD); #define SET_CD PORTC |= (1<<LCD_CD); #define CLR_CS PORTC &= ~(1<<LCD_CS); #define SET_CS PORTC |= (1<<LCD_CS); #define CLR_RESET PORTC &= ~(1<<LCD_RES); #define SET_RESET PORTC |= (1<<LCD_RES); #define CLR_WR PORTC &= ~(1 << LCD_WR); #define SET_WR PORTC |= (1 << LCD_WR); #define CLR_RD PORTC &= ~(1 << LCD_RD); #define SET_RD PORTC |= (1 << LCD_RD); // color definitions #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define uint8 unsigned char #define uint16 unsigned int #define uint32 unsigned long /*************************************************/ void delay(unsigned int t) { unsigned char t1; while(t--) for(t1=11;t1>0;t1--) {asm("nop");} } /*************************************************/ void write_command(unsigned int command) { CLR_CS; CLR_CD; SET_RD; SET_WR; PORTA=command; PORTE=command>>8; CLR_WR; SET_WR; SET_CS; } /*************************************************/ void write_data(unsigned int data) { CLR_CS; SET_CD; SET_RD; SET_WR; PORTA=data; PORTE=data>>8; CLR_WR; SET_WR; SET_CS; } /*************************************************/ void initialization() { SET_RD; SET_WR; SET_CS; SET_CD; PORTA=0x00; PORTE=0x00; CLR_RESET; delay(200); SET_RESET; delay(500); write_command(0x0028); // VCOM OTP write_data(0x0006); // Page 55-56 of SSD2119 datasheet write_command(0x0000); // start Oscillator write_data(0x0001); // Page 36 of SSD2119 datasheet write_command(0x0010); // Sleep mode write_data(0x0000); // Page 49 of SSD2119 datasheet write_command(0x0001); // Driver Output Control write_data(0x32EF); // Page 36-39 of SSD2119 datasheet write_command(0x0002); // LCD Driving Waveform Control write_data(0x0600); // Page 40-42 of SSD2119 datasheet write_command(0x0003); // Power Control 1 write_data(0x6A38); // Page 43-44 of SSD2119 datasheet write_command(0x0011); // Entry Mode write_data(0x6870); // Page 50-52 of SSD2119 datasheet write_command(0X000F); // Gate Scan Position write_data(0x0000); // Page 49 of SSD2119 datasheet write_command(0X000B); // Frame Cycle Control write_data(0x5308); // Page 45 of SSD2119 datasheet write_command(0x000C); // Power Control 2 write_data(0x0003); // Page 47 of SSD2119 datasheet write_command(0x000D); // Power Control 3 write_data(0x000A); // Page 48 of SSD2119 datasheet write_command(0x000E); // Power Control 4 write_data(0x2E00); // Page 48 of SSD2119 datasheet write_command(0x001E); // Power Control 5 write_data(0x00BE); // Page 53 of SSD2119 datasheet write_command(0x0025); // Frame Frequency Control write_data(0x8000); // Page 53 of SSD2119 datasheet write_command(0x0026); // Analog setting write_data(0x7800); // Page 54 of SSD2119 datasheet write_command(0x004E); // Ram Address Set write_data(0x0000); // Page 58 of SSD2119 datasheet write_command(0x004F); // Ram Address Set write_data(0x0000); // Page 58 of SSD2119 datasheet write_command(0x0012); // Sleep mode write_data(0x08D9); // Page 49 of SSD2119 datasheet // Gamma Control (R30h to R3Bh) -- Page 56 of SSD2119 datasheet write_command(0x0030); write_data(0x0000); write_command(0x0031); write_data(0x0104); write_command(0x0032); write_data(0x0100); write_command(0x0033); write_data(0x0305); write_command(0x0034); write_data(0x0505); write_command(0x0035); write_data(0x0305); write_command(0x0036); write_data(0x0707); write_command(0x0037); write_data(0x0300); write_command(0x003A); write_data(0x1200); write_command(0x003B); write_data(0x0800); write_command(0x0007); // Display Control write_data(0x0033); // Page 45 of SSD2119 datasheet delay(150); write_command(0x0022); // RAM data write/read } /*************************************************/ void Display_Home() { write_command(0x004E); // RAM address set write_data(0x0000); // Page 58 of SSD2119 datasheet write_command(0x004F); // RAM address set write_data(0x0000); // Page 58 of SSD2119 datasheet write_command(0x0044); // Vertical RAM address position write_data(0xEF00); // Page 57 of SSD2119 datasheet write_command(0x0045); // Horizontal RAM address position write_data(0x0000); // Page 57 of SSD2119 datasheet write_command(0x0046); // Horizontal RAM address position write_data(0x013F); // Page 57 of SSD2119 datasheet write_command(0x0022); // RAM data write/read } /*************************************************/ void LCD_test() { unsigned int i,j; Display_Home(); for(i=0;i<320;i++) { for(j=0;j<240;j++) { if(i>279)write_data(BLACK); else if(i>239)write_data(BLUE); else if(i>199)write_data(GREEN); else if(i>159)write_data(CYAN); else if(i>119)write_data(RED); else if(i>79)write_data(MAGENTA); else if(i>39)write_data(YELLOW); else write_data(WHITE); } } } /*************************************************/ int main() { PORTD = 0xF8; // pull-up on switches, all others off DDRD = 0x0F; // VPP and led pins output DDRA = 0xFF; // low data port, all outputs DDRE = 0xFF; // low data port, all outputs PORTC = 0xFE; // all pins high DDRC = 0xFE; // all outputs delay(0xffff) // Initialize the display initialization(); LCD_test(); delay(0xffff); while (1) { } return 0; }
Du hast das Display falsch angeschlossen: Im 16bit Modus kommen D0-15 vom µC nicht an D0-15 vom LCD, sondern an D1-8 und an D10-17. Der Dotclock ist im µC Interface Modus nicht notwendig. Wie hast du PS0-3 beschaltet?
Hallo Benedikt, danke für dein Antwort. >>Wie hast du PS0-3 beschaltet? ich habe PS0-3 noch nicht beschaltet und werde die PIN 15-18 von LCD auf low setzen (an die Masse anschließen, siehe Datenblatt CFAF320240 Seite 5).Ist es so richtig? >>Der Dotclock ist im µC Interface Modus nicht notwendig meinst du dass ich hier das Dot-clock nicht brauche ? dann werde ich PIN 40 von LCD einfach frei lassen ? >>Du hast das Display falsch angeschlossen Die PORTA und PORTE verwende ich für die Daten.Im Daten Blatt von LCD Seite 5 sind die PIN 19 bis 36 für die Daten vorgesehen.Kannst du mir genau sagen an welche PIN von LCD ich PA0 - PA7 bzw PE0 - PE7 von MCU anschließen soll? so was : PA0 ---> PIN LCD ?? . . PA7 ---> PIN LCD ?? PE0 ---> PIN LCD ?? . . PE7 ---> PIN LCD ?? Danke im voraus
Roger Presi schrieb: > ich habe PS0-3 noch nicht beschaltet und werde die PIN 15-18 von LCD auf > low setzen (an die Masse anschließen, siehe Datenblatt CFAF320240 Seite > 5).Ist es so richtig? Nein, du verwendet den 16bit 8080 Modus. PS1 muss daher an 3,3V, PS0, PS2, PS3 an GND. > meinst du dass ich hier das Dot-clock nicht brauche ? dann werde ich > PIN 40 von LCD einfach frei lassen ? Ja, oder an GND legen wie es das Datenblatt empfiehlt. > Kannst du mir > genau sagen an welche PIN von LCD ich PA0 - PA7 bzw PE0 - PE7 von MCU > anschließen soll? PA0 -> 35 PA1 -> 34 ... PA7 -> 28 PE0 -> 26 PE1 -> 25 ... PE7 -> 19 Pin 36 und 27 kommen an GND.
Danke, ich probiere mal und sage Bescheid. Viele Grüße Roger
Hallo Benedikt, ich habe die Verkabelung genau nach der Anleitung gemacht und das program lafen lassen aber das Display tut immer noch nichts, auch die simple backlight leuchten nicht. Hast du noch eine Idée? ist das Display vielleicht kaputt? Connections mit MCU (siehe attachment) Viele Grüße Roger
Roger Presi schrieb: > ich habe die Verkabelung genau nach der Anleitung gemacht und das > program lafen lassen aber das Display tut immer noch nichts, auch die > simple backlight leuchten nicht. Wenn nichtmal die Hintergrundbeleuchtung leuchtet, hast du irgendwas falsch angeschlossen, mehr als normale LEDs sind das nämlich nicht. > Hast du noch eine Idée? ist das Display vielleicht kaputt? Unwahrscheinlich.
ich habe sogar nur die Backliht angeschlossen und das Display tut auch garnichts.kann jemand eine LED falsch anschließen ? glaube ich nicht !!! PIN 50 --> K1 an die Masse PIN 49 --> A1 an VGT PIN 48 --> A2 an VTG also 3,2v PIN 47 --> K2 an die Masse PIN 44-45 --> VCC also 3V ich denke das Display ist kaputt !!!
Roger Presi schrieb: > > PIN 50 --> K1 an die Masse > PIN 49 --> A1 an VGT > > PIN 48 --> A2 an VTG also 3,2v > PIN 47 --> K2 an die Masse Es sind immer 3 LEDs in Reihe geschaltet, du brauchst also mindestens 10V für das Backlight (Vorwiderstand nicht vergessen!) > ich denke das Display ist kaputt !!! Ich denke das Display ist eine Nummer zu groß für dich...
Hattest Du auch ein Display mit bereits verlötetem Adapter bei LCD-Store bestellt? Das flex-band war da bei mir total schlecht verlötet. Auch bei mir gingen nicht mal die LEDs. Nachdem ich nochmal nachgelötet hatte ging es dann. Ein einfacher Test ist hier alle prot-pins mal der Reihe nach toggeln und messen, ob am Display-Leiterband noch was ankommt. Gute Idee nach dem verlöten ist auch auf den Nachbar-pads nachzumessen, dass da NICHTS ankommt.
Hi MagIO, das flex-band ist ok da das Backlight leuchtet. Das problem liegt am Program.Das Test Program habe ich runtergeladen (Hersteller Seite) und dieses scheint nicht zu funktionieren. Anbei den code: die Fuktion delay dauert ewig. void delay(unsigned int t) { unsigned char t1; while(t--) for(t1=11;t1>0;t1--) {asm("nop");} } wenn ich die Zeit runter setze , das Program bleibt stehen nach der Zeile write_command(0x0028); // VCOM OTP also die Funktion write_command () wird nur einmal aufgerufen und danach bleibt alles stehen. Kannst du mir sagen woran das liegt ? hast einen test Code mit dem ich das Display ausprobieren kann?Ein Hallo World wurde reichen. Danke im voraus Roger
Roger schrieb: > die Fuktion delay dauert ewig. > void delay(unsigned int t) > { > unsigned char t1; > while(t--) > for(t1=11;t1>0;t1--) > {asm("nop");} > } Dem Code nach sollte sie funktionieren. Funktioniert es mit den in deinem Code auskommentierten _delay_ms(200) besser (es reichen eigentlich µs statt ms)? Falls das auch nicht geht, liegt das Problem wo anders (z.B. an den Fusebits). > wenn ich die Zeit runter setze , das Program bleibt stehen nach der > Zeile write_command(0x0028); // VCOM OTP > also die Funktion write_command () wird nur einmal aufgerufen und danach > bleibt alles stehen. Das ist dem Code nach unmöglich. Woher weißt du, dass das Programm dort stehen bleibt?
>>>>Funktioniert es mit den in deinem Code auskommentierten _delay_ms(200) nein, tut das gleiche >>>>Falls das auch nicht geht, liegt das Problem wo anders (z.B. an den Fusebits). was soll ich and das Fusebits noch einstellen ? >>>>>Woher weißt du, dass das Programm dort stehen bleibt? mit F9 bzw F10 kann man das Program im AVR Studion laufen lassen und dabei bleibt der Gelbe Zeiger an diese stehen. Roger
Läuft das ganze bei dir im Simulator, oder über einen Debugger in der Hardware? Wie gesagt: Dem Code nach ist es unmöglich, dass er an der Stelle hängen bleibt. Der Fehler muss also irgendwo anders liegen (z.B. im Simulator/Debugger der ab und zu Probleme hat wenn man die Codeoptimierung des Compilers einschaltet). Schließe z.B. mal eine LED an den µC an, die am Ende der Init angeht.
>>>Läuft das ganze bei dir im Simulator, oder über einen Debugger in der
Hardware?
über einen Debuger also JTAGIE2
Noch eine Anmerkung: Wenn das Program hängen bleibt,verschwindet der
Gelbe Zeiger wenn ich das Program manuel laufe lasse um genau jede
Zeille zu verfolgen
Ich denke,dass Problem liegt an den Fusebits also Program absturtz nach abruf von unterprogram. Kann mir jemand genau sagen wie ich die Fusebits von ATMEGA 128 richtig einstellen kann? Hardware : STK600 Debuger : JTAGICE2 Entwicklungsumgebung : AVR Studio Danke im voraus.
I've got the same display from lcd-store.de, and pritty much the same problem. The backlight does work, but the display does not give any response or what so ever. A guy in this thread: http://www.crystalfontz.com/forum/showthread.php?t=6470 is talking about `` a picture that reminds me on a TV without any signal attached '' after switching on the VDD. Roger, Do you get something like that on the display? (sorry for not speaking german, please respond in german, I do understand the language, but I am not able to create sentences)
Wie man sich ja denken kann hab ich bei Crystalfontz den Thread eingestellt. Das Problem war, wie ja schon geschrieben, der schlecht verlötete Anschluss. Nach dem Nachlöten hatte ich ne Brücke mit eingearbeitet, die die beschriebenen Probleme verursacht hat. Deshalb mein Tipp mit dem Nachmessen. Pins mal der Reihe nach auf 1 legen und messen, ob es auch am Flex-Band ankommt. Und zwar ausschließlich da, wo erwartet. Der Demo-Code scheint so ausgelegt zu sein, daß Port A für das low byte (DB0-DB7) und Port E für das high byte (DB10-DB17) zuständig ist. Der Demo-Code sollte eigentlich funktionieren. Den habe ich 1 zu 1 für den Propeller umgesetzt und da funktioniert es prima. Zum stehenbleiben gibt es eigentlich keinen Grund, da der Controller ja nicht auf feedback wartet. Funktionieren denn noch andere Programme fehlerfrei? Solltest Du in nächster Zeit aufgeben wollen, dann entsorge ich das Display gerne fachmännisch und KOSTENLOS ;o)
Das Problem war die Einstellung des FuseBits M103
Hallo an alle, der Thread ist zwar schon paar monate alt, trotzdem ist es der einzige wo meine Frage reinpasst. Ich hab vor einigen Wochen von unseren (un-)beliebten Chinesen ein TFT- Modul mit Resistivtouch + controller + SD- Card connector gekauft. Als starthilfe für das Display (SSD2119) hat mir die Initalisiserungs- routine von Roger Presi (Danke an dieser Stelle) sehr geholfen. Mittlerweile kann ich 24- Bit Bitmaps von einer SD- karte lesen und auf dem TFT anzeigen. Der Touchcontroller spricht auch mit mir. Jetzt geht es um die Implementierung von verschiedenen Fonts. Um die BMP's nicht um 180° verdreht auf dem TFT anzuzeigen hab ich in der Init- routine dem Register "Entry Mode" den Wert 0x6850 statt 0x6870 zugewiesen (Addr. Pointer -> Horizontal: increment / Vertical: decrement) Wenn ich jetzt meine Fonts (Line Scaned, 10x14) auf dem TFT ausgebe fängt er immer in der rechten Ecke des LCD an. Hab schon alle möglichkeiten der Bits ID1:0 sowie AM (SSD2119 Datasheet S.51) ausprobiert aber immer fängt er oben rechts an zu schreiben. Mal mit gespiegelten Buchstaben, mal normal, aber ich bekomme es nicht hin als erste GDDRAM Adresse die linke obere Ecke festzulegen... Kann mir jemand die Augen öfnnen? Ich hoffe es liegt nicht daran dass das Modul aus China ist, hehe :-)
Hallo, nach langem hin und her bin ich selber drauf gekommen. Und wie immer ist es viel simpler als man sich vorstellt: Ich setze das EntryMode register auf 0x6860 damit der AddressCounter mit jedem pixel dekrementiert wird. Für die Font- write funktion definiere ich einen Wert für die linke TFT- Seite (sozusagen text_adresse_0) und zwar ist der genau so groß wie die anzahl der pixel in Horiz- Richtung, also 320. In einer gotoxy(x=10,y=10) - funktion für die textausgabe setze ich dann für die X- Adresse = (text_adresse_0 - x) ein und schon funktionierts wie ich will. MFG Mainster
>aber ich bekomme es nicht hin als >erste GDDRAM Adresse die linke obere Ecke festzulegen... Kann mir jemand >die Augen öfnnen? Ich habe das gleiche Problem. Wie bekommt man den GDDRAM Ursprung in die linke oberer Ecke? Standardmäßig ist der Ursprung offenbar rechts oben, was ungünstig ist. Div. ENTRY-Mode Einstellungen habe ich schon probiert. Mainsters angebotene Lösung, das per Software zu korrigieren, wäre nur eine Notlösung. Im Datenblatt des SSD2119 finde ich bisher keine Lösung. Hier meine Init:
1 | write_command_tft(0x0028); // VCOM OTP |
2 | write_data_tft(0x0006); // Page 55-56 of SSD2119 datasheet |
3 | |
4 | write_command_tft(0x0000); // start Oscillator |
5 | write_data_tft(0x0001); // Page 36 of SSD2119 datasheet |
6 | |
7 | write_command_tft(0x0010); // Sleep mode |
8 | write_data_tft(0x0000); // Page 49 of SSD2119 datasheet |
9 | |
10 | write_command_tft(0x0001); // Driver Output Control |
11 | write_data_tft(0x32EF); // Page 36-39 of SSD2119 datasheet 0011 0010 1110 1111 |
12 | |
13 | write_command_tft(0x0002); // LCD Driving Waveform Control |
14 | write_data_tft(0x0600); // Page 40-42 of SSD2119 datasheet |
15 | |
16 | write_command_tft(0x0003); // Power Control 1 |
17 | write_data_tft(0x6A38); // Page 43-44 of SSD2119 datasheet |
18 | |
19 | write_command_tft(0x0011); // Entry Mode |
20 | write_data_tft(0x6870); // Page 50-52 of SSD2119 datasheet |
21 | |
22 | write_command_tft(0X000F); // Gate Scan Position |
23 | write_data_tft(0x0000); // Page 49 of SSD2119 datasheet |
24 | |
25 | write_command_tft(0X000B); // Frame Cycle Control |
26 | write_data_tft(0x5308); // Page 45 of SSD2119 datasheet |
27 | |
28 | write_command_tft(0x000C); // Power Control 2 |
29 | write_data_tft(0x0003); // Page 47 of SSD2119 datasheet |
30 | |
31 | write_command_tft(0x000D); // Power Control 3 |
32 | write_data_tft(0x000A); // Page 48 of SSD2119 datasheet |
33 | |
34 | write_command_tft(0x000E); // Power Control 4 |
35 | write_data_tft(0x2E00); // Page 48 of SSD2119 datasheet |
36 | |
37 | write_command_tft(0x001E); // Power Control 5 |
38 | write_data_tft(0x00BE); // Page 53 of SSD2119 datasheet |
39 | |
40 | write_command_tft(0x0025); // Frame Frequency Control |
41 | write_data_tft(0x8000); // Page 53 of SSD2119 datasheet |
42 | |
43 | write_command_tft(0x0026); // Analog setting |
44 | write_data_tft(0x7800); // Page 54 of SSD2119 datasheet |
45 | |
46 | write_command_tft(0x004E); // Ram Address Set |
47 | write_data_tft(0x0000); // Page 58 of SSD2119 datasheet |
48 | |
49 | write_command_tft(0x004F); // Ram Address Set |
50 | write_data_tft(0x0000); // Page 58 of SSD2119 datasheet |
51 | |
52 | write_command_tft(0x0012); // Sleep mode |
53 | write_data_tft(0x08D9); // Page 49 of SSD2119 datasheet |
54 | |
55 | // Gamma Control (R30h to R3Bh) -- Page 56 of SSD2119 datasheet
|
56 | write_command_tft(0x0030); |
57 | write_data_tft(0x0000); |
58 | |
59 | write_command_tft(0x0031); |
60 | write_data_tft(0x0104); |
61 | |
62 | write_command_tft(0x0032); |
63 | write_data_tft(0x0100); |
64 | |
65 | write_command_tft(0x0033); |
66 | write_data_tft(0x0305); |
67 | |
68 | write_command_tft(0x0034); |
69 | write_data_tft(0x0505); |
70 | |
71 | write_command_tft(0x0035); |
72 | write_data_tft(0x0305); |
73 | |
74 | write_command_tft(0x0036); |
75 | write_data_tft(0x0707); |
76 | |
77 | write_command_tft(0x0037); |
78 | write_data_tft(0x0300); |
79 | |
80 | write_command_tft(0x003A); |
81 | write_data_tft(0x1200); |
82 | |
83 | write_command_tft(0x003B); |
84 | write_data_tft(0x0800); |
85 | |
86 | write_command_tft(0x0007); // Display Control |
87 | write_data_tft(0x0033); // Page 45 of SSD2119 datasheet |
88 | |
89 | delay(20); |
90 | |
91 | write_command_tft(0x0022); // RAM data write/read |
92 | |
93 | display_home_tft(); |
Hier die nun gefundene Lösung, falls es jemand mal braucht. Es muss das RL-Bit im Driver-Output-Control Register gesetzt werden. Dann stimmen die Koordinaten. 0,0 liegt dann oben links.
1 | write_command_tft(0x0001); // Driver Output Control |
2 | // 0 RL=1 REV=1 GD=1 BGR=0 SM=0 TB=1 0
|
3 | write_data_tft(0x72EF); // Page 36-39 of SSD2119 datasheet 0111 0010 1110 1111 |
Mit TB=0/1 kann man übrigens den Inhalt auch Vertikal spiegeln.
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.