ADS7843 dokunmatik panel kontrol

Başlatan muhittin_kaplan, 06 Nisan 2013, 20:57:34

muhittin_kaplan

240x320 ili9325 ve Dokunmatik Paneli ADS7843 chip li board a bağlantısını yaptım.
http://www.ebay.com/itm/121019709027?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1423.l2649

LCD yi kontrol etmekte şu an için bir problemim yok Ama TP  sadece PEN_IRQ yu görebiliyor data felan okuyamıyorum..

while(1)
	  {
	    if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == 0) {
	      TouchX = Read_Y()/12;
	      TouchY = Read_X()/17;

	      if (TouchX > 0 && TouchX < 320 && TouchY > 0 && TouchY < 240) {
	        Pixel(TouchX,TouchY,KIRMIZI);
	    }
	  }

  	}

Buradanda anlaşılacağı üzere GPIOA_11 PEN_IRQ ya bağlı. Ekrana Dokunduğunda bu konut satırının işlediğini görebiliyorum.


int Read_X(void) 
{ 
    int i;
    WR_CMD(CHX);
   // while(TP_BUSY);
    Delayus(5);
    i=RD_AD();
    return i;   
}
//====================================================================================
int Read_Y(void) 
{ 
    int i;
    WR_CMD(CHY);
    //while(TP_BUSY);
    Delayus(5);
    i=RD_AD();
    return i;    
}


CHY 0xd0 eşitlenmiş


static unsigned short RD_AD(void) 
{
    unsigned short buf=0,temp;
    unsigned char i;
    TP_DIN(0);
    TP_DCLK(1);
    for(i=0;i<12;i++) 
    {
        Delayus(5);
        TP_DCLK(0);         
        Delayus(5);   
        temp= (TP_DOUT) ? 1:0;
        buf|=(temp<<(11-i));
        
        Delayus(5);
        TP_DCLK(1);
    }
    TP_CS(1);
    buf&=0x0fff;
    return(buf);
}

HexfeT

#1
TP_CS (chip select) nerede 0 (aktif) ediliyor? Göremedim.

RD_AD fonksiyonunda TP_CS(0) yerine yanlışlıkla TP_DIN(0) yazılmış olabilir mi?

muhittin_kaplan


HexfeT

#3
Google sağolsun kodun aslını bulup baktım.  WR_CMD fonksiyonunda CS 0'a çekiliyormuş. Oradan RD_AD'ye gittiği için sorun bu değil.

CLK, DIN, DOUT pinlerinin doğru konfigüre edilip çıkış verebilir olduğundan ve fiziksel bağlantılarda bir sorun olmadığından emin olmak lazım.

muhittin_kaplan

static void WR_CMD (unsigned char cmd) 
{
    unsigned char buf;
    unsigned char i;
    TP_CS(1);
    TP_DIN(0);
    TP_DCLK(0);
    TP_CS(0);
    for(i=0;i<8;i++) 
    {
        buf=(cmd>>(7-i))&0x1;
        TP_DIN(buf);
        Delayus(5);
        TP_DCLK(1);
        Delayus(5);
        TP_DCLK(0);
    }
}

sadogan

#5
Hocam CCS de donanımsal SPI için yazılmış kod işineze yararmı ?
#define SPI_MODE_0  (SPI_L_TO_H | SPI_XMIT_L_TO_H) 
#define SPI_MODE_1  (SPI_L_TO_H) 
#define SPI_MODE_2  (SPI_H_TO_L) 
#define SPI_MODE_3  (SPI_H_TO_L | SPI_XMIT_L_TO_H) 

#define ADS7843_CS  PIN_C2 
   
ads7843_read_XY(unsigned int16 &_X,unsigned int16 &_Y)
{
   output_low(ADS7843_CS);
   delay_us(2);
   spi_write(0x90); // X kanal
   delay_cycles(2);
   make8(_X,1) = spi_read(0); 
   make8(_X,0) = spi_read(0);
   _X>>=4;
  
   spi_write(0xd0);// Y kanal
   delay_us(2); 
   make8(_Y,1) = spi_read(0); 
   make8(_Y,0) = spi_read(0);
   _Y>>=4;   
   output_high(ADS7843_CS); 

}

//-------------------------------------- 
void ads7843_spi_init(void) 
{ 
output_high(ADS7843_CS); //  
setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_64); 
delay_ms(10); 
}

void main(void) 
{ 

ads7843_spi_init(); 

while(1) 
  {
   unsigned int16 XX,YY;
    ads7843_read_XY(XX,YY);
    printf("X=%LX Y=%LX \n\r",  XX,YY); 
    delay_ms(500); 
  } 

}

M_B

hocam stm32f107 icin yazılmıs touch kodu. bu kod stm32f107 kitimde calısıyor.

ARMJISHU_TouchScreen_ADS7843.c dosyası
/******************** (C) COPYRIGHT 2009 [url=http://www.armjishu.com]www.armjishu.com[/url] ************************
* File Name          : ARMJISHU_TouchScreen_ADS7843.c
* Author             : [url=http://www.armjishu.com]www.armjishu.com[/url] Team
* Version            : V3.0.1
* Date               : 03/20/2010
* Description        : 
                        ADS7843_CS   is PB1
                        ADS7843_INT  is PC1
*******************************************************************************/
#include "ARMJISHU_TouchScreen_ADS7843.h"
#include "stm32f10x.h"
#include <stdio.h>
#include "stm32f10x_exti.h"
#include "ili9320.h"
#include "stm32f10x_tim.h"



#define	CHX 	0x90 	
#define	CHY 	0xD0	

void ADS7843_CS_config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* Enable GPIOB, GPIOC and AFIO clock */
  RCC_APB2PeriphClockCmd(RCC_ADS7843_CS , ENABLE);  //RCC_APB2Periph_AFIO
  
  /* LEDs pins configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_ADS7843_CS;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIO_ADS7843_CS_PORT, &GPIO_InitStructure);
}

static void ADS7843_INT_config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* Enable GPIOB, GPIOC and AFIO clock */
  RCC_APB2PeriphClockCmd(RCC_ADS7843_INT , ENABLE);  //RCC_APB2Periph_AFIO
  
  /* LEDs pins configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_ADS7843_INT;
  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIO_ADS7843_INT_PORT, &GPIO_InitStructure);
}

static void ADS7843_INT_EXIT_Init(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;

    /* Connect Button EXTI Line to Button GPIO Pin */
    GPIO_EXTILineConfig(GPIO_ADS7843_EXTI_PORT_SOURCE, GPIO_ADS7843_EXTI_PIN_SOURCE);  

    /* Configure Button EXTI line */
    EXTI_InitStructure.EXTI_Line = GPIO_ADS7843_EXTI_LINE;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

}

static void ADS7843_InterruptConfig(void)
{ 
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Set the Vector Table base address at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
  
  /* Configure the Priority Group to 2 bits */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  /* Enable the EXTI5 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = GPIO_ADS7843_EXTI_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


static void LCD_BIG_POINT(u16 xScreen, u16 yScreen)
 {
   ili9320_SetPoint(xScreen, yScreen, Magenta);
   ili9320_SetPoint(xScreen-1, yScreen, Magenta);
   ili9320_SetPoint(xScreen+1, yScreen, Magenta);
   ili9320_SetPoint(xScreen, yScreen-1, Magenta);
   ili9320_SetPoint(xScreen, yScreen+1, Magenta);
   ili9320_SetPoint(xScreen-1, yScreen-1, Magenta);
   ili9320_SetPoint(xScreen-1, yScreen+1, Magenta);
   ili9320_SetPoint(xScreen+1, yScreen-1, Magenta);
   ili9320_SetPoint(xScreen+1, yScreen+1, Magenta);

  }

/*=====================================================================*/
u16 _AD2Y(u16 adx) //240
{
  u16 sx=0;
  int r = adx - 200;
  r *= 240;
  sx=r / (4000 - 280);
  if (sx<=0 || sx>240)
    return 0;
  return sx;
}


u16 _AD2X(u16 ady) //320
{
  u16 sy=0;
  int r = ady - 260;
  r *= 320;
  sy=r/(3960 - 360);
  if (sy<=0 || sy>320)
    return 0;
  return sy;
}


	
/*=====================================================================*/

void ADS7843_Init(void)
{
    ADS7843_CS_config();     // ʹÄÜLCD
    ADS7843_CS_HIGH() ;     // ¹Ø±ÕLCD
    SPI1_Config();
    SPI1_Init_For_Byte();
    SPI1_MOSI_HIGH();
    SPI1_SCK_LOW();
    ADS7843_INT_config();
    ADS7843_INT_EXIT_Init();
    ADS7843_InterruptConfig();
}
/*=====================================================================*/
/*=====================================================================*/


void SPI1_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
    
  // Set as Output push-pull - SCK and MOSI
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  
  GPIO_InitStructure.GPIO_Pin = SPI1_SCK | SPI1_MOSI;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(SPI1_PORT, &GPIO_InitStructure);
  
  //SPI_MISO
  GPIO_InitStructure.GPIO_Pin = SPI1_MISO;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(SPI1_PORT, &GPIO_InitStructure);

}

/*=====================================================================*/
void SPI1_Init_For_Byte(void)
{

}

/*=====================================================================*/
static void ADS7843_SPI_Start( void )
{
    ADS7843_CS_HIGH();
    SPI1_MOSI_HIGH();
    SPI1_SCK_LOW();
    ADS7843_CS_LOW();	      		
}

/*=====================================================================*/
static void SPI_MOSI(u8 data)
{
    if(data)
        SPI1_MOSI_HIGH();
    else
        SPI1_MOSI_LOW();
}

/*=====================================================================*/
/*
#define ShortDelayTime 1
#define LongDelayTime (ShortDelayTime*2)
SPI1_Delay_Short()
{
    __IO uint32_t nCount;
    
    for( nCount= 0; nCount < ShortDelayTime; nCount++ );
}
*/
/*=====================================================================*/


/*=====================================================================*/
static void ADS7843_WrCmd(u8 cmd)
{
    u8 buf, i;

    for( i = 0; i < 8; i++ )
    {
        buf = (cmd >> (7-i)) & 0x1 ;	
        SPI_MOSI(buf);	 	
        SPI1_SCK_HIGH();			
        SPI1_SCK_LOW();			
    }
	
}

/*=====================================================================*/
static u16 ADS7843_Read(void)
{
	u16 buf = 0 ;
	u8 i;

    SPI1_SCK_HIGH(); //wait busy
	SPI1_SCK_LOW();	
	for( i = 0; i < 12; i++ )
	{
		buf = buf << 1 ;
		SPI1_SCK_HIGH();
		if ( SPI1_MISO_READ() )	
		{
			buf = buf + 1 ;
		}
		SPI1_SCK_LOW();			
	}

	for( i = 0; i < 3; i++ )
	{
		SPI1_SCK_HIGH();
		SPI1_SCK_LOW();			
	}
    
	return( buf ) ;
}

/*=====================================================================*/
#define  times  4
static void ADS7843_Rd_Addata(u16 *X_Addata,u16 *Y_Addata)
{

	u16		i,j,k,x_addata[times],y_addata[times];
    

        
	for(i=0;i<times;i++)					//²ÉÑù4´Î.
	{
	    ADS7843_SPI_Start();
		ADS7843_WrCmd( CHX ) ;
		y_addata[i] = ADS7843_Read() ;
        ADS7843_CS_HIGH(); 

	    ADS7843_SPI_Start();
		ADS7843_WrCmd( CHY ) ;
		x_addata[i] = ADS7843_Read() ;
        ADS7843_CS_HIGH(); 
	}

	for(i=0;i<times;i++)
	{
    	for(j=times;j<times-1;j++)
    	{
           if(x_addata[j] > x_addata[i])
            {
                k = x_addata[j];
                x_addata[j] = x_addata[i];
                x_addata[i] = k;
            }
         }
    }

	for(i=0;i<times;i++)
	{
    	for(j=times;j<times-1;j++)
    	{
           if(y_addata[j] > y_addata[i])
            {
                k = y_addata[j];
                y_addata[j] = y_addata[i];
                y_addata[i] = k;
            }
         }
    }
	
	
	*X_Addata=(x_addata[1] + x_addata[2]) >> 1;
#ifdef  SIZE_2_8INCH_TFT_LCD
	*Y_Addata = 4095 - ((y_addata[1] + y_addata[2]) >> 1);
#else   // SIZE_3_2INCH_TFT_LCD
        *Y_Addata=(y_addata[1] + y_addata[2]) >> 1;
#endif
}


u16 distence(u16 data1,u16 data2)
{
    if((data2 > data1 + 2) || (data1 > data2 + 2))
    {
        return 0;
    }

    return 1;    
}

/*=====================================================================*/
void ARMJISHU_TouchScreen_ADS7843(void)
{
  u16 xdata, ydata;
  u32 xScreen, yScreen;

    static u16 sDataX,sDataY;
    
   ADS7843_Rd_Addata(&xdata, &ydata);
  xScreen = _AD2X(ydata);
  yScreen = _AD2Y(xdata);

  

 
 
  if((xScreen>1)&&(yScreen>1)&&(xScreen<320-1)&&(yScreen<240-1))
  {
       printf("\n\r%d,%d", xScreen, yScreen);
      if((GPIO_ADS7843_INT_VALID) && distence(sDataX,xScreen) && distence(sDataY,yScreen))
        {
             LCD_BIG_POINT(xScreen, yScreen);
        }
      sDataX = xScreen;
      sDataY = yScreen;
  }
    
}

ARMJISHU_TouchScreen_ADS7843.h dosyası
/******************** (C) COPYRIGHT 2009 [url=http://www.armjishu.com]www.armjishu.com[/url] ************************
* File Name          : ARMJISHU_TouchScreen_ADS7843.h
* Author             : [url=http://www.armjishu.com]www.armjishu.com[/url] Team
* Version            : V3.0.1
* Date               : 03/20/2010
* Description        : 
*******************************************************************************/
#include "stm32f10x.h"
#include "stm32f10x_spi.h"

#define SIZE_3_2INCH_TFT_LCD

/* SPI_1 pins definition for test */
#define SPI1_PORT   GPIOC
#define SPI1_SCK    GPIO_Pin_10
#define SPI1_MISO   GPIO_Pin_11  
#define SPI1_MOSI   GPIO_Pin_12
#define RCC_SPI1    RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO


/* ARMJISHU_TouchScreen_ADS7843 */

#define RCC_ADS7843_CS                         RCC_APB2Periph_GPIOC
#define GPIO_ADS7843_CS_PORT                   GPIOC  
#define GPIO_ADS7843_CS                        GPIO_Pin_9   

#define RCC_ADS7843_INT                        RCC_APB2Periph_GPIOC
#define GPIO_ADS7843_INT_PORT                  GPIOC  
#define GPIO_ADS7843_INT                       GPIO_Pin_5  
#define GPIO_ADS7843_EXTI_LINE                 EXTI_Line5
#define GPIO_ADS7843_EXTI_PORT_SOURCE          GPIO_PortSourceGPIOC
#define GPIO_ADS7843_EXTI_PIN_SOURCE           GPIO_PinSource5
#define GPIO_ADS7843_EXTI_IRQn                 EXTI9_5_IRQn 

#define GPIO_ADS7843_INT_VALID   !GPIO_ReadInputDataBit(GPIO_ADS7843_INT_PORT, GPIO_ADS7843_INT)

/* Select ADS7843: ChipSelect pin low  */
#define ADS7843_CS_LOW()     GPIO_ResetBits(GPIO_ADS7843_CS_PORT, RCC_ADS7843_CS)
/* Deselect ADS7843: ChipSelect pin high */
#define ADS7843_CS_HIGH()    GPIO_SetBits(GPIO_ADS7843_CS_PORT, RCC_ADS7843_CS)

/* pin low  */
#define SPI1_SCK_LOW()     GPIO_ResetBits(SPI1_PORT, SPI1_SCK)
/* pin high */
#define SPI1_SCK_HIGH()    GPIO_SetBits(SPI1_PORT, SPI1_SCK)

/* pin read  */
#define SPI1_MISO_READ()     GPIO_ReadInputDataBit(SPI1_PORT, SPI1_MISO)

/* pin low  */
#define SPI1_MOSI_LOW()     GPIO_ResetBits(SPI1_PORT, SPI1_MOSI)
/* pin high */
#define SPI1_MOSI_HIGH()    GPIO_SetBits(SPI1_PORT, SPI1_MOSI)

void ADS7843_Init(void);
static void ADS7843_INT_EXIT_Init(void);
static void ADS7843_INT_config(void);
static void ADS7843_InterruptConfig(void);
void ADS7843_CS_config(void);
void ADS7843_Init(void);
void SPI1_Config(void);
void SPI1_Init_For_Byte(void);
void SPI1_SendByte(u8 byte);
u8 SPI1_RecvByte(void);
void SPI1_SendWord(u16 word);
u16 SPI1_RecvWord(void);

void ARMJISHU_TouchScreen_ADS7843(void);
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

muhittin_kaplan

pinler uymuyor ama çalışalım bakalım. IRQ yu felan değiştirelim.

muhittin_kaplan

Beceremedim,

Yılmak Yok Çok Çay Az Uyku :)

HexfeT

Asıl dert 7843'den veri okuduktan sonra başlayacak. :)

Ben hala dokunma-bırakma ve çizim sırasında alakasız koordinatlardan kurtulamadım. Panel uçlarına kapasitör koymaktan veri filtrelemeye kadar denedim, ne yaptıysam olmadı. Sanırım touchpanel in 7" ve aşırı dandik olmasından kaynaklanıyor.

XX_CİHAN_XX

Alıntı yapılan: HexfeT - 07 Nisan 2013, 23:54:57
Asıl dert 7843'den veri okuduktan sonra başlayacak. :)

Ben hala dokunma-bırakma ve çizim sırasında alakasız koordinatlardan kurtulamadım. Panel uçlarına kapasitör koymaktan veri filtrelemeye kadar denedim, ne yaptıysam olmadı. Sanırım touchpanel in 7" ve aşırı dandik olmasından kaynaklanıyor.

Çeşitli yazılımsal filtreleme yöntemlerini denediniz mi?
Ben şöyle bir mantık kullanıyorum genelde işe yarıyor,
10 tane ölçüm alıyorum bu ölçümlerden en büyük ve en küçük sayıları hariç tutarak kalan 8 ölçümün aritmetik ortalamasını kullanıyorum.
Daha katı filtrelemeler yapmakta mümkün ama bana bu kadarı çoğu zaman iş görecek sonuç verdi.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

HexfeT

#11
8 örnek aldırıyorum. ilkini dikkate almayıp diğer yedisini küçükten büyüğe sıralıyorum, ortadaki değeri kullanıyorum. Bir işe yaramıyor çünkü saçmalama anında okunan verinin tamamı bir kaç yüz piksel ötede bir yer olabiliyor. Panele iyice bastırarak çizim yapılırsa pek sorun çıkmıyor ama olması gerektiği gibi nazik davranınca sapıtıyor. Yüzeye ne kadar az baskı yapılırsa o kadar fazla saçmalıyor.

XX_CİHAN_XX

Filtreleme süzgecinizi biraz daha daraltın. Touch panelinizin tepki süresi biraz yavaşlar belki ama sapıtma riski azalır.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

muhittin_kaplan

Okumayı becerebilsem Filtreyi Hallederim Düşüncesindeyim..