Autor Tema: Funciones para controlador Touch Screen ADS7843  (Leído 14446 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Funciones para controlador Touch Screen ADS7843
« en: 03 de Noviembre de 2010, 13:40:19 »
Hola! Les dejo un par de funciones para controlar una pantalla touch que utilice este controlador, busqué por la web y no encontré nada  :shock: O no supe buscar  :mrgreen:

Código: C
  1. #define ADS7843_PIN_CS          LATFbits.LATF7  // Salida
  2. #define ADS7843_PIN_BUSY        PORTFbits.RF3   // Entrada
  3. #define ADS7843_PIN_IRQ         PORTDbits.RD4   // Entrada
  4. #define ADS7843_PIN_CLK         LATAbits.LATA4  // Salida
  5. #define ADS7843_PIN_SDO         PORTFbits.RF2   // Entrada
  6. #define ADS7843_PIN_SDI         LATFbits.LATF6  // Salida
  7.  
  8. #define ADS7843_TRIS_CS         TRISFbits.TRISF7
  9. #define ADS7843_TRIS_BUSY       TRISFbits.TRISF3
  10. #define ADS7843_TRIS_IRQ        TRISDbits.TRISD4
  11. #define ADS7843_TRIS_CLK        TRISAbits.TRISA4
  12. #define ADS7843_TRIS_SDO        TRISFbits.TRISF2
  13. #define ADS7843_TRIS_SDI        TRISFbits.TRISF6
  14.  
  15. #define __delay_CLK_ADS7843()   {Nop();Nop();} // 200nS --> (5 Mips, PIC24)
  16.  
  17. //#define ADS7843_USE_12BITS
  18. #if defined(ADS7843_USE_12BITS)
  19.         #define ADS7843_READ_X          0b10010000 // IRQ Enable
  20.         #define ADS7843_READ_Y          0b11010000
  21.         typedef UINT16                          UINT_COORDxy;
  22. #else
  23.         #define ADS7843_READ_X          0b10011000 // IRQ Enable         
  24.         #define ADS7843_READ_Y          0b11011000
  25.         typedef UINT8                           UINT_COORDxy;
  26. #endif
  27.  
  28. #define PIN_INPUT       1
  29. #define PIN_OUTPUT      0
  30.  
  31. typedef struct{
  32.         UINT_COORDxy    x;
  33.         UINT_COORDxy    y;
  34.         // ...
  35. }TOUCH_DATA;
  36.  
  37.  
  38. void vInitADS7843(void);
  39. UINT_COORDxy ADS7843WriteAndReadData(UINT8);
  40. void vTestTouchPanel(TOUCH_DATA *Data);

Código: C
  1. void vInitADS7843(void){
  2.        
  3.         ADS7843_TRIS_CS=PIN_OUTPUT;
  4.         ADS7843_TRIS_BUSY=PIN_INPUT;
  5.         ADS7843_TRIS_IRQ=PIN_INPUT;
  6.         ADS7843_TRIS_CLK=PIN_OUTPUT;
  7.         ADS7843_TRIS_SDO=PIN_INPUT;
  8.         ADS7843_TRIS_SDI=PIN_OUTPUT;
  9.  
  10.         ADS7843_PIN_CS=1;
  11.         ADS7843_PIN_SDI=0;
  12.         ADS7843_PIN_CLK=0;
  13.        
  14.         return;
  15. }
  16. /*****************************************************************/
  17. void vTestTouchPanel(TOUCH_DATA *Data){
  18.         UINT16 TempX,TempY;
  19.         UINT8 k;
  20.        
  21.         DelayMs(1);
  22.        
  23.         TempX=0;TempY=0;
  24.         for(k=0;k<8;k++){
  25.                 TempX+=ADS7843WriteAndReadData(ADS7843_READ_X);
  26.                 TempY+=ADS7843WriteAndReadData(ADS7843_READ_Y);
  27.         }
  28.        
  29.  
  30.         Data->x=(TempX>>3);
  31.         Data->y=(TempY>>3);
  32.        
  33.         return;
  34. }
  35. /*****************************************************************/
  36. UINT_COORDxy ADS7843WriteAndReadData(UINT8 Data){
  37.         UINT8 k;
  38.         UINT_COORDxy Temp;
  39.        
  40.         ADS7843_PIN_CS=0;
  41.         __delay_CLK_ADS7843();
  42.         // En cada flanco ascendente se toma el dato:
  43.        
  44.         for(k=0;k<8;k++){
  45.                 ADS7843_PIN_SDI=!!(Data&0x80);
  46.                 __delay_CLK_ADS7843();
  47.                 ADS7843_PIN_CLK=1;
  48.                 __delay_CLK_ADS7843();
  49.                 Data<<=1;
  50.                 ADS7843_PIN_CLK=0;
  51.                
  52.         }
  53.         __delay_CLK_ADS7843(); // Esperamos busy:
  54.         ADS7843_PIN_CLK=1;
  55.         __delay_CLK_ADS7843();
  56.         ADS7843_PIN_CLK=0;
  57.         __delay_CLK_ADS7843();
  58.         ADS7843_PIN_CLK=1;
  59.         while(ADS7843_PIN_BUSY==1); //
  60.         // En flanco descendente leemos data desde el ADS7843:
  61.         Temp=0;
  62.         #if defined(ADS7843_USE_12BITS)
  63.         for(k=0;k<12;k++){
  64.         #else
  65.         for(k=0;k<8;k++){
  66.         #endif
  67.                 Temp<<=1;
  68.                 ADS7843_PIN_CLK=0;
  69.                 Temp+=ADS7843_PIN_SDO;
  70.                 __delay_CLK_ADS7843();
  71.                 ADS7843_PIN_CLK=1;
  72.         }
  73.         __delay_CLK_ADS7843();
  74.         ADS7843_PIN_CLK=0;
  75.         ADS7843_PIN_CS=1;
  76.        
  77.         return(Temp);
  78. }
  79. /*****************************************************************/

Recuerden que este controlador tiene el pin PENIRQ (Necesita pull-up externa de 100k) que es llevado a 0 lógico cuando ocurre una pulsación sobre la pantalla, y allí pueden llamar a la función vTestTouchPanel(..) que devolverá las coordenadas x,y de donde ha ocurrido dicha pulsación.


Saludos!
« Última modificación: 07 de Noviembre de 2010, 01:03:12 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado chichepic

  • PIC12
  • **
  • Mensajes: 56
    • MidiQuet
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #1 en: 27 de Noviembre de 2010, 08:01:52 »
Gracias maestro!  :-/ :-/ :-/   van a ser muy utiles. Me imagino que con esos controladores debe mejorar mucho el rendimiento de estas pantallas. Pudiste probar ambas opciones (con o sin controlador) ? hay mucha diferencia?
El codigo que subiste creo funciona perfectamente con el otro controlador para las de 5 hilos.
Subo los 2 Pdf para que esten a mano.
http://focus.ti.com/lit/ds/symlink/ads7843.pdf
http://www.lcdinfo.ru/pdf/TI/adc/ads7845.pdf
donde se consiguen en Argentina?
saludos!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #2 en: 27 de Noviembre de 2010, 12:35:06 »
Hola! En Argentina no se consiguen, en este caso es un TFT con Touch Screen que se consiguió por Ebay. Para usar el conjunto (Touch Screen y TFT) hice una plaquita para el mbed y el resultado:

(Un video de muy mala calidad  :( pero el celu se esfuerza  :mrgreen: )

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado chichepic

  • PIC12
  • **
  • Mensajes: 56
    • MidiQuet
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #3 en: 28 de Noviembre de 2010, 09:08:09 »
Muy Bueno! se ve que trabaja muy bien! Crei que para los de 4 hilos aca se conseguia ese controlador, que lastima....
El mayor problema que tengo con estas "touch" es cuando se utiliza el dedo para un desplazamiento (la superficie de apoyo es muy amplia), con los "lapices" trabaja mucho mejor (punto apoyo fino). Esto lo he mejorado con alguna funcion de promedio y ciertos delays, pero no me convence demasiado, supongo se mejora con estos controladores.
Hasta tuve la idea de hacer una funcion que solo detecte una superficie amplia y no un punto ... en realidad lo hice para crear "teclas",es decir si el "datoEntrada" es  > o < de una coord preestablecida y de la otra...esto nos da un area , pero fija... asi armamos las "teclas" ...
pero esto seria inverso : si el dato oscila entre ciertos valores (seria un rango de superficie) lo de como valido , promedio y listo ..
sera necesario? alguna idea?
saludos.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #4 en: 28 de Noviembre de 2010, 10:20:34 »
En mi caso implemento una demora de 1ms y tomo un promedio de 8 muestras. Con el dedo ha funcionado bien, claro que para la selección de opciones, para dibujar no xD


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #5 en: 28 de Noviembre de 2010, 13:27:31 »
En mi caso implemento una demora de 1ms y tomo un promedio de 8 muestras. Con el dedo ha funcionado bien, claro que para la selección de opciones, para dibujar no xD


Saludos!
:mrgreen: Suky tu donde trabajas? no se como sacas tanto tiempo pa desarrollar tantas cosas!  :D

me quito el sombrero mi hermano! tengo varias personas a cargo y para hacer un circuito que hace una encuesta MODBUS a una RTU y la envía por serial a la PC se demoraron 10 meses!!

« Última modificación: 30 de Noviembre de 2010, 22:24:57 por fidodido18 »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #6 en: 28 de Noviembre de 2010, 14:13:52 »
En mi caso implemento una demora de 1ms y tomo un promedio de 8 muestras. Con el dedo ha funcionado bien, claro que para la selección de opciones, para dibujar no xD


Saludos!
:mrgreen: Suky tu donde trabajas? no se como sacas tanto tiempo pa desarrollar tantas cosas!  :D

me quito el sombrero mi hermano! tengo varias personas a cargo y para hacer un circuito que hace una encuesta MODBUS a una RTU y la envía por serial a la PC se demoraron 10 meses!!

Lastimosamente me va tocar salir de ellos y encontrar personas como tu que sean proactivos y creativos!


Muchas gracias!  ;-) 10 meses!  Yo, junto a un compañero, hicimos el stack DNP desde 0 en 1 mes  :shock: Nos costo ponernos a trabajar en ello, está todo en ingles  :8} Pero cuando se volvió entretenido nada nos detuvo  :mrgreen:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #7 en: 29 de Noviembre de 2010, 10:20:48 »
En mi caso implemento una demora de 1ms y tomo un promedio de 8 muestras. Con el dedo ha funcionado bien, claro que para la selección de opciones, para dibujar no xD


Saludos!
:mrgreen: Suky tu donde trabajas? no se como sacas tanto tiempo pa desarrollar tantas cosas!  :D

me quito el sombrero mi hermano! tengo varias personas a cargo y para hacer un circuito que hace una encuesta MODBUS a una RTU y la envía por serial a la PC se demoraron 10 meses!!

Lastimosamente me va tocar salir de ellos y encontrar personas como tu que sean proactivos y creativos!


Muchas gracias!  ;-) 10 meses!  Yo, junto a un compañero, hicimos el stack DNP desde 0 en 1 mes  :shock: Nos costo ponernos a trabajar en ello, está todo en ingles  :8} Pero cuando se volvió entretenido nada nos detuvo  :mrgreen:


Saludos!


que casualidad suky estoy entrando a un proyecto conversor DNP3 a hexascii, donde encontraste info acerca de DNP?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #8 en: 29 de Noviembre de 2010, 10:36:58 »
El libro Practical Modern Scada Protocols es lo más completo que se encuentra y el software ASE es de mucha ayuda.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #9 en: 29 de Noviembre de 2010, 11:03:55 »
El libro Practical Modern Scada Protocols es lo más completo que se encuentra y el software ASE es de mucha ayuda.


Saludos!
EXCELENTE SUKY! No quieres venir a trabajar en Colombia?  :mrgreen:

Desconectado franpemo09

  • PIC10
  • *
  • Mensajes: 2
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #10 en: 09 de Junio de 2011, 02:39:23 »
Hola que tal, soy nuevo en este foro y justamente llegué a él mientras buscaba información de como manejar un ADS7843.

Quiero agradecer a Suky por su gran aporte y considerando que es el autor quizá sea la persona más adecuada para asistirme. De antemano muchas gracias

Resulta que estoy usando un PIC18F4620 @ 24MHz con una GLCD de 320x240 que cuenta con ese integrado, originalmente pensaba usar el spi por hardware pero ya lo tengo ocupado con una memoria SD así que traté de implementar el código de Suky. Mi problema esta en que no sé a que se deba después de correr la inicialización de otros bloques el ads7843_getCoord( ADS7843_DATA *coords) deja de funcionar. Esta en el puerto A desde A1 hasta A5 ya que uso A0 como entrada analogica.

para saber si realmente funcionaba, inmediatamente después del while puse una pequeña rutina para lleer coordenadas e imprimirlas en pantalla para lo que resultó excelente, sin falla alguna. No obstante si pongo ese mismo código después de haber hecho mi rutina de montar el sistema de archivos que nada tiene que ver con el puerto que uso para el ads7843 la rutina deja de funcionar. No tengo la más remota idea de por donde va el problema.

Al imprimir en pantalla siempre me regresa X y Y con un valor absurdo como 8179, para esto el valor máximo después de un ajueste es 320 para x y 240 para y

Espero alguien me pueda orientar para saber donde esta el problema.


Código: C
  1. // Ejemplo de rutina que funciona
  2.  
  3. #include <p18f4620.h>
  4. #include "glcd\__S1D13700__.h"
  5. #include "touchPanel\ADS7843.h"
  6.  
  7. void main(void);
  8.  
  9. ADS7843_DATA coordenadas;
  10. char buffer[100];
  11.  
  12. void main(){
  13.  
  14. unsiged char tpflag = 0;
  15. init_adc();
  16. ads7843_init();
  17. glcd_init();
  18.  
  19. //Prueba//
  20. while(1){
  21.  
  22.    if(ADS7843_IRQ == 0){
  23.      
  24.       if(tpflag == 0){
  25.          ads7843_getCoord(&coordenadas);
  26.          delay_ms(5);
  27.          sprintf(buffer, "x:%i y:%i", coordernadas.x, coordenadas.y);
  28.          joinPGM2RAM("", "", "", 0, 0, 60, BLACK, buffer, "", 1); //funcion propia para poner mensaje en la GLCD
  29.       }
  30.  
  31.    }else{ tpflag = 1;}
  32.  
  33. }
  34. // Termina prueba
  35.  
  36. while(1){
  37.  
  38.       iniciarSistemaDeArchivos();
  39.       imprimirImagen();
  40.      
  41.       elMenu(); // aqui es donde requiero lleer las coordenadas, si pongo el codigo de //Prueba en esta parte deja de funcionar
  42. }
  43.  
  44. }



 Saludos y gracias nuevamente

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #11 en: 09 de Junio de 2011, 15:41:45 »
 :? Es complicado determinar porque falla... Podrías colocar una pequeña demora al testear irq para volverlo a testear y estar seguro que es una condición valida.

Código: [Seleccionar]
unsiged char tpflag = 0;
no te lo marca como error?

No contesto mensajes privados, las consultas en el foro

Desconectado franpemo09

  • PIC10
  • *
  • Mensajes: 2
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #12 en: 09 de Junio de 2011, 18:49:04 »
Hola Suky, muchas gracias por responder. Efectivamente fue un error de "dedo", jeje.

De hecho tengo un led para debug y cada que toco la pantalla se prende, usando el ADS7843_IRQ. Después de rato de indagar lo unico que concluyo es que el integrado esta medio "tocado" ya que si modifico el programa y reprogramo el pic, deja de funcionar. Después de apagar, desconectar el programador de pronto ya funciona perfectamente. Lo deje durante unas horas corriendo para ver si no se bloqueaba y para nada, todo bien.

Aunque no debe ser, por ahora no tengo otro integrado para probar y las cosas "funcionan"

Muchas gracias, nuevamente.

Saludos,

Desconectado gabriel.marttinez.g

  • PIC10
  • *
  • Mensajes: 1
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #13 en: 15 de Febrero de 2012, 01:01:20 »
Hola soy nuevo en el foro, y he conseguido un touch screen y solamente tiene la clave de TFT_230QVT, buscando informacion en internet encontre que es una ITDB02, y contiene un XPT2046 compatible con ADS7843 y sobre el programa que anteriormente ya publicaron y me gustaria experimentar, el detalle es que no tengo las librerias que utilizan #include "glcd\__S1D13700__.h", #include "touchPanel\ADS7843.h" y quisiera ver si me pueden apoyar con el codigo fuente de ambas
librerias ya que es lo unico que me hace falta para poder compilarlo y hacer una aplicacion con el PIC18F4620. Ya que solo he utilizado el PIC18F4550.

Les agradezco de antemano si alguien me puede ayudar.

Saludos!!!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones para controlador Touch Screen ADS7843
« Respuesta #14 en: 15 de Febrero de 2012, 09:10:35 »
Aquí tienes las funciones para el ADS7843, con ello podes armar los archivos *.c y *.h. Del S1D13700 yo no tengo nada.


Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything