Back again still no solution to my problem but the solution is near
I contacted the support of ITEAD Studion and get a lot of help from an hardware engineer from ITEAD.
He send me a code which works much better than the UTouch library.
Her is the code I'm Using for now:
/**********************************************
Pay an attention!
This code is designed for Arduino Mega board.
**********************************************/
/**********************************************
Define zone
**********************************************/
#define RS 38
#define WR 39
#define CS 40
#define RST 41
#define T_CLK 6
#define T_CS 5
#define T_DIN 4
#define T_DOUT 3
#define T_IRQ 2
#define X_CONST 800
#define Y_CONST 480
#define PREC_TOUCH_CONST 10
#define PixSizeX 4.7
#define PixOffsX 200
#define PixSizeY 7.3
#define PixOffsY 250
/* LCD color */
#define White 0xFFFF
#define Black 0x0000
#define Blue 0x001F
#define Blue2 0x051F
#define Red 0xF800
#define Magenta 0xF81F
#define Green 0x07E0
#define Cyan 0x7FFF
#define Yellow 0xFFE0
/**********************************************
Val Zone
**********************************************/
int TP_X,TP_Y;
/**********************************************
Standard C functions zone
**********************************************/
unsigned int HDP=799;
unsigned int HT=928;
unsigned int HPS=46;
unsigned int LPS=15;
unsigned char HPW=48;
unsigned int VDP=479;
unsigned int VT=525;
unsigned int VPS=16;
unsigned int FPS=8;
unsigned char VPW=16;
void write_command(unsigned int c)
{
digitalWrite(CS,LOW);
digitalWrite(RS,LOW);
PORTA = c >> 8;
PORTC = c;
digitalWrite(WR,LOW);
digitalWrite(WR,HIGH);
digitalWrite(CS,HIGH);
}
void write_data(unsigned int c)
{
digitalWrite(CS,LOW);
digitalWrite(RS,HIGH);
PORTA = c >> 8;
PORTC = c;
digitalWrite(WR,LOW);
digitalWrite(WR,HIGH);
digitalWrite(CS,HIGH);
}
extern void write_dc(unsigned char d1,unsigned char d2)
{
digitalWrite(CS,LOW);
digitalWrite(RS,HIGH);
PORTA=d1;
PORTC=d2;
digitalWrite(WR,LOW);
digitalWrite(WR,HIGH);
digitalWrite(CS,HIGH);
}
void SetXY(unsigned int X,unsigned int Y)
{
write_command(0x002A);
write_data(X>>8);
write_data(X&0x00ff);
write_data(HDP>>8);
write_data(HDP&0x00ff);
write_command(0x002b);
write_data(Y>>8);
write_data(Y&0x00ff);
write_data(VDP>>8);
write_data(VDP&0x00ff);
write_command(0x002c);
}
void LCD_clear()
{
unsigned int l=800,w;
SetXY(0,0);
while(l--)
{
for(w=0;w<480;w++)
{
write_data(0x0000);
}
}
}
void Lcd_Init(void)
{
pinMode(RS,OUTPUT);
pinMode(WR,OUTPUT);
//pinMode(RD,OUTPUT);
pinMode(CS,OUTPUT);
pinMode(RST,OUTPUT);
DDRA = 0xff;
DDRC = 0xff;
digitalWrite(RST,LOW);
delay(10);
digitalWrite(RST,HIGH);
delay(20);
write_command(0x00E2); //PLL multiplier, set PLL clock to 120M
write_data(0x001e); //N=0x36 for 6.5M, 0x23 for 10M crystal
write_data(0x0002);
write_data(0x0004);
write_command(0x00E0); // PLL enable
write_data(0x0001);
delay(1);
write_command(0x00E0);
write_data(0x0003);
delay(1);
write_command(0x0001); // software reset
delay(1);
write_command(0x00E6); //PLL setting for PCLK, depends on resolution
write_data(0x0003);
write_data(0x00ff);
write_data(0x00ff);
write_command(0x00B0); //LCD SPECIFICATION
write_data(0x0027);
write_data(0x0000);
write_data((HDP>>8)&0X00FF); //Set HDP
write_data(HDP&0X00FF);
write_data((VDP>>8)&0X00FF); //Set VDP
write_data(VDP&0X00FF);
write_data(0x0000);
write_command(0x00B4); //HSYNC
write_data((HT>>8)&0X00FF); //Set HT
write_data(HT&0X00FF);
write_data((HPS>>8)&0X00FF); //Set HPS
write_data(HPS&0X00FF);
write_data(HPW); //Set HPW
write_data((LPS>>8)&0X00FF); //Set HPS
write_data(LPS&0X00FF);
write_data(0x0000);
write_command(0x00B6); //VSYNC
write_data((VT>>8)&0X00FF); //Set VT
write_data(VT&0X00FF);
write_data((VPS>>8)&0X00FF); //Set VPS
write_data(VPS&0X00FF);
write_data(VPW); //Set VPW
write_data((FPS>>8)&0X00FF); //Set FPS
write_data(FPS&0X00FF);
write_command(0x00BA);
write_data(0x000F); //GPIO[3:0] out 1
write_command(0x00B8);
write_data(0x0007); //GPIO3=input, GPIO[2:0]=output
write_data(0x0001); //GPIO0 normal
write_command(0x0036); //rotation
write_data(0x0000);
write_command(0x00F0); //pixel data interface
write_data(0x0003);
delay(1);
LCD_clear();
write_command(0x0029); //display on
write_command(0x00BE); //set PWM for B/L
write_data(0x0006);
write_data(0x00f0);
write_data(0x0001);
write_data(0x00f0);
write_data(0x0000);
write_data(0x0000);
write_command(0x00d0);
write_data(0x000d);
}
void Touch_Init(void)
{
pinMode(T_CLK, OUTPUT);
pinMode(T_CS, OUTPUT);
pinMode(T_DIN, OUTPUT);
pinMode(T_DOUT, INPUT);
pinMode(T_IRQ, INPUT);
digitalWrite(T_CS, HIGH);
digitalWrite(T_CLK, HIGH);
digitalWrite(T_DIN, HIGH);
digitalWrite(T_CLK, HIGH);
}
void Touch_WriteData(unsigned char data)
{
unsigned char temp;
unsigned char nop;
unsigned char count;
temp=data;
digitalWrite(T_CLK,LOW);
for(count=0; count<8; count++)
{
if(temp & 0x80)
digitalWrite(T_DIN, HIGH);
else
digitalWrite(T_DIN, LOW);
temp = temp << 1;
digitalWrite(T_CLK, LOW);
nop++;
digitalWrite(T_CLK, HIGH);
nop++;
}
}
unsigned int Touch_ReadData()
{
unsigned char nop;
unsigned int data = 0;
unsigned char count;
for(count=0; count<12; count++)
{
data <<= 1;
digitalWrite(T_CLK, HIGH);
nop++;
digitalWrite(T_CLK, LOW);
nop++;
if (digitalRead(T_DOUT))
data++;
}
return(data);
}
void Touch_Read()
{
unsigned long tx=0;
unsigned long ty=0;
digitalWrite(T_CS,LOW);
for (int i=0; i<PREC_TOUCH_CONST; i++)
{
Touch_WriteData(0x90);
digitalWrite(T_CLK,HIGH);
digitalWrite(T_CLK,LOW);
ty+=Touch_ReadData();
Touch_WriteData(0xD0);
digitalWrite(T_CLK,HIGH);
digitalWrite(T_CLK,LOW);
tx+=Touch_ReadData();
}
digitalWrite(T_CS,HIGH);
TP_X=tx/PREC_TOUCH_CONST;
TP_Y=ty/PREC_TOUCH_CONST;
}
char Touch_DataAvailable()
{
char avail;
avail = !digitalRead(T_IRQ);
return avail;
}
int Touch_GetX()
{
int value;
value =800-((TP_X-PixOffsX)/PixSizeX);
if (value < 0)
value = 0;
return value;
}
int Touch_GetY()
{
int value;
value =((TP_Y-PixOffsY)/PixSizeY);
if (value < 0)
value = 0;
return value;
}
void Pant(unsigned int c)
{
int i,j;
SetXY(0,0);
for(i=0;i<Y_CONST;i++)
{
for(j=0;j<X_CONST;j++)
{
write_data(c);
}
}
}
void setup()
{
Lcd_Init();
Touch_Init();
LCD_clear();
Pant(0xffff);
Pant(0x0000);
Serial.begin(115200);
}
void loop()
{
unsigned int i,j;
while(Touch_DataAvailable() == 1)
{
Touch_Read();
i = Touch_GetX();
j = Touch_GetY();
Serial.print("X: ");
Serial.print(i);
Serial.print(" ");
Serial.print("Y: ");
Serial.println(j);
}
}
there is only one simple problem with touching. When I start touching it gives bad coordinates for the first cycles. Until it is touched the coordinates are perfect on every point of the screen. But when touching ends there is the same problem as it is on the beginning the coordinates get bad again.
So I need to filter the first and last coordinates out. Ignoring the first coordinates is no problem. a simple delay() is enough for that but how ignore the last values? Does anyone have an idea?