Forum: Mikrocontroller und Digitale Elektronik Erfahrungen mit diesem TFT ?


von Michael P. (mpl)


Lesenswert?

Morgen!,


hat jemand schon erfahrungen mit diesem LCD gemacht?

http://cgi.ebay.de/3-2-inch-TFT-LCD-module-touch-panel-SD-card-cage-/280575347222?pt=BI_Electrical_Equipment_Tools&hash=item4153980a16


>HX8347-A 240RGBx320 a-Si 262K color TFT controller
>ADS7843 compatible touch panel controller
>Standard SD card cage
>Support 16 bit RGB565 format , can connect any 16 bit data bus
>Onboard 3.3V regulator require a single 5V supply
>3.3V I/O voltage level tolerance

jedoch weiss ich nicht wie ich den C Source auf den Atmega portieren 
kann...

http://www.bestelecs.com/download/lcd_pcb_module/3inch2_tft.zip

von funky (Gast)


Lesenswert?

wenn du Glück hast, hilft Dir das weiter:

http://www.cygnal.org/ubb/Forum1/HTML/003314.html

wobei ich gerade sehe, das das dem Code aus deinem geposteten Zip 
verdächtig ähnlich sieht.
Dann musste noch die Pins in den defines an deinen realen Aufbau 
anpassen.

von Michael P. (mpl)


Lesenswert?

hi,

Danke.

Hab den thread auch schon gefunden... jedoch verstehe ich die kommentare 
nicht - kann kein chinesisch :/

von funky (Gast)


Lesenswert?

sbit LCD_RS = P6^0;   //Êý¾Ý/ÃüÁîÇĐ»»
sbit LCD_REST = P6^1;         //¸´Î»
sbit LCD_WR = P6^2;        //Đ´¿ØÖÆ
sbit LCD_RD =P6^3;        //Á¿ØÖÆ
sbit LCD_CS=P6^4;

diese Makros musst du ersetzen:

ich würde mir für jeden Pin zwei Makros schreiben. Eins setzt das Bit 
eins löscht es.

Und dann ersetzt du alle Anweisungen im Quelltext ala:
LCD_WR=1;    durch deinen neuen Makros LCD_WR_ENABLE
bzw. LCD_WR=0;  durch LCD_WR_DISABLE;   usw


was Du noch beachten musst: Die Datenleitungen.

Im Quelltext sieht das für mich nach 16 Datenleitungen aus?! Kann das 
sein?
Hab mir das Display jetzt nicht näher angeschaut
 P4 = DH;
 P5 = DH>>8;

DH ist dein Datenwort und auf Port 4 wird das LowByte ausgegeben, udn 
auf Port 5 das HighByte. Da musste Du P4 und P5 auch noch entsprechend 
Deiner Verdrahtung anpassen

von Peter (Gast)


Lesenswert?

Michael P. schrieb:
> kann kein chinesisch

Ja wie jetzt ! Eine der meistgesprochenen Sprachen weltweit und Du 
kannst die nicht ;)
Das erste heißt soviel wie "Data/Command Select", die anderen sowas wie 
"Read / Write Signals" und so weiter. Also nicht wirklich hilfreich

von mpl (Gast)


Angehängte Dateien:

Lesenswert?

Hey,

jap sind 16 datenleitungen.....

hab jetzt erstmal die makros angepasst:

1
#include <avr/io.h>
2
#define F_CPU 1600000
3
#include <util/delay.h>
4
5
6
#define CONTROL_PORT   PORTD
7
#define LCD_CS     (1 << 7) // PC7
8
#define LCD_RS     (1 << 6) // PC6
9
#define LCD_WR    (1 << 5) // PC5
10
#define LCD_RD    (1 << 4) // PC4
11
#define LCD_REST  (1 << 3) // PC3
12
13
#define LCD_RS_ON  CONTROL_PORT |= LCD_RS;
14
#define LCD_RS_OFF  CONTROL_PORT &= ~LCD_RS;
15
16
#define LCD_REST_ON  CONTROL_PORT |= LCD_REST;
17
#define LCD_REST_OFF  CONTROL_PORT &= ~LCD_REST;
18
19
#define LCD_WR_ON  CONTROL_PORT |= LCD_WR;
20
#define LCD_WR_OFF  CONTROL_PORT &= ~LCD_WR;
21
22
#define LCD_RD_ON  CONTROL_PORT |= LCD_RD;
23
#define LCD_RD_OFF  CONTROL_PORT &= ~LCD_RD;
24
25
#define LCD_CS_ON  CONTROL_PORT |= LCD_CS;
26
#define LCD_CS_OFF  CONTROL_PORT &= ~LCD_CS;
27
 
28
void delayms(int count)  // /* X1ms */
29
{
30
        int i,j;
31
        for(i=0;i<count;i++)
32
                for(j=0;j<100;j++);
33
}
34
35
void main_Write_COM( int  DH)   //ÃüÁî
36
{  
37
    LCD_RS_OFF;
38
  LCD_CS_OFF;   
39
  P2=DH>>8;  
40
  P0=DH;    
41
  LCD_WR_OFF;
42
  LCD_WR_ON;
43
  LCD_CS_ON;  
44
}
45
46
void main_Write_DATA(int DH)  //Êý¾Ý  
47
{
48
    LCD_RS_ON;
49
  LCD_CS_OFF;            
50
  P2=DH>>8;  
51
  P0=DH;          
52
  LCD_WR_OFF;
53
  LCD_WR_ON;
54
  LCD_CS_ON;  
55
}
56
57
void main_W_com_data( int com1,dat1)  //ÃüÁîÊý¾ÝÒ»Æð 
58
{
59
   main_Write_COM(com1);
60
   main_Write_DATA(dat1);
61
}
62
63
void address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
64
{
65
  main_W_com_data(0x0002,x1>>8);     // Column address start2
66
  main_W_com_data(0x0003,x1);     // Column address start1
67
  main_W_com_data(0x0004,x2>>8);     // Column address end2
68
  main_W_com_data(0x0005,x2);     // Column address end1
69
  main_W_com_data(0x0006,y1>>8);     // Row address start2
70
  main_W_com_data(0x0007,y1);     // Row address start1
71
      main_W_com_data(0x0008,y2>>8);     // Row address end2
72
  main_W_com_data(0x0009,y2);     // Row address end1
73
      main_Write_COM(0x0022);     
74
75
}
76
  
77
void main_init(void)
78
{
79
80
    LCD_REST_ON;
81
    delayms(5);  
82
  LCD_REST_OFF;
83
  delayms(10);
84
  LCD_REST_ON;
85
  delayms(20);
86
87
     //  VENDOR   
88
  main_W_com_data(0x0046,0x00A4);
89
  main_W_com_data(0x0047,0x0053);
90
  main_W_com_data(0x0048,0x0000);
91
  main_W_com_data(0x0049,0x0044);
92
  main_W_com_data(0x004a,0x0004);
93
  main_W_com_data(0x004b,0x0067);
94
  main_W_com_data(0x004c,0x0033);
95
  main_W_com_data(0x004d,0x0077);
96
  main_W_com_data(0x004e,0x0012);
97
  main_W_com_data(0x004f,0x004C);
98
  main_W_com_data(0x0050,0x0046);
99
  main_W_com_data(0x0051,0x0044);
100
    
101
    //240x320 window setting
102
    main_W_com_data(0x0002,0x0000); // Column address start2
103
   main_W_com_data(0x0003,0x0000); // Column address start1
104
   main_W_com_data(0x0004,0x0000); // Column address end2
105
   main_W_com_data(0x0005,0x00ef); // Column address end1
106
    main_W_com_data(0x0006,0x0000); // Row address start2
107
  main_W_com_data(0x0007,0x0000); // Row address start1
108
  main_W_com_data(0x0008,0x0001); // Row address end2
109
  main_W_com_data(0x0009,0x003f); // Row address end1
110
  
111
  // Display Setting
112
  main_W_com_data(0x0001,0x0006); // IDMON=0, INVON=1, NORON=1, PTLON=0
113
  main_W_com_data(0x0016,0x00C8); // MY=0, MX=0, MV=0, ML=1, BGR=0, TEON=0   0048
114
  main_W_com_data(0x0023,0x0095); // N_DC=1001 0101
115
  main_W_com_data(0x0024,0x0095); // PI_DC=1001 0101
116
  main_W_com_data(0x0025,0x00FF); // I_DC=1111 1111
117
  
118
  main_W_com_data(0x0027,0x0002); // N_BP=0000 0010
119
  main_W_com_data(0x0028,0x0002); // N_FP=0000 0010
120
  main_W_com_data(0x0029,0x0002); // PI_BP=0000 0010
121
  main_W_com_data(0x002a,0x0002); // PI_FP=0000 0010
122
  main_W_com_data(0x002C,0x0002); // I_BP=0000 0010
123
  main_W_com_data(0x002d,0x0002); // I_FP=0000 0010
124
  
125
  main_W_com_data(0x003a,0x0001); // N_RTN=0000, N_NW=001    0001
126
  main_W_com_data(0x003b,0x0000); // P_RTN=0000, P_NW=001
127
  main_W_com_data(0x003c,0x00f0); // I_RTN=1111, I_NW=000
128
  main_W_com_data(0x003d,0x0000); // DIV=00
129
  delayms(1);
130
  main_W_com_data(0x0035,0x0038); // EQS=38h
131
  main_W_com_data(0x0036,0x0078); // EQP=78h
132
  main_W_com_data(0x003E,0x0038); // SON=38h
133
  main_W_com_data(0x0040,0x000F); // GDON=0Fh
134
  main_W_com_data(0x0041,0x00F0); // GDOFF
135
  
136
  // Power Supply Setting
137
  main_W_com_data(0x0019,0x0049); // CADJ=0100, CUADJ=100, OSD_EN=1 ,60Hz
138
  main_W_com_data(0x0093,0x000F); // RADJ=1111, 100%
139
  delayms(1);
140
  main_W_com_data(0x0020,0x0040); // BT=0100
141
  main_W_com_data(0x001D,0x0007); // VC1=111   0007
142
  main_W_com_data(0x001E,0x0000); // VC3=000
143
  main_W_com_data(0x001F,0x0004); // VRH=0011
144
  
145
  //VCOM SETTING
146
  main_W_com_data(0x0044,0x004D); // VCM=101 0000  4D
147
  main_W_com_data(0x0045,0x000E); // VDV=1 0001   0011
148
  delayms(1);
149
  main_W_com_data(0x001C,0x0004); // AP=100
150
  delayms(2);
151
  
152
  main_W_com_data(0x001B,0x0018); // GASENB=0, PON=0, DK=1, XDK=0, VLCD_TRI=0, STB=0
153
  delayms(1);
154
  main_W_com_data(0x001B,0x0010); // GASENB=0, PON=1, DK=0, XDK=0, VLCD_TRI=0, STB=0
155
  delayms(1);
156
  main_W_com_data(0x0043,0x0080); //set VCOMG=1
157
  delayms(2);
158
  
159
  // Display ON Setting
160
  main_W_com_data(0x0090,0x007F); // SAP=0111 1111
161
  main_W_com_data(0x0026,0x0004); //GON=0, DTE=0, D=01
162
  delayms(1);
163
  main_W_com_data(0x0026,0x0024); //GON=1, DTE=0, D=01
164
  main_W_com_data(0x0026,0x002C); //GON=1, DTE=0, D=11
165
  delayms(1);
166
  main_W_com_data(0x0026,0x003C); //GON=1, DTE=1, D=11
167
  
168
  // INTERNAL REGISTER SETTING
169
  main_W_com_data(0x0057,0x0002); // TEST_Mode=1: into TEST mode
170
  main_W_com_data(0x0095,0x0001); // SET DISPLAY CLOCK AND PUMPING CLOCK TO SYNCHRONIZE
171
  main_W_com_data(0x0057,0x0000); // TEST_Mode=0: exit TEST mode
172
  //main_W_com_data(0x0021,0x0000);
173
  main_Write_COM(0x0022);  
174
175
}
176
177
178
void Pant(unsigned int color)
179
{
180
  int i,j;
181
  address_set(0,0,239,319);
182
183
    for(i=0;i<320;i++)
184
   {
185
    for (j=0;j<240;j++)
186
       {
187
         main_Write_DATA(color);
188
      }
189
190
    }    
191
}
192
193
main()
194
{
195
  main_init();   //tft³õʼ»¯   
196
197
  while(1)
198
  { 
199
  Pant(0xf800); //ºìÉ«
200
  delayms(1000);
201
  Pant(0X07E0); //ÂÌÉ«
202
  delayms(1000);
203
  Pant(0x001f); //À¶É«  
204
  delayms(1000);
205
    }
206
207
208
209
}


wie mache ich das jetzt mit denn datenleitungen?

is die verdrahtung so ok? wenn ja wo bzw wie definiere ich jetzt die 
datenleitungen?

von Claudio Hediger (Gast)


Lesenswert?

Hast du es inzwischen hinbekommen?

würde mich über deinen neuen code freuen :) Danke

von sven (Gast)


Lesenswert?

hallo,

würde mich auch interessieren ob du es geschafft hast :)

gruß

von Rico (Gast)


Lesenswert?

hab das selbe TFT, habe dieses mit vorhandenen testcode getestet für 
C51, geht super! schöne Farben für den Preis :D
habe auch schon den code für AVR umgesetzt, aber nicht mit Makros 
sondern direkt mit Portansprechen, jedoch werde ich wohle deine Makros 
einbauen, die gefallen mir ganz gut :D

Falls interesse besteht, wäre daran interessiert eine Lib dafür zu 
schreiben für das board, da noch kaum eine tft lib vorhanden ist für avr 
in dem Forum!

von W.S. (Gast)


Lesenswert?

Oh Gott, mir wird schlecht beim Lesen.

Was wollt ihr Unglücksraben denn mit SO EINEM Display an einem SO 
kleinen Atmega anstellen? Im Schneckentempo Klötzchen malen? Es ist ja 
ganz nett, daß dieses Display einen eigenen Controller hat, aber es 
bleibt immer noch die Aufgabe, das Display mit Pixeln zu füllen.

Überdenkt das Ganze lieber noch einmal. Mein Vorschlag - zu dem ich 
dringendst rate - wäre, einen ARM oder Cortex zu nehmen, und zwar so 
einen, der einen vollwertigen Systembus herausgeführt hat, also z.B. 
LPC2214 von NXP oder ein passender STM32 und dazu ein halbes Megabyte 
RAM als 256K x 16. Den RAM werdet ihr dringend benötigen.

Das ist so ungefähr die Controller-Klasse, mit der man auf so einem 
Display was Richtiges anstellen kann. Den RAM braucht man, um dort das 
Bild aufzubauen, incl. Z-Ordnung usw. und dann braucht man eine direkte 
Anbindung des Displays im Adreßraum, damit man es mit einem einzigen 
Schreibbefehl für's BitBlt bedienen kann, also RS an Adreßbit 1 oder 2 
(jedenfalls nicht 0). Mit etwas Glück kann man bei den STM's vielleicht 
das BitBlt per DMA erledigen.

W.S.

von Rico (Gast)


Lesenswert?

es ist mir schon klar das das Display besser für schnellere MCU gedacht 
ist.
aber wenn es so wie in meinem Fall verwendet wird reicht ein atmega ;)

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.