Autor Tema: uLCD-32PT de 4D Systems problemas con la transmición  (Leído 5728 veces)

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

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
uLCD-32PT de 4D Systems problemas con la transmición
« en: 11 de Enero de 2011, 21:15:26 »
Hola compañero del foro feliz año nuevo para los que no salude  ;-). Recientemente he adquirido este display:

http://shop.4dsystems.com.au/4dgl-display-modules/249-3004.html

Es un LCD TFT Touchscreen de 65k colores que posee una interfaz serie UART. Hice un pequeño progama de prueba en donde escribo la letra A en color blanco sobre un fondo negro. Parecia muy simple el manejo al ser un display inteligente que puede ser controlado por UART pero resultó no ser así. El LCD no hace nada de lo que yo le envío, mas bien no responde a ningún comando. En su hoja de instrucciones dice que se debe esperar 500ms antes de enviar un comando al LCD si no se usa una tarjeta uSD de una capacidad grande. Luego de esta espera se debe enviar la letra U para programar al LCD con deteccion de baudios automática. Supuestamente el LCD debe responder con el hexadecimal 06h o sea 0x06 pero esto no sucede o el PIC no lo detecta.
Hago una pequeña prueba en PROTEUS haciendo que el PIC envíe un 0x06 (printf("%u",0x06) y en el Virtual Terminal recibo un 54 (?), por qué recibo un 54 si supuestamente un 0x06 es igual a 6 en decimal no a 54. Les dejo el programa que estoy usando para comunicame, verán que en la parte de recepción espero varios cosas así sea un 0x06, un 6, un 54 para agotar todas las opciones pero no resultó.

Agradezco la ayuda.

Código: [Seleccionar]
#include <18F4520.H>
#fuses HS,PUT,NOBROWNOUT,NOWDT,NOLVP,NODEBUG,NOMCLR
#use delay(clock=40M)
#use RS232 (UART1)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                   VARIABLE RAM                                                               //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Variables para UART
INT ACK = 0;              //se pone a 1 al recibir un ACK del GLCD
INT1 TOUCH_XY = 0;         //se pone a 1 para indicar que el USART va a recibir las coordenadas x e y de la pantalla tactil
INT CORD[5] = {0,0,0,0,0}; //matriz para la recepción de datos
INT DATO;

//Variables de uso General
INT16 x = 0;
INT16 y = 0;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                   INTERRUPCIONES                                                             //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Interrupcion por llenado de buffer del UART
#INT_RDA
VOID RX_232 (VOID){
   IF(TOUCH_XY){                    //si estoy recibiendo las coordenadas del touch
    int nbyte = 0;                 
      IF(kbhit()){                  //si hay algun dato en el buffer
         WHILE(nbyte<5){            //recibo los 4 byte de las coordenadas
            CORD[nbyte] = getc();
            while(!kbhit());        //mientras no alla un nuevo dato espero
            ++nbyte;
         }
      }
      x = make16(CORD[0],CORD[1]);  //pongo las coordenadas en un INT16 ya que el LCD las envía en 2 bytes
      y = make16(CORD[2],CORD[3]);
   }
   
   IF(kbhit()){            //si hay un dato para recibir (buffer lleno)
   DATO = getc();
      IF(getc()==54 || getc()==0x06 || getc()==6){ ACK = 1; }
   }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                     INCLUDES                                                                 //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <ESCRITORIO.C>
#include <MENU1.C>

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                   PROGRAMA PRINCIPAL                                                         //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
VOID MAIN (VOID){

/////////////////////////
//Inicializacion del LCD
/////////////////////////

enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

set_uart_speed(9600);      //velocidad del UART inicial del GLCD
delay_ms(3000);             //tiempo de inicio del GLCD + TIEMPO DE INICIO SDCard

putc('U');                 //envío al GLCD el modo auto baud rate para que se ajuste a la velocidad del micro
WHILE(!ACK);
ACK = 0;

//set_uart_speed(256000);    //seteo la nueva velocidad del UART para el GLCD
printf("B%u%u",0x00,0x00); //seteo el color de fondo en negro
WHILE(!ACK);
ACK = 0;

//Backlight encendido; Display ON; COntraste = 7; Display Power-Up; Orientacion LandScape, Habilito panel táctil
//Formato de imagen con Header; No protejer tarjeta de memoria;
printf("Y%u%u%u%u%u%u%u%u",0x01,0x01,0x07,0x01,0x01,0x00,0x00,0x02);
WHILE(!ACK);
ACK = 0;

printf("v%u",0x3B);        //volumen en nivel 59 (la mitad aproximadamente)
WHILE(!ACK);
ACK = 0;

printf("s%u%u%u%u%u%s%u",20,20,2,0x00,0x00,"HOLA",0x00);          //escribo texto "HOLA" en color blanco
/////////////////////////
//Fin inicializacion
/////////////////////////

//El archivo .GCI se llama "INIT"
//El primer 0x00 indica fin del nombre del archivo; x = 0; y = 0;
//Los tres bytes para la posicion del archivo en la memorias son: 0x00,0x00,0x00
printf("@mINIT%u%u%u%u%u%u",0x00,0x00,0x00,0x00,0x00,0x00);    //muestro imagen de presentacion
WHILE(!ACK);               //espero a que se acepte el comando
ACK = 0;
delay_ms(1500);            //demora
desktop();                 //muestro el escritorio
TOUCH_XY = 1;              //indico que se usara el USART para la recepcion de las coordenadas del touch

   WHILE(TRUE){            //bucle infinito

IF(x>140 && x<180 && y>220){     //si toque el botón de menu
   x = 0; y = 0;                 //reinicio coordenadas
   menu_1();                     //entro al menu principal
}
   }
}

Aquí esta la hoja con las instrucciones del LCD:

http://www.4dsystems.com.au/downloads/Semiconductors/PICASO-SGC/Docs/PICASO-SGC-COMMANDS-SIS-rev3.pdf

PD: uso el compilador CCS.

La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: uLCD-32PT de 4D Systems problemas con la transmición
« Respuesta #1 en: 15 de Enero de 2011, 18:46:01 »
Bueno averiguando un poco me di cuenta que mi LCD es GFX por lo tanto no acepta comandos seriales, pero este LCD puede ser tanto GFX como SGC que s;i acepta comandos seriales, yo compre la versión GFX que viene de fábrica, no hay problema con esto ya que el fabricante proporciona el código y el programa para programar el LCD y ponerlo en modo GFX o SGC a gusto. Esto fue lo que hice y se grabó correctamente ya que la pantalla de inicio que muestra el LCD ahora completamente diferente indicando que es SGC. Pero el problema persiste no puedo comunicarme con el, estoy usando un PIC16F876A a 4MHz - 9600 baudios para hacer las pruebas.
Cualquier ayuda sería genial.

Saludos y gracias!!
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: uLCD-32PT de 4D Systems problemas con la transmición
« Respuesta #2 en: 16 de Enero de 2011, 21:03:58 »
Bueno un nuevo dato ya que nadie responde por lo menos valla quedando en el foro por si alguno tiene algun problema similar sepa viendo como puede solucionarlo  ;-). Hay una aplicación del fabricante 4D systems que permite realizar todas las funciones del LCD a través de un pequeño programa de la compu y conectando el LCD  al puerto serie de la PC a través de un MAX232 por supuesto, todo funciona perfecto aquí y el programa va mostrando el comando que envía y si recibe o no el bit de ACK, yo enviando con el microcontrolador no recibo absolutamente nada, pero de este modo por lo menos descarto que sea un mal funcionamiento del LCD y que el problema se encuentra en la transmición de la PC. Lo que más me extraña es que por lo menos si los comandos que envío no fueran aceptados me enviaría un NOACK en ves de un ACK pero ni eso.

Saludos!
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado sherckuith

  • PIC10
  • *
  • Mensajes: 6
Re: uLCD-32PT de 4D Systems problemas con la transmición
« Respuesta #3 en: 18 de Enero de 2011, 23:06:39 »
Hola como estas, sabes yo tenia el mismo problema para manejar un serial servo pololu y me di cuenta q al enviar los codigos con el %x el pic no los envia en forma serial, en fin, creo q te podria ayudar esto que hicimos con un amigo para poder enviar tus datos a la LCD y me avisas si te funciono, yo tengo la misma solo que esta prestada a un amigo y aun no me la devuelve pero se la preste xq ni siquiera pude cambiarle de GFX a modo serial... bueno ahi te va....

void servo(int x, y)
{
   int i=0;
   int pololu[7]={0x80,0x01,0x04,0x00,0x00,0x7F,0x15};
   
   pololu[3]=x;
   pololu[4]=y;
   
   for(i=0;i<6;i++)
   {
      putc(pololu);
      delay_ms(5);
   }
}

void main(void) {
int z;
byte b0=128,b1=1,b2=4,b3=0,b4=36,b5=127;
//byte b0=128,b1=1,b2=4,b3=0,b4=36,b5=127;
int a=5;



for(z=0;z<10;z++)
{
   output_toggle(PIN_A0);
   delay_ms(100);
}

delay_ms(2000);

while(true)
{
   servo(0,32);
   delay_ms(100);
}
// estos son los datos que quise enviarle desde el pic pero de esta manera nunca funciono, probe la que hicimos y si envio
//puts(string);
//printf("%c%c%c%c%c%c%c",0x80,0x01,0x04,0x00,0x0A,0x7F,0x00);
//fprintf("%c%c%c%c",0x80,0x01,0x04,0x16);
//fprintf("%c%c",0x0A,0x7F);
//fprintf("%2LX %2X %2X %2d %2d %2d",b0,b1,b2,b3,b4,b5);
//fprintf("\n\r",b0,b1,b2,b3,b4,b5);
}

el dato que esta en la matriz al final es el que me arreglo la vida.... me avisas si funciono ok... saludos y suerte

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: uLCD-32PT de 4D Systems problemas con la transmición
« Respuesta #4 en: 19 de Enero de 2011, 01:07:47 »
Hola sherckuith gracias por responder, tenes razón, me puse más tranquilo con tiempo y arme toda una librería para el LCD usando putc() en ves de printf() además del ahorro de memoria que conlleva y el LCD parece responder con el bit de ACK, esto lo logré hoy voy a seguir haciendo unas pruebas porque en un momento pude dibujar una línea, hice un pequeño cambio y dejó de funcionar la línea solo borra la pantalla del LCD. Te dejo la librería que estoy haciendo por si queres revisarla. Cualquier dato es bienvenido  ;-).

La secuencia que uso es un lcd4d_init() seguido del dibujado de una línea y un círculo pero no lo hace, tampoco funciona muy bien la recepción del ACK el getc() parece no tomarlo sin embargo si lo hago a través de la interrupción del UART funciona.

Saludos
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: uLCD-32PT de 4D Systems problemas con la transmición
« Respuesta #5 en: 19 de Enero de 2011, 16:07:14 »
Holaaa, encontre el problema de por que no funcionaba al usar el getc(), un error pavo pero se aprende  :D. Resulta que yo esperaba el dato con el getc() pero tenia activada la interrupción para también leer los datos que venían del UART y bueno la interrupción gana y me sacaba el dato entonces el getc() nunca salía o leía un 0, asi que un problema menos  :P. Hago una pregunta, la función printf() por ejemplo se le puede colocar que la función lcd_putc que originalmente pone un caracter nomas, si yo creo una función que envíe un solo caracter al LCD y escribo un texto en el printf, lo que haría sería llamar a la función que cree e ir enviando letra por letra el texto que yo escribi?

Saludos !!!
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: uLCD-32PT de 4D Systems problemas con la transmición
« Respuesta #6 en: 31 de Enero de 2011, 23:07:52 »
Bueno luego de muchas pruebas, logré dibujar objetos, mostrar imágenes desde la MMC, escribir texto, entre otras cosas. Aún no probe la escritura de archivos en FAT ni la reproducción de video y sonido y el touchscreen aun me está dando problemas. Cualquier ayuda es apreciada. Por mientras dejo una librería que hice con varias funciones del LCD . No encontré nada en internet y puede resultar muy útil. Cualquier error, sugerencia, modificación, lo que sea por favor hacermela saber así vamos mejorandola   ;-).

PD: la librería esta echa para CCS pero con cambios menores es posible pasarla a cualquier compilador de C, pensando ahora a lo rapido creo que la función make8 de CCS seria el unico impedimento, voy a revisarla con mas detalle
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado xrom

  • PIC10
  • *
  • Mensajes: 10
Re: uLCD-32PT de 4D Systems problemas con la transmición
« Respuesta #7 en: 15 de Octubre de 2011, 14:07:57 »
Hola dragondgold,
Primero de todo agradecerte el aporte de tu libreria para controlar la pantalla ULCD-32PT en modo SGS, hace poco que he adquirido una de estas pequeñas maravillas y la verdad es que tu libreria me ha ayudado a poder entender su funcionamiento.
Realizando pruebas con el touchscreen he detectado un pequeño error en la libreria que supongo que con el tiempo transcurrido ya habrás solucionado. De todos modos me he tomado la libertad de modificarla para que funcione correctamente.
Adjunto la libreria modificada y un ejemplo de su funcionamiento. Salu2.

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: uLCD-32PT de 4D Systems problemas con la transmición
« Respuesta #8 en: 15 de Octubre de 2011, 14:41:27 »
xrom me alegra que te halla servido :mrgreen: La verdad que no desarrollé más la librería porque analizando un poco terminé en la conclusión que para mi proyecto me convenía mas bien usar el LCD en modo GFX y programarlo en 4DGL que la verdad no es nada complicando sabiendo C y el foro ayuda mucho y además se libera mucho código en el PIC.
Gracias por lo de la librería, si el touch tenía un problema que había descubierto al final pero nunca lo arreglé, muchas gracias por solucionarlo es algo que no hay mucho en internet hay mucho para Arduino pero nada para PIC  :D

Saludos !!!
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado Yongk

  • PIC10
  • *
  • Mensajes: 2
Re: uLCD-32PT de 4D Systems problemas con la transmición
« Respuesta #9 en: 27 de Septiembre de 2012, 00:39:41 »
buenas noches tengo un problema con la pantalla ulcd 32pt ya que cuando le voy a cargar el firmware por el pmmc me dice acceso denegado, quisiera saber que pasa?

Desconectado sandocanet

  • PIC10
  • *
  • Mensajes: 2
Re: uLCD-32PT de 4D Systems problemas con la transmición
« Respuesta #10 en: 25 de Agosto de 2015, 10:51:48 »
Buenas, les consulto, porque recién me inicio con el 4d Systems 32PTU, pudiste hacer el cable serie para conectarte usando el software 4d Workshop 4?? parece una simple interfaz UART BRIDGE pero intente realizarlo con un CP2102 que es aparentemente el que usan en el cable oficial pero nose que colocar en la pata RES....


 

anything