Autor Tema: Touchscreen  (Leído 3482 veces)

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

Desconectado juanez

  • PIC12
  • **
  • Mensajes: 90
Touchscreen
« en: 16 de Septiembre de 2008, 15:12:29 »
Hola, estoy probando un glcd-touchscreen, en concreto este :

http://www.circuit-ed.com/128x64-GLCD-BlWh-w-Touchscreen-P146C8.aspx

El glcd, funciona perfectamente, pero el problema lo tengo con el touchscreen.

Es un touchscreen resistivo, este tiene 4 lineas X+,x-,Y+,y- que van conectadas directamente a las lineas RA0,RA1,RA2,RA3 de un pic 18F4553.

El problema es que no encuentro ninguna libreria para el ccs, y no consigo hacer funcionar el touchscreen correctamente.

En la siguiente pagina de jvm, se puede ver el glcd touchscreen funcionando:

http://www.jvmbots.com/viewtopic.php?t=684&postdays=0&postorder=asc&start=15

El problema es que esta echo en mikrobasik y yo quiero hacerlo con ccs.

El codigo en mikrobasik que se encarga de leer el touchscreen es este:

-------------------------------------------------------------------------------------
LeeTouch:
  ADCON1 = 6
  TRISA.0=0                      ' PORTA.0 es Salida
  TRISA.2=0                      ' PORTA.2 es Salida
  PORTA.0=1                      ' Establecemos PORTA.0 a 1
  PORTA.2=0                      ' Borramos PORTA.2
  TRISA.1=1                      ' PORTA.1 es Entrada
  TRISA.3=1                      ' PORTA.3 es Entrada  (ADC3)
  ADCON1 = 0                     ' Configuracion analogica de PORTA
  Delay_ms(20)                   ' Tiempo de estabilizacion de puerto
  Y = Adc_Read(3)                ' Leer el adc(3) correspondiente al valor de Y

  ADCON1 = 6
  TRISA.1=0                      ' PORTA.1 es Salida
  TRISA.3=0                      ' PORTA.3 es Salida
  PORTA.1=0                      ' Borramos PORTA.1
  PORTA.3=1                      ' Establecemos PORTA.3 a 1
  TRISA.0=1                      ' PORTA.0 es Entrada
  TRISA.2=1                      ' PORTA.2 es Entrada (ADC2)
  ADCON1 = 0                     ' Configuracion analogica de PORTA
  Delay_ms(20)                   ' Tiempo de estabilizacion de puerto
  X = Adc_Read(2)                ' Leer el adc(2) correspondiente al valor de X
-----------------------------------------------------------------------------------------------

EL problema es que en ccs me da error al poner el adcon1.

¿Alguien tienen alguna libreria para el touchscreen?

Saludos

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Touchscreen
« Respuesta #1 en: 16 de Septiembre de 2008, 15:19:19 »
Hola.

La mejor manera de relacionar esa libreria con el CCS es haciendo el direccionamiento de los registros. Esto se hace con las directivas de compilacion #byte y #bit. De esta manera se asigna el label ADCONx al registro ADCONx y puedes usarla tal cual como esta.

Saludos
El papel lo aguanta todo

Desconectado ivan braga

  • PIC12
  • **
  • Mensajes: 77
Re: Touchscreen
« Respuesta #2 en: 17 de Septiembre de 2008, 06:09:51 »
Já adaptei um exemplo em um projeto que fiz.
Em CCS  o codigo
Código: [Seleccionar]
adcon1seria como você colocar desta forma
Código: [Seleccionar]
setup_adc_ports( A0 A1);Esta em MIKROC porem é facilmente adaptavel.
Código: [Seleccionar]
// * Project Name:
//     TouchPanel (Demo for working with TouchPanel Controller)
// * Target Platform:
//     PIC
// * Copyright:
//     (c) mikroElektronika, 2007.
// * Revision History:
//     20071225:
//       - Initial release.
// * Description:
//     this code in intended to work with TouchPanel and GLCD
//     Target devices are PIC16 and PIC18 family MCU's, any speed.
// * Test configuration:
//     MCU:             PIC18F4520
//     Dev.Board:       EasyPic5
//     Oscillator:      HS, 8.000MHz
//     Ext. Modules:    TouchPanel, GLCD
//     SW:              mikroC v8.0
// * NOTES:
//     - Turn off PORTA LEDs, 7Seg Display Switches, ADC jumpers and PORTA pull-up/down resistors.
//     - Turn on GLCD backlight and TouchPanel Contoller switches on EasyPIC5 board.


char write_erase, pen_size;
unsigned int x_coord, y_coord;
long         x_coord128, y_coord64;                       // scaled x-y position
int          cal_x_min, cal_y_min, cal_x_max, cal_y_max;  // calibration constants
char write_msg[] = "WRITE";                               // GLCD menu messages
char clear_msg[] = "CLEAR";
char erase_msg[] = "ERASE";
const unsigned int ADC_THRESHOLD = 900;                   // Threshold value for press detecting

// returns 1 if TouchPanel is pressed, 0 otherwise
char PressDetect() {
  unsigned adc_rd;
  char result;

  // PRESS detecting
  PORTC.F0 = 0;         // DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
  PORTC.F1 = 0;         // DRIVEB = 0 (BOTTOM drive off)
  Delay_us(3500);

  adc_rd = ADC_read(1);                                   // Read RA1 (READ-Y)

  result = (adc_rd > ADC_THRESHOLD);                      // if logical one is detectet
 
  //debouncing, repeat detecting after 2ms
  Delay_ms(2);
  adc_rd = ADC_read(1);
  result = result & (adc_rd > ADC_THRESHOLD);
  return result;
}

unsigned int GetX() {
  unsigned int result;
  //reading X
  PORTC.F0 = 1;         // DRIVEA = 1 (LEFT drive on, RIGHT drive on, TOP drive off)
  PORTC.F1 = 0;         // DRIVEB = 0 (BOTTOM drive off)

  Delay_ms(5);
  result = ADC_read(0); // reading X value from RA0 (BOTTOM)
  return result;
}

unsigned int GetY() {
  unsigned int result;
  //reading Y
  PORTC.F0 = 0;         // DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
  PORTC.F1 = 1;         // DRIVEB = 1 (BOTTOM drive on)

  Delay_ms(5);
  result = ADC_read(1); // reading Y value from RA1 (from LEFT)
  return result;
}

void Calibrate() {

  Glcd_Dot(0,63,1);
  Glcd_Write_Text("TOUCH BOTTOM LEFT",10,3,1);

  while (!PressDetect());
 
  // get calibration constants (reading and compensating TouchPanel nonlinearity)
  cal_x_min = GetX() - 10;
  cal_y_min = GetY() - 10;
  Delay_ms(1000);

  Glcd_Fill(0);
  Glcd_Dot(127,0,1);
  Glcd_Write_Text("TOUCH UPPER RIGHT",10,4,1);
  while (!PressDetect()) ;

  // get calibration constants (reading and compensating TouchPanel nonlinearity)
  cal_x_max = GetX() + 5;
  cal_y_max = GetY() + 5;
  Delay_ms(1000);
}


void main() {
  ADCON1 = 0x0F;
  PORTA  = 0x00;
  TRISA  = 0x03;                               // RA0 i RA1 are analog inputs

  PORTC  = 0 ;
  TRISC  = 0 ;                                 // PORTC is output

  Glcd_Init(&PORTB, 0, 1, 2, 3, 5, 4, &PORTD); // Glcd_Init_EP5, see Autocomplete

  Glcd_Fill(0);
  Glcd_Set_Font(FontSystem5x8, 5, 8, 32);
  Glcd_Write_Text("CALIBRATION", 24, 3, 1);
  Delay_ms(1500);

  Glcd_Fill(0);
  Calibrate();
  Glcd_Fill(0);

  Glcd_Write_Text("WRITE ON SCREEN", 24, 4, 1) ;
  Delay_ms(1000);
  Glcd_Fill(0);
 
  Glcd_Fill(0);
  Glcd_V_Line(0,7,0,1);
  Glcd_Write_Text(clear_msg,1,0,0);
  Glcd_V_Line(0,7,97,1);
  Glcd_Write_Text(erase_msg,98,0,0);

  //Pen Menu:
  Glcd_Rectangle(41,0,52,9,1);
  Glcd_Box(45,3,48,6,1);
  Glcd_Rectangle(63,0,70,7,1);
  Glcd_Box(66,3,67,4,1);
  Glcd_Rectangle(80,0,86,6,1);
  Glcd_Dot(83,3,1);

  write_erase = 1;
  pen_size = 1;
 
  while (1) {
 
    if (PressDetect()) {
      // after a PRESS is detected read X-Y and convert it to 128x64 space
      x_coord = GetX() - cal_x_min;
      y_coord = GetY() - cal_y_min;

      x_coord128 = (x_coord * 128l) / (cal_x_max - cal_x_min);
      y_coord64 = (64 -(y_coord *64) / (cal_y_max - cal_y_min));

      if ((x_coord128 < 0) || (x_coord128 > 127))
         continue;
      if ((y_coord64 < 0) || (y_coord64 > 63))
         continue;


      //if clear is pressed
      if ((x_coord128 < 31) && (y_coord64 < 8)) {

         Glcd_Fill(0);

         //Pen Menu:
         Glcd_Rectangle(41,0,52,9,1);
         Glcd_Box(45,3,48,6,1);
         Glcd_Rectangle(63,0,70,7,1);
         Glcd_Box(66,3,67,4,1);
         Glcd_Rectangle(80,0,86,6,1);
         Glcd_Dot(83,3,1);

         Glcd_V_Line(0,7,0,1);
         Glcd_Write_Text(clear_msg,1,0,0);
         Glcd_V_Line(0,7,97,1);
         if (write_erase)
           Glcd_Write_Text(erase_msg,98,0,0);
         else
           Glcd_Write_Text(write_msg,98,0,0);
         }
         
      //if write/erase is pressed
      if ((x_coord128 > 96) && (y_coord64 < 8)) {
         if (write_erase) {
           write_erase = 0;
           Glcd_Write_Text(write_msg,98,0,0);
           Delay_ms(500);
           }
         else {
           write_erase = 1;
           Glcd_Write_Text(erase_msg,98,0,0);
           Delay_ms(500);
           }
         }
         
      //if pen size is selected
      if ((x_coord128 >= 41) && (x_coord128 <= 52) && (y_coord64 <= 9))
         pen_size = 3;

      if ((x_coord128 >= 63) && (x_coord128 <= 70) && (y_coord64 <= 7))
         pen_size = 2;

      if ((x_coord128 >= 80) && (x_coord128 <= 86) && (y_coord64 <= 6))
         pen_size = 1;

      if (y_coord64 < 11)
         continue;

      switch (pen_size) {
         case 1 : Glcd_Dot(x_coord128, y_coord64, write_erase); break;
         case 2 : Glcd_Box(x_coord128, y_coord64, x_coord128 + 1, y_coord64 + 1, write_erase); break;
         case 3 : Glcd_Box(x_coord128-1, y_coord64-1, x_coord128 + 2, y_coord64 + 2, write_erase); break;
         }
         
      }
    }
}

Abraços

Ivan
"Mesmo o objeto mais inanimado tem movimento suficiente para ficar na sua frente e provocar um acidente."
"Incluso el objeto más inanimado tiene suficiente movimiento para interponerse en su camino y provocar un accidente."
"Even the most inanimate object has enough movement to stand in your way and cause an accident."

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Touchscreen
« Respuesta #3 en: 17 de Septiembre de 2008, 10:30:56 »
Hola

Em CCS  o codigo
Código: [Seleccionar]
adcon1seria como você colocar desta forma
Código: [Seleccionar]
setup_adc_ports( A0 A1);

El ADCON1 es un registro del PIC, mientras que el setup_adc_ports(); es una funcion que modifica tanto al ADCON1 como al ADCON0, tienen cierta relacion, pero no es lo mismo.

Para trabajar con los nombres de los registros, tan solo basta colocar lo siguiente (por ejemplo para el PORTA) :
Código: [Seleccionar]
#BYTE PORTA=0xF80
La direccion del registro correspondiente esta en el datasheet.

Si se quiere seleccionar un bit del registro:
Código: [Seleccionar]
#BIT A0=PORTA.0
Con esto ya podemos asignar los valores al registro como estan en la libreria que mencionas.

Saludos
El papel lo aguanta todo

Desconectado ivan braga

  • PIC12
  • **
  • Mensajes: 77
Re: Touchscreen
« Respuesta #4 en: 18 de Septiembre de 2008, 05:09:49 »
GOOGLE idiomas

Estoy de acuerdo en parte con usted MLO_, sé que ADCON1 es un registro de la PIC, y también sé que setup_adc_ports () es una función, sólo tratando de explicar a juanez que ambos tienen el mismo efecto, la diferencia en este compilador, y cómo tratar a sus periféricos, como el MIKROC no disponen de esta función setup_adc_ports ().
Por lo tanto, si usted nota, que tiene funciones para leer el ADC "ADC_read (1)," pero ese es el caso de un directo sus registros, como se indica en el código

Código: [Seleccionar]
void main () (
   ADCON1 = 0x0F;
   PORT = 0x00;
   TRISA = 0x03, / / RA0 i RA1 son entradas analógicas


Y también que esta equivocado, ya que debe ser

Código: [Seleccionar]
ADCON1 = 0x0D; porque utiliza A0 y A1.

Me gustaría pedir disculpas, yo preferiría no escribir mucho, ya que no hay confusión en la lengua.

Por último, no he querido decir a juanez a copiar y pegar, y sí, había una idea de cómo se puede hacer.

Abraços

Ivan



Concordo em parte com você MLO_, eu sei que ADCON1 é um registro do PIC, e tambem sei que setup_adc_ports(); é uma função, estava apenas tentando explicar ao juanez que ambos tem o mesmo efeito, a diferença esta no compilador, e na forma de tratar seu periféricos, pois o MIKROC não tem esta funcão setup_adc_ports(); .
Tanto que se você reparar, ele tem funções para leitura do ADC "ADC_read(1)", porem tem que se tratar de forma direta seus registros, como mostra o codigo
Código: [Seleccionar]
void main() {
  ADCON1 = 0x0F;
  PORTA  = 0x00;
  TRISA  = 0x03;                               // RA0 i RA1 are analog inputs
, e que tambem esta errado, pois deveria ser
Código: [Seleccionar]
ADCON1 = 0x0D;, pois ele usa A0 e A1.

Gostaria de pedir desculpas, prefiro não escrever muito, para não haver confusão nos idiomas.

Para finalizar, não quis dizer ao juanez para copiar e colar, e sim, que ele tivesse uma ideia de como pode fazer.

Abraços

Ivan
« Última modificación: 18 de Septiembre de 2008, 05:15:03 por ivan braga »
"Mesmo o objeto mais inanimado tem movimento suficiente para ficar na sua frente e provocar um acidente."
"Incluso el objeto más inanimado tiene suficiente movimiento para interponerse en su camino y provocar un accidente."
"Even the most inanimate object has enough movement to stand in your way and cause an accident."

Desconectado Dani27v

  • PIC12
  • **
  • Mensajes: 73
Re: Touchscreen
« Respuesta #5 en: 18 de Septiembre de 2008, 06:18:29 »
Hola mira por aki : http://www.todopic.com.ar/foros/index.php?topic=20029.0

yo he probado el ejemplo de duende_azul y me funciona, esta en ccs.



Un saludo