Autor Tema: Glcd y Touch Screen?  (Leído 33029 veces)

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

Desconectado Sir_Egnos

  • PIC12
  • **
  • Mensajes: 92
Re: Glcd y Touch Screen?
« Respuesta #30 en: 15 de Marzo de 2008, 16:26:23 »
Gracias, si te parece bien lo estudiare y te ire preguntando las dudas que me surjan.
Ya mismo comprare el lcd.

Desconectado Sir_Egnos

  • PIC12
  • **
  • Mensajes: 92
Re: Glcd y Touch Screen?
« Respuesta #31 en: 15 de Marzo de 2008, 16:43:47 »
He ya copiado tu codigo y me dispuse a compilarlo y me encontre con mi primer problema. No he usado nunca las librerias del glcd del ccs y quiza haya que hacer algo que no hice.

El error que me da al compinar es que no esta definido el identificador glcd_pixel de la libreria graphics.c ¿me falta cargar alguna otra libreria?




Desconectado Sir_Egnos

  • PIC12
  • **
  • Mensajes: 92
Re: Glcd y Touch Screen?
« Respuesta #32 en: 15 de Marzo de 2008, 16:50:36 »
Error mio que queria usar la libreria ks0108.c en vez de la hdm64gs12.c

:-)

Desconectado Sir_Egnos

  • PIC12
  • **
  • Mensajes: 92
Re: Glcd y Touch Screen?
« Respuesta #33 en: 16 de Marzo de 2008, 17:52:11 »
Hoy me he dedicado a estudiar tu codigo, compilarlo, probarlo en proteus y tengo que decir que programas de una forma clara y es facil seguir los pasos que das y saber que pretendes con las sentencias que vas poniendo. Y eso, para un programador, es una virtud grande :-)

 Bien, de todo el codigo solo tengo un par de dudas. La mas importante tiene que ver con las sentencias sprintf que estan en la funcion print_xy_val(). Supongo que es una funcion que usabas en el chequeo del programa ya que veo que ahora no es llamada nunca (o eso me parece por que no vi donde se la llamaba),  y mi pregunta es, para utilizar esa sentencia (sprintf) no debia estar asignado la directiva de configuracion de puerto seria para que funcionara? O dicho de otra forma, esta sentencia no tiene por objeto que envie el dato por el puerto rs232? Por que no veo que configures la asignacion de patillas al puerto por ningun lado.

 Un saludo y felicidades por tu codigo.


Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 885
Re: Glcd y Touch Screen?
« Respuesta #34 en: 16 de Marzo de 2008, 22:34:07 »
La instruccion sprintf es para convertir un valor númerico en una cadena.
Por ejemplo la instruccion sprintf(valor_y,"%lu",y_loc);  convierte el valor "y_loc" que es un int16  en una cadena que se almacena en valor_y que es un array de 4 elementos char. El parametro %lu indica que el valor debe convertirse en en formato "long unsigned"..  si lo quisieras en hexadecimal entonces deberias poner %x, etc...  en la ayuda de ccs puedes encontrar mas información.

Esa rutina como bien dices, la usaba para probar, lo que hace es mostrar en la parte de abajo del glcd, las coordenadas en donde se esta tocando la pantalla.
« Última modificación: 17 de Marzo de 2008, 03:06:15 por Duende_Azul »

Desconectado Sir_Egnos

  • PIC12
  • **
  • Mensajes: 92
Re: Glcd y Touch Screen?
« Respuesta #35 en: 17 de Marzo de 2008, 06:13:51 »
Ahh, muchas gracias, estaba yo equivocado entonces. Mi ingles es muy malo y no habia entendido bien las instrucciones entonces en el manual del ccs.

Gracias por tu aclaracion.


Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3214
Re: Glcd y Touch Screen?
« Respuesta #36 en: 22 de Septiembre de 2008, 16:19:48 »
Hola !

Saludotes


Una consulta :  :mrgreen:

¿Con que programa generan el codigo de bitmap a c?

Gracias!


Desconectado juanez

  • PIC12
  • **
  • Mensajes: 90
Re: Glcd y Touch Screen?
« Respuesta #37 en: 23 de Septiembre de 2008, 13:42:47 »
¿Con que compilador lo as echo?

Yo uso el ccs y no hay forma de poder usar el touchscreen

Saudos.

Desconectado juanez

  • PIC12
  • **
  • Mensajes: 90
Re: Glcd y Touch Screen?
« Respuesta #38 en: 24 de Septiembre de 2008, 12:49:34 »
Hola, haber si podeis echarme una mano, por que no lo consigo.

El ultimo codigo de duende azul, me funciona perfectamente en el proteus, yo uso un pic 18f4553 en vez del 18f4550.

en proteus parece funcionar, ya que aparece un cuadradito que parapadea que debe ser la opcion de calibrar la pantalla.

Pero en la prueba real, no me funciona, si en el ccs en la linea que manda calibrar la pantalla hago esto :

// calibracion();             //Calibra la pantalla, ********   O sea le añado las // para que no la ejecute, el glcd me muestra el dibujo del teclado.

El glcd funciona perfectamente, pero si ejecuto el programa tal cual, la rutina de calibracion no me funciona y creo que puede ser por el cristal o los fuses.

He puesto un cristal externo de 8mhz y 2 condensadores de 22pfs

Y los fuses he tenido que canviar alguno, ya que el H4 y el NOOSCSEN  que salen en el codigo de duende azul el 18f4553 parece ser no lo tiene.


Asi lo he dejado:

-------------------------------------------------------------------------------------------------------
#include <18F4553.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
//#FUSES H4                       //High speed osc with HW enabled 4X PLL
#FUSES HSPLL 
#FUSES NOPROTECT                //Code not protected from reading
//#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES PUT                      //Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB   
--------------------------------------------------------------------------------------------------------------------


¿Que estoy haciendo mal?

Saludos

Desconectado Dani27v

  • PIC12
  • **
  • Mensajes: 73
Re: Glcd y Touch Screen?
« Respuesta #39 en: 24 de Septiembre de 2008, 13:57:15 »
Hola, yo estoy igual,  probe el programa que escribio duende azul y me funcionó, pero al hacer mas pruebas y mirarlo con mas detalle he comprobado que falla muchisimas veces, cuando no funciona lo reinicio o hago un reset (hay veces que tengo que hacerlo unas cuantas veces segidas)para que  funcione. Cuando no funciona no aparece la pantalla de calibración, he repasado la  función de calibrar y no veo ningún error. Lo curioso es que funcione cuando quiere.

dejo el trozo de código de la calibración ( aunque mas arriba esta el código completo, escrito por duende azul)

Código: [Seleccionar]

/**************************************************
*******  Lee la coordenada y   ********************
**************************************************/
int16 y_pos(void)
{
   int16 result;
   set_tris_a(0x04);
   output_a(0x0A);      //Energize X plate, RA1 and RA3
   set_adc_channel(2);   //Set AN2 as input
   delay_us(10);
   result = read_adc(); //get Y axis value
   if (result != 0)
   {
      set_tris_a(0x01);
      set_adc_channel(0);
      delay_us(10);
      tmp = (1023 - read_adc());
      result = (result + tmp) >> 1;   
   }
   Return(result);
}

/**************************************************
*******  Lee la coordenada x   ********************
**************************************************/
int16 x_pos(void)
{
   int16 result;
   set_tris_a(0x02);
   output_a(0x05);      //Energize X plate, RA1 and RA3
   set_adc_channel(1);   //Set AN2 as input
   delay_us(10);
   result = read_adc(); //get Y axis value
   if (result != 0)
   {
      set_tris_a(0x08);
      set_adc_channel(3);
      delay_us(10);
      tmp = (1023 - read_adc());
      result = (result + tmp) >> 1;   
   }   
   Return(result);

------------------------------------------------------------


/*************************************************************
*****  Rutina para calibrar la pantalla                *******
*************************************************************/
void calibracion()
{
   int1 sw;
   sw=1;
   while(x_pos()==0)
   {
     glcd_rect(0,0,2,2,YES,SW);
      glcd_update();
      delay_ms(100);
      sw=!sw;
   }
   
 
   delay_ms(30);
   y_min = y_pos();
   x_min = x_pos();
   
   glcd_rect(0,0,2,2,YES,OFF);
   glcd_update();
   while(x_pos() > 0);
   delay_ms(30);
   while(x_pos()==0)
   {
      glcd_rect(125,61,127,63,YES,SW);
      glcd_update();
      delay_ms(100);
      sw=!sw;
   }
   delay_ms(30);
   y_max = y_pos();
   x_max = x_pos();
   y_rng = y_max - y_min;
   x_rng = x_max - x_min;
   while(x_pos() > 0);
   glcd_fillScreen(OFF);
   glcd_update();
 
 
 
 



Desconectado juanez

  • PIC12
  • **
  • Mensajes: 90
Re: Glcd y Touch Screen?
« Respuesta #40 en: 24 de Septiembre de 2008, 14:45:15 »
Dani27, dime que cristal y condensadores usas en el oscilador de tu pic, y que pic usas.

Saludos

Desconectado Dani27v

  • PIC12
  • **
  • Mensajes: 73
Re: Glcd y Touch Screen?
« Respuesta #41 en: 24 de Septiembre de 2008, 14:55:23 »
La placa con que la estoy probando es una easypic4 , y el cristal que utilizo es de 8Mhz, los condensadores son los originales de la placa de 22pF. No creo que sea problema de cristal, ya que si que me  funciona de vez encuando, y el cristal es el mismo siempre. Continuo probando....


El pic que utilizo es un 18f4520.


Un saludo,

Dani.

edito:

Ahora ya me funciona, pues si tenias razón, he cambiado unos fuses a la hora de programar y ahora va perfecto, he cambiado :

el oscilador lo tenia  en HS-PLL  y lo he cambiado a HS

luego he  puesto en disable Brown  out voltage   ( aunq creo q este ultimo no tendra nada q ver, luego lo pruebo)
Un saludo.




« Última modificación: 24 de Septiembre de 2008, 15:23:14 por Dani27v »

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: Glcd y Touch Screen?
« Respuesta #42 en: 24 de Septiembre de 2008, 16:16:32 »
hola! muchachos!, ya me hicieron babear demasiado con ésto de los GLCD,.... densé una vuelta por la página de mikroeletrónica,.... están vendiendo unos GLCD 128*64 con pantalla táctil a tan solo 24U$S.... una ganga....
Saludos  8)
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado juanez

  • PIC12
  • **
  • Mensajes: 90
Re: Glcd y Touch Screen?
« Respuesta #43 en: 25 de Septiembre de 2008, 12:25:43 »
Pues no hay manera, en la pantalla de calibracion se me queda colgado.

Pongo aqui la modificacion del codigo para el 18f4553 haber que os parece.

/*****************************************************************
** Conexion del touchscreen resistivo de 4 hilos
** X+ = RA0/AN0
** Y+ = RA1/AN1
** X- = RA2/AN2
** Y- = RA3/AN3
*****************************************************************/

#include <18F4553.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed osc with HW enabled 4X PLL
#FUSES NOPROTECT                //Code not protected from reading
//#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT                 //Reset when brownout detected
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES PUT                      //Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads

#use delay(clock=32000000)
#use fast_io(A)
#define FAST_GLCD;
#include <HDM64GS12.C> //Esta es la misma libreria HDM64GS12.C que trae el
                           //ccs pero con la asignacion de pines para la tarjeta
                           //easypic4.
#include <graphics.c>

---------------- Aqui va la imagen del teclado --------------------
int16 tmp;
int16 y_min,y_max,x_min,x_max;
int16 y_loc,x_loc,y_rng,x_rng;
int1 touch_flag,line_flag;
char valor_x[5];
char valor_y[4];

/****************************************************************
*****   Rutina para mostrar la imagen del teclado             ***
****************************************************************/
void glcd_imagen()
{
   char i,j;
   signed char k;
   for( i = 0 ; i < 64 ; i ++ )
   { 
      for( j = 0 ; j < 16 ; j ++)
      {   
         for(k=7;k>-1;k--)
         {     
            if( bit_test(Prueba[j] ,7-k ))
               glcd_pixel( j*8+k,i, ON );
         } 
      }
   }
}


/**************************************************
*******  Lee la coordenada y   ********************
**************************************************/
int16 y_pos(void)
{
   int16 result;
   set_tris_a(0x04);
   output_a(0x0A);      //Energize X plate, RA1 and RA3
   set_adc_channel(2);   //Set AN2 as input
   delay_us(10);
   result = read_adc(); //get Y axis value
   if (result != 0)
   {
      set_tris_a(0x01);
      set_adc_channel(0);
      delay_us(10);
      tmp = (1023 - read_adc());
      result = (result + tmp) >> 1;   
   }
   Return(result);
}

/**************************************************
*******  Lee la coordenada x   ********************
**************************************************/
int16 x_pos(void)
{
   int16 result;
   set_tris_a(0x02);
   output_a(0x05);      //Energize X plate, RA1 and RA3
   set_adc_channel(1);   //Set AN2 as input
   delay_us(10);
   result = read_adc(); //get Y axis value
   if (result != 0)
   {
      set_tris_a(0x08);
      set_adc_channel(3);
      delay_us(10);
      tmp = (1023 - read_adc());
      result = (result + tmp) >> 1;   
   }   
   Return(result);
}

/**************************************************
***  Funcion para determinar si la pantalla     ***
***  ha sudo pulsada o no...                    ***
**************************************************/
int1 touch(void)
{
   int1 resp;
   int16 tmp,ty,tx;
   resp=false;
   ty = y_pos();
   if (ty > 0)
   {
      delay_ms(30);
      ty=y_pos();
      tx=x_pos();
      if (ty > y_min)
      {
         if(ty < y_max)
         {
            resp = true;
            tmp=(tx - x_min) << 7;
            x_loc =(int16)(tmp/x_rng);
            if(x_loc > 127)  x_loc = 127;
            tmp = (ty - y_min) << 6;
            y_loc = (int16)(tmp/y_rng);
            if(y_loc > 63)   y_loc = 63;
         }
      }
   }
   return(resp);
}

/*************************************************************
*****  Rutina para calibrar la pantalla                *******
*************************************************************/
void calibracion()
{
   int1 sw;
   sw=1;
   while(x_pos()==0)
   {
      glcd_rect(0,0,2,2,YES,SW);
      glcd_update();
      delay_ms(100);
      sw=!sw;
   }
   delay_ms(30);
   y_min = y_pos();
   x_min = x_pos();
   glcd_rect(0,0,2,2,YES,OFF);
   glcd_update();
   while(x_pos() > 0);
   delay_ms(30);
   while(x_pos()==0)
   {
      glcd_rect(125,61,127,63,YES,SW);
      glcd_update();
      delay_ms(100);
      sw=!sw;
   }
   delay_ms(30);
   y_max = y_pos();
   x_max = x_pos();
   y_rng = y_max - y_min;
   x_rng = x_max - x_min;
   while(x_pos() > 0);
   glcd_fillScreen(OFF);
   glcd_update();
}

/**********************************************************
****  muestra las coordenadas   ***************************
**********************************************************/
void print_xy_val()
{
   glcd_rect(13,40,29,57,YES,OFF);
   if(Touch()==true)
   { 
      touch_flag = true;
      sprintf(valor_x,"%lu",x_loc);
      valor_x[4]='\0';
      glcd_text57(13,40,valor_x,1,ON);
      sprintf(valor_y,"%lu",y_loc);
      valor_y[3]='\0';
      glcd_text57(13,50,valor_y,1,ON);
   }
   else
   {
      touch_flag = false;
      glcd_rect(13,40,29,57,YES,OFF);
   }
   //glcd_text57(1,40,x1,1,ON);
   //glcd_text57(1,50,x2,1,ON);
   glcd_update();   
   
}

/*****************************************************************
******  etermina sobre que boton se ha pulsado            ********
*****************************************************************/
int8 boton_act(void)
{
   int8 button;
   if(((x_loc>63) &&(x_loc<80)) &((y_loc>1) &&(y_loc<13))) button = '1';
   if(((x_loc>83) &&(x_loc<100))&((y_loc>1) &&(y_loc<13))) button = '2';
   if(((x_loc>103)&&(x_loc<120))&((y_loc>1) &&(y_loc<13))) button = '3';
   if(((x_loc>63) &&(x_loc<80)) &((y_loc>17)&&(y_loc<29))) button = '4';
   if(((x_loc>83) &&(x_loc<100))&((y_loc>17)&&(y_loc<29))) button = '5';
   if(((x_loc>103)&&(x_loc<120))&((y_loc>17)&&(y_loc<29))) button = '6';
   if(((x_loc>63) &&(x_loc<80)) &((y_loc>33)&&(y_loc<46))) button = '7';
   if(((x_loc>83) &&(x_loc<100))&((y_loc>33)&&(y_loc<46))) button = '8';
   if(((x_loc>103)&&(x_loc<120))&((y_loc>33)&&(y_loc<46))) button = '9';
   if(((x_loc>63) &&(x_loc<80)) &((y_loc>49)&&(y_loc<62))) button = '0';
   if(((x_loc>83) &&(x_loc<120))&((y_loc>49)&&(y_loc<62))) button = 'X';
   
   return(button);
}

void main()
{
   //lcd_init();
   setup_adc_ports(AN0_TO_AN4);
   setup_adc(ADC_CLOCK_INTERNAL );
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!
   glcd_init(ON);             //Inicializa la glcd
   glcd_fillScreen(OFF);      //Limpia la pantalla
   glcd_update();
   calibracion();             //Calibra la pantalla
   glcd_update();
   glcd_imagen();             //muestra el teclado
   glcd_update();

   while(1)
   {
      if(touch()==true)
      {
      valor_x[0]=boton_act();
      valor_x[1]='\0';
      if (valor_x[0]=='X')
         glcd_rect(27,9,37,23,YES,OFF); //Borra el numero mostrado
      if ((valor_x[0]>='0')&&(valor_x[0]<='9'))
      {
         glcd_rect(27,9,37,23,YES,OFF);  //Borra el numero mostrado antes de
         glcd_text57(27,9,valor_x,2,ON); //escribir uno nuevo..   
      }
      glcd_update();
      }
   }
}

-------------------------------------------------------------------------------------------------------------------------------------------

Las unicas modificaciones que he echo son los fuses y la linea que define las analogicas ya que en el 18f4553 canvia un poco y he puesto :  setup_adc_ports(AN0_TO_AN4);

Pero no me funciona, en el proteus si que aparece el cuadrado parpadeando de la pantalla de calibracion, pero en mi pantalla no, por lo que tiene que ser algo de mi pantalla.

Desconectado Dani27v

  • PIC12
  • **
  • Mensajes: 73
Re: Glcd y Touch Screen?
« Respuesta #44 en: 26 de Septiembre de 2008, 04:11:29 »
Hola, si tienes un 18f4520 y un cristal de 8Mhz te puedo pasar el .hex que me funciona, y asi compruebas que no tienes algún otro problema. De momento me he quedado sin internet en casa y te escribo desde el trabajo, por lo que no he podido comprobar tu configuración de los fuses, aunque creo que es correcta.
(porcierto, has probado que con la configuración de pines de la libreria que utilizas pata la glcd sea correcta, es decir   te aparece almenos la imagen, igual es problema de la definición de pines )

Un saludo,

Dani.
« Última modificación: 26 de Septiembre de 2008, 07:42:31 por Dani27v »


 

anything