TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: elavismo en 13 de Junio de 2010, 17:56:14

Título: PIC32 + librerías gráficas
Publicado por: elavismo en 13 de Junio de 2010, 17:56:14
Hola a todos


Disculpen el cuento pero es para que tengan una idea de lo que se quiere hacer:

La amiga Suky me ayudó a finales del año pasado con mi arranque en C luego de años y años trabajando en asm. Vengo en ésta oportunidad con un proyecto nuevo el cual estoy llevando a cabo para solucionar un problema que se requiere en el departamento donde estoy haciendo mi pasantía en la Universidad de Nottingham, Uk. La idea de ésto es no solo poner mis consultas para mi beneficio sino para yo colocar lo que haga en éste proyecto y que sirva de ayuda
para otros.

El proyecto es un sistema de adquisición de imágenes con una cámara cmos (chip) que diseñó mi jefe y es de 255 x 255 pero lo que lo diferencia de cualquier lente cmos del mercado es que te permite tomar 4 imágenes a la vez, cada desfasada 90 grados. Yo no sé mucho para que se usa éso pero es con fines médicos. Por ejemplo: Si pasas un laser a través del dedo, al yo tener 4 imágenes de 255 x 255 de el otro lado del dedo, con una formula obtengo una quinta imagen que es un resultante de las 4 tomadas y con ésa imagen puedo calcular el nivel de calcio en el hueso  . Yo diseñé ya una interface con FPGA pero se usa una pc y él no quiere así que propuse usar microcontroladores para hacerlo portátil.

Un problemita, la cámara es tremendamente violenta y tiene que ser accesada a super velocidad por lo que estoy usando un PIC32 y para mostrarla en una pantalla, compré una de las pantallas y la controladora que vende MIcrochip dado a que me dieron £500 para gastar así que para no gastar tanto tiempo, compré el starter kit de PIC32 y la pantalla y por el momento tengo conectada el PIC32 a la pantalla directamente para hacer pruebas.

(http://img204.imageshack.us/img204/9487/35028338.jpg)

Pero como necesito accesar también a los otros pin del PIC32 para conectar la cámara, compré el PIC32 expansion board para poder conectar el PIC32 a ella, accesar a sus pines y poder también conectar la LCD:

(http://www.microchip.com/stellent/images/mchpsiteimages/IO%20expansion%20Board%20PicTails.png)

Recién comienzo a trabajar con el PIC y ya hice algunas pruebas y bien, pero alguno de ustedes ha trabajado con las
librerías gráficas de Microchip?


Es la locura. Mi corta experiencia con C me pega pero estoy en ello. Las librerías son gigantes y complejas pues te permite acceder a todas las funciones de touchscreen y a los widgets que ésta trae aunque lo único que yo quiero por el momento es volcar mi 255x255 imagen en la lcd gráfica. Apreciaría si alguien que las haya usado me eche una manito.

De igual forma, yo ya empecé con los ejemplos que las librerías traen pero son altamente complejas así que estoy es descifrando. Estaré publicado durante la semana y mientras trabaje mis avances con éste PIC y las librerías. Tengo unas dudas pero veré primero si puedo resolver antes de acudir a ustedes. pero si alguien entiende bien la estructura de la librería, se agradece 

(http://img529.imageshack.us/img529/3355/88127127.jpg)
Título: Re: PIC32 + librerías gráficas
Publicado por: Nocturno en 14 de Junio de 2010, 01:58:16
Yo tuve una pequeña relación amorosa con las librerías gráficas y sí recuerdo que eran muy complejas, aunque también muy bien documentadas.
Supongo que ya estás al tanto, pero en la carpeta C:\Microchip Solutions\Graphics Object Layer Demo tienes un ejemplo que desarrolla todas las capacidades de la librería gráfica, y que te permitirá ir justamente a la sección que te interesa y ver cómo esta hecha.

Además de la abundante documentación que puedes descargar desde Microchip, tienes también los primeros pinitos del maestro Diego aquí:
http://picmania.garcia-cuervo.net/c30_graphics.htm

Suerte
Título: Re: PIC32 + librerías gráficas
Publicado por: migsantiago en 14 de Junio de 2010, 21:27:46
Hola, hace unos días Microchip publicó un tutorial para arrancar con esas pantallitas.


Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 15 de Junio de 2010, 07:09:20
Gracias a ambos por la información. El GDD es para utilizar los widgets que la librería contempla y las capacidades touchscreen pero no es lo que yo necesito hacer.
Yo por el momento solo necesito volcar una imágen que tengo guardada en una memoria ram externa paralela. Les explico: Tengo una cámara cmos conectada al PIC que yo la direcciono (columna y filas) para así seleccionar cada uno de los 255 x 255 pixels y digitalizo su salida y guardo el byte en la ram externa. Es decir que tengo 65025 pixels y cada pixel es un byte...

La LCD se inicializa con void InitGraph(void) y hay una función que la coloco a continuación y es para colocar un pixel y es la función básica que todas las demas funciones para dibujar circulos y líneas usan.

/*********************************************************************
* Function: void PutPixel(SHORT x, SHORT y)
*
* Overview: Puts pixel with the given x,y coordinate position.
*
* PreCondition: none
*
* Input: x - x position of the pixel.
*       y - y position of the pixel.
*
* Output: none
*
* Side Effects: none
*
********************************************************************/
void PutPixel(SHORT x, SHORT y);


Sin embargo, como pongo mi imagen si mis pixels son bytes y esa función lo que hace es prender un pixel nada mas.
Claro, al ver los ejemplos que trae la librería, nos damos cuenta que se dibujan imágenes completas en la LCD y usan para éso
otras funciones. Hay una es monocromática y es la que necesito porque mi lente cmos es monocromático y yo capturo es la intensidad
de luz del pixel... la función se la coloco a continuación y se llama PutImage1BPP, o sea que es un byte por pixel. Hay otras funciones a color
que son 8 bytes por pixel o así va.

Cual es mi problema? todas las funciones trabajan con imágenes guardadas en la flash y se direccionan a través de un puntero.
Yo necesito es descifrar que hicieron ellos ahí para adaptarlo a mis requerimientos. La función lee el tamaño de la imágen. En mi caso
siempre tiene el mismo tamaño pero lo que no entiendo y les pregunto a ver si ustedes saben, porque leen 8 pixels de la flash?




/*********************************************************************
* Function: void PutImage1BPP(SHORT left, SHORT top, FLASH_BYTE* bitmap, BYTE stretch)
*
* PreCondition: none
*
* Input: left,top - left top image corner,
*        bitmap - image pointer,
*        stretch - image stretch factor
*
* Output: none
*
* Side Effects: none
*
* Overview: outputs monochrome image starting from left,top coordinates
*
* Note: image must be located in flash
*
********************************************************************/
void PutImage1BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch)
{
    register FLASH_BYTE *flashAddress;
    register FLASH_BYTE *tempFlashAddress;
    BYTE                temp = 0;
    WORD                sizeX, sizeY;
    WORD                x, y;
    WORD                xc, yc;
    BYTE                stretchX, stretchY;
    WORD                pallete[2];
    BYTE                mask;

    // Move pointer to size information
    flashAddress = bitmap + 2;

    // Read image size
    sizeY = *((FLASH_WORD *)flashAddress);
    flashAddress += 2;
    sizeX = *((FLASH_WORD *)flashAddress);
    flashAddress += 2;
    pallete[0] = *((FLASH_WORD *)flashAddress);
    flashAddress += 2;
    pallete[1] = *((FLASH_WORD *)flashAddress);
    flashAddress += 2;

    yc = top;
    for(y = 0; y < sizeY; y++)
    {
        tempFlashAddress = flashAddress;
        for(stretchY = 0; stretchY < stretch; stretchY++)
        {
            flashAddress = tempFlashAddress;
            mask = 0;
            xc = left;
            for(x = 0; x < sizeX; x++)
            {

                // Read 8 pixels from flash
                if(mask == 0)
                {
                    temp = *flashAddress;
                    flashAddress++;
                    mask = 0x80;
                }

                // Set color
                if(mask & temp)
                {
                // Set color
                #ifdef USE_PALETTE
                    SetColor(1);
                #else
                    SetColor(pallete[1]);
                #endif               
                }
                else
                {
                // Set color
                #ifdef USE_PALETTE
                    SetColor(0);
                #else
                    SetColor(pallete[0]);
                #endif
                }

                // Write pixel to screen
                for(stretchX = 0; stretchX < stretch; stretchX++)
                {
                    PutPixel(xc++, yc);
                }

                // Shift to the next pixel
                mask >>= 1;
            }

            yc++;
        }
    }
}
Título: Re: PIC32 + librerías gráficas
Publicado por: migsantiago en 15 de Junio de 2010, 11:44:11
Según veo, SetColor() establece el color del pixel que dibujarás con SetPixel().  :huh:
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 15 de Junio de 2010, 11:50:31
Tenes que modificar la función para tu caso. Ya sabes exactamente cual es el tamaño de la imagen y donde la vas a ubicar, por lo tanto en vez de recibir la posiciones y el buffer, directamente en la fucnión pasas a leer la memoria RAM he ir dibujando sobre la pantalla. Debes averiguar de que forma se guarda la imagen en la flash por microchip para entender el código, si es en BMP el primer Byte no es de la parte superior izquierda de la imagen  :? Por la red hay información del formato BMP. Todo esto para que entiendas un poco la programación, y directamente hagas la tuya para dibujar con los 65536 datos que recibas de la memoria ram.



Saludos!

Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 15 de Junio de 2010, 13:36:34
Hola

Ya logré entender completamente que es lo que ellos hacen en la función y no me sirve pero usaré la PutImage8BPP que es 8 bits por pixel.
La otra es 1 bit por pixel. Ya vi que el color se crea cn Setcolor pero que el formato es en rgb565 y hay una función para convertirlo..
Tengo que crear una paleta de colores, que en mi caso es escala de grises y así creo mi propia función basado en PutImage8BPP.

Si suky, tienes razón. Estas funciones trabajan con bitmap y por eso tengo que modificarla porque yo no tengo ese formato sino directamente la imágen.
Las imágenes bitmap traen el tamaño de la imágen y luego la paleta de colores y eso es lo que hace la función ésta. La seguiré analizándo y les contaré.
Saludos


/*********************************************************************
* Function: void PutImage8BPP(SHORT left, SHORT top, FLASH_BYTE* bitmap, BYTE stretch)
*
* PreCondition: none
*
* Input: left,top - left top image corner, bitmap - image pointer,
*        stretch - image stretch factor
*
* Output: none
*
* Side Effects: none
*
* Overview: outputs 256 color image starting from left,top coordinates
*
* Note: image must be located in flash
*
********************************************************************/
        #if (COLOR_DEPTH >= 8)

/* */
void PutImage8BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch)
{
    register FLASH_BYTE *flashAddress;
    register FLASH_BYTE *tempFlashAddress;
    WORD                sizeX, sizeY;
    WORD                x, y;
    WORD                xc, yc;
    BYTE                temp;
    BYTE                stretchX, stretchY;
    WORD                pallete[256];
    WORD                counter;

    // Move pointer to size information
    flashAddress = bitmap + 2;

    // Read image size
    sizeY = *((FLASH_WORD *)flashAddress);
    flashAddress += 2;
    sizeX = *((FLASH_WORD *)flashAddress);
    flashAddress += 2;

    // Read pallete
    for(counter = 0; counter < 256; counter++)
    {
        pallete[counter] = *((FLASH_WORD *)flashAddress);
        flashAddress += 2;
    }

    yc = top;
    for(y = 0; y < sizeY; y++)
    {
        tempFlashAddress = flashAddress;
        for(stretchY = 0; stretchY < stretch; stretchY++)
        {
            flashAddress = tempFlashAddress;
            xc = left;
            for(x = 0; x < sizeX; x++)
            {

                // Read pixels from flash
                temp = *flashAddress;
                flashAddress++;

                // Set color
            #ifdef USE_PALETTE
                SetColor(temp);
            #else
                SetColor(pallete[temp]);
            #endif

                // Write pixel to screen
                for(stretchX = 0; stretchX < stretch; stretchX++)
                {
                    PutPixel(xc++, yc);
                }
            }

            yc++;
        }
    }
}
Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 26 de Julio de 2010, 13:45:11
Hola  a todos

Estuve un tiempo distante pero bueno, hace semanas que logré usar la LCD a mi voluntad y con sus capacidades touchscreen. Voy a colocar al terminar el proyecto todo lo que aprendí, como manejarla y utilizar y crear objetos (widgets) :)

Tengo mucha lógica agarrada con tantos años de programación en assembler pero tengo poco tiempo con el C y a veces me cuesta hacer algo y tengo que estar revisando en internet las estructura y quiero preguntarles algo para ver si me pueden ayudar.

El proyecto éste en el que trabajo es un sistema de adquisición de video para una lente CMOS fabricado por el departamento donde trabajo, conectada a una fpga que maneja otro sistema y también con interface independiente para mandar el video a la pc con labview. Etc etc etc. Lo que pasa es que el módulo de la LCD de microchip usa pines aleatorios del pic y me deja libre que si el PortD 4 y el 5 y unos de el B y otros de el A, etc etc.

Cree un bus de 18bits para multiplexar los 4 adc externos, la memoria ram y el lente cmos porque necesitaba 18bits, pero entonces el puerto que creé me quedó de ésta manera

MSB                                                                                                LSB
  F7  F6  F5  F4  F3  F2  A15  A14  A10  A9  A7  A6  B5  B4  B3  B2  B1  B0

donde F7 es portF,7 y B0 es PortB,0.

Necesito leer y escribir en ella y tengo en una variable el valor que se escribiría. Cual es la mejor forma de partir el dato para poderlo sacar por mi puerto compuesto sin tener que revisar bit a bit de la variable para hacer SET o CLR a cada uno de ellos? porque lo hice así y toma muchas líneas de código y tengo que optimizarlo porque eso se va a hacer miles y miles de veces y tengo que reducir el tiempo de ejecución para muestrear la imágen rápidamente.

Saludos
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 26 de Julio de 2010, 14:59:14
Utilizando AND (&), OR (|) y un par de rotaciones capaz mejore el tiempo de ejecución.

Pensando que tienes el dato en una variable de 32-bits (C30 y C32, C18 permite 24-bits) para leer podrías hacer:

Código: C
  1. unsigned long Data;
  2.  
  3. Data= (PORTB & 0x003F) | (PORTA & 0x00C0) | ((PORTA>>1) & 0x0300 ) | ((PORTA>>4) & 0x0C00) | ((PORTF<<10) & (0x3F000));

Para escribir:

Código: C
  1. LATB= PORTB | (Data & 0x003F);
  2. LATA= PORTA | (Data & 0x00C0);
  3. LATA= PORTA | ((Data & 0x0300 )<<1);
  4. LATA= PORTA | ((Data & 0x0C00)<<4);
  5. LATF= PORTF | ((Data & 0x3F000)>>10);


Hay que revisar los desplazamientos que no estoy seguro que sean correctos, y ver si disminuyen los tiempos.


Saludos!
Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 27 de Julio de 2010, 18:32:33
Hola Suky. Gracias por responder

Un par de preguntas. No entiendo la lógica de el desplazamiento. Porque el desplazar?
Se que solo me interesa ciertos bits de cada puerto pero no agarro el punto de el desplazamiento porque los otros bits, algunos están siendo
usados por el módulo de la LCD que es un desastre porque toma pines de todos lados  :5]
Gracias a dios el PIC32 tiene muchos I/O.


Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 27 de Julio de 2010, 18:48:04
Mi idea fue trasladar los bits del puerto y posicionarlos en el lugar que le corresponde en la palabra que formaste para el glcd.


Saludos!
Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 09 de Agosto de 2010, 11:46:29
Suky

En C, como hago para leer un bit de una variable. quiero hacer una asignación directa de un bit de una variable a un bit de el puerto. Ejemplo:

PORTBbits.RB0= dato.BIT0

Se debe poder hacer pq en assembler se hace pero no sé el formato que usa el compilador para eso.
Título: Re: PIC32 + librerías gráficas
Publicado por: Nocturno en 09 de Agosto de 2010, 12:16:22
Así, por ejemplo:

PORTBbits.RB0= dato & 0b00000001;
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 09 de Agosto de 2010, 14:49:15
Si es el bit 0 iría directo:

Código: C
  1. PORTBbits.RB15=Dato; // Asigno el bit0 de dato a RB15.-

En cambio si es cualquier otro bit hay que aplicar una mascara como muestra Nocturno pero adicionalmente pasarlo a booleano por ejemplo haciendo:

Código: C
  1. PORTBbits.RB15=!!(Dato & 0b0001000); // Asigno el bit4 de dato a RB15.


Saludos!
Título: Re: PIC32 + librerías gráficas
Publicado por: Nocturno en 09 de Agosto de 2010, 14:51:45
¿El paso a booleano no es automático, Suky?
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 09 de Agosto de 2010, 15:23:30
¿El paso a booleano no es automático, Suky?

No. Por lo menos en C30 y C18. Y CCS me parece que tampoco, como no se usa esta forma  :mrgreen:


Saludos!
Título: Re: PIC32 + librerías gráficas
Publicado por: Nocturno en 09 de Agosto de 2010, 15:29:33
En CCS sí funciona sin convertirlo, pero no se puede asignar el pin directamente con esa sintaxis, ya que hay que definirlo previamente como #bit.

Pues gracias por la aclaración.
Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 11 de Agosto de 2010, 05:53:54
Gracias amigos. De hecho funciona como dijo Suky.

Puedo invertirlo en el caso de que quiera mandar el bit de un puerto a la variable?
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 11 de Agosto de 2010, 11:02:42
Ahí puedes hacerlo de varias formas, por ejemplo para colocar el bit en la posición bit5 de la variable:

Código: C
  1. Variable=PORTBbits.RB15<<5;
  2. Variable=PORTBbits.RB15*0x40;

Otra puede ser crear un "estilo" de estructura para crear la variable y acceder a cada bit:

Código: C
  1. typedef union{
  2.      unsigned char Val;
  3.      struct{
  4.           unsigned bit0:1;
  5.           unsigned bit1:1;
  6.           unsigned bit2:1;
  7.           unsigned bit3:1;
  8.           unsigned bit4:1;
  9.           unsigned bit5:1;
  10.           unsigned bit6:1;
  11.           unsigned bit7:1;
  12.      };
  13. }UINT8_VAL;
  14.  
  15.  
  16. UINT8_VAL Variable;


Para leer/escribir el byte completo haces Variable.Val=0x15 por ejemplo, y para acceder a los bits:

Código: C
  1. Variable.bit5=PORTBbits.RB15;


Saludos!

Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 12 de Agosto de 2010, 05:31:25
Vaya Suky.

Muchas gracias. Ya ayer modifiqué mis líneas y los hice funcionar. Tengo un problemita tratando de mostrar en la lcd el texto. Hay una instrucción en la librería que es
OutTextXY(X, Y, string); y quería colocar ahí el valor entero que estoy trayéndome de el bus que hice. Es decir, tengo el valor en la variable Dato y mostrar el número entero como un string. Era para visualizar el valor que el ADC me estaba dando. Si escribo el string directo, OutTextXY(275, 128, "luis"); si sale pero quiero poner es el valor en Dato. Tengo que hacerlo con printf, no?
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 12 de Agosto de 2010, 10:51:00
Puedes crear un buffer para guardar el string temporalmente, utilizar sprintf para general el string a partir de la variable, y al lcd cargarle el buffer.


Saludos!
Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 15 de Agosto de 2010, 08:30:22
No sé pq no me llegó el email de notificación de respuesta.


Tengo mi variable unsigned long Datax y tengo mi buffer char buf[6] y agregué el include <stdlib.h> para usar el itoa
itoa ( Datax, buf, 10); para luego hacer el printf pero me da error al compilarlo.

Undefined reference to ´itoa´

Al revisar el archivo stdlib.h, veo que el itoa no está. Esta es atoi que creo es de cadena a entero pero no el itoa que es de entero a string.

Entonces según leo en un foro de microchip, al parecer el itoa no existe en C de pic pero señalan usar sprintf en vez de itoa. No sé como usar el printf para eso
porque intenté colocando por ejemplo printf("Data = %d\n", Datax); pero el pic se queda pegado. No avanza a donde visualizo otras cosas en la LCD por lo que sé que se está quedando pegado en printf
 :(
Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 15 de Agosto de 2010, 09:45:20
Ya lo hice!

usé el sprintf(buf, "%d\n", Datax); y ya muestro el valor en la LCD mostrando a buf

Gracias
Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 24 de Agosto de 2010, 09:49:22
Hola Suky

Una preguntilla a ver si sabes que pasa. Se supone que el PIC32 a 80mhz ejecuta una instrucción en un ciclo y da 12,5ns, no?
porque una simple operación como limpiar un bit que sería un BCF y subirlo que sería un BSF en ensamblador, se toma 100ns.
Lo medió con el osciloscopio y se toma 100ns exactos.


   mPORTGClearBits(BIT_2);   
         
   PORTSetBits(IOPORT_G, BIT_2);
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 24 de Agosto de 2010, 11:14:35
Los PIC32 trabajan con cache, lo has configurado correctamente? Después puede que C32 genere código asm que no se entiende (pasa en C30), eso lo puedes ver yendo a view/list disasembly o algo así  :mrgreen: Eso depende mucho del nivel de optimización.


Saludos!
Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 24 de Agosto de 2010, 11:22:52
Si estuve tratando de ver que código assembly puso pero no lo vi.
Esta es mi configuración para 80 mhz

#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_1
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 24 de Agosto de 2010, 11:52:17
La siguiente sentencia la tienes implementada?

Código: [Seleccionar]
SYSTEMConfigPerformance(80000000L);
Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 24 de Agosto de 2010, 11:56:43
No la tengo  :shock:
Título: Re: PIC32 + librerías gráficas
Publicado por: elavismo en 17 de Octubre de 2010, 12:06:49
Hola

Espero que algún moderador ponga ésto al principio del Post.

Voy a colocar lo que aprendí sobre las librerías gráficas poniendo como ejemplo partes del código de mi proyecto.
No puedo colocarlo todo porque se me esta prohibido dado a que es parte de un proyecto de tesis de Postgrado.

Antes que nada, se debe aclarar que las librerías gráficas de Microchip son gratuitas y se consiguen bajo un paquete
que incluye USB, TCP, entre otros AQUI (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en547784)

Yo utilicé el PIC32 starter Kit y la Graphics PICtail Plus Daughter Board with 3.2inch Display Kit que comercializa Microchip y se puede observar
AQUI (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en532570)

(http://img204.imageshack.us/img204/9487/35028338.jpg)

Una vez instalada la librería y obviamente tener instalado el MPLAB, podemos aventurarnos a probar algunos de los programas de prueba
que se encuentran disponible en la carpeta MICROCHIP SOLUTIONS que es instalada por la librería en la raiz. Yo probé uno:

(http://img529.imageshack.us/img529/3355/88127127.jpg)


Antes de poder utilizar la librería, hay que establecer satisfactoriamente comunicación con la controladora de la LCD. Una fuente de preciada
información es el Microchip Graphic Library Help que se encuentra en "C:\Microchip Solutions\Microchip\Help\Graphics Library Help.chm".
Ahí podremos ver la estructura de la librería así como los objetos que se deben configurar. Antes de hablar de la librería, primero debemos
establecer comunicación con la controladora. En la ayuda, nos vamos a HARDWARE PROFILE - GRAPHICS HARDWARE PLATFORM.
La versión de la controladora que yo usé y creo que es la única que se esta vendiendo ahorita es GFX_PICTAIL_V3 y ella además de controlar
la LCD, también incluye una lectora SD y una memoria flash SPI.

En la ayuda, verán un ejemplo de como configurar parcialmente la controladora para los cuatro familias que son compatible con las librerías,
los PIC24F, PIC24H, dsPIC33F y PIC32MX. Queda de parte de ustedes echarle un vistazo a ésta sección, sin embargo, yo ya creé una versión
optimizada de la configuración para mi proyecto. Sin embargo, para quienes vayan a usarla con otro pic que no sea el PIC32 o tenga una versión
diferente de la controladora, el HardwareProfile.h que adjunté sirve para todos los PICs y controladoras.

Ahora vamos a echarle un vistazo a la librería viendo el Microchip Graphic Library Help. La librería se divide en capas como se pueden observar
a continuación:

Application Layer – This is the program that utilizes the Graphics Library.
User Message Interface- This layer should be implemented by user to provide messages for the library.
Graphics Object Layer – This layer renders the widgets controls such as button, slider, window and so on.
Graphics Primitives Layer – This layer implements the primitive drawing functions.
Device Display Driver – This layer is dependent on the display device being used.
Graphics Display Module – This is the display device being used.


(http://img89.imageshack.us/img89/8273/83541858.jpg)

Comenzamos con la capa Graphics Display Module y no es mas que la LCD y la controladora a usar. No hay nada mas que ver aquí
y nos vamos a la capa Device Display Driver donde va nuestro archivo de configuración HardwareProfile.H. Esta capa tiene dos
funciones: Una es comunicarse con el hardware y la otra es proveer las instrucciones básicas en la cual se basan todas las operaciones
de las capas superiores como por ejemplo, PutPixel().

Nos vamos a la siguiente capa que es Graphics Primitives Layer y nos vamos a quedar por el momento en ella. Esta capa se basa
obviamente en la anterior y provee funciones para dibujar líneas, círculos, cuadrados, etc etc. Para ver el listado completo de las funciones
que existen en ésta capa, abrir el archivo "Primitives.h" en la carpeta de la librería.

Esta el archivo GraphicsConfig.H el cual nos define las funciones de la LCD que queremos activar. Hay que recalcar que la librería
es bien extensa y no llegué a usar todas sus funciones. Este archivo nos permite activar objetos de la capa de aplicación así
como el acceso a la memoria flash SPI, la SD y el beep de la controladora. La LCD funciona inclusive sin éste archivo pero es bueno tenerlo.

Hay dos formas de arrancar un proyecto. Una es abrir un ejemplo de la librería, borrar todo lo que no vas a usar y usarlo como base
para arrancar tu proyecto o simplemente adjuntar los archivos que vas a requerir. La primera opción se las dejo a ustedes pero les diré
cuales son los archivos que necesitaremos. Una vez hayamos arrancado el MPLAB y creado nuestro proyecto, vamos a organizar que vamos a
agregar.

Primero agregar los header y source files (Los que requieran) a el proyecto desde la carpeta de la librería. Yo agregué todos pero el que se necesita
solamente a éste nivel es el Primitive.H. Sin embargo, cuando vayan a usar objetos o funciones de las aplicaciones superiores, necesitarán
agregarlas. Luego agregamos el archivo de configuración HardwareProfile.H y si queremos, agregamos el header GraphicsConfig.H. El GraphicsConfig.H
será útil a la hora de definir las paletas de colores.

También si queremos usar el beep, la lectora SD y la eeprom en la controladora, deberemos agregar tanto el source como el header Board support package
que consiguen en la librería y son beep.c, cpld.c, eeprom.c, sst25vf016.c y touchscreen.c.

Son muchos archivos que agregar pero es porque la librería en sí es muy amplia y depende de lo que vayan a usar. Para trabajar en la capa primitiva, no
es necesario agregar los archivos Board Support Package. En la capa primitiva, podremos dibujar en la LCD y todo, pero toda la información que se requiere se
consigue en el Microchip Graphic library help, en la sección Graphics Primitive Layers.
Ojo para los que van a usar un demo para usar su proyecto. Los demos tienen solo los archivos que usan ellos y algunos están optimizados por lo que
les puede generar problema.

Luego de haber agregado todos los archivos, vamos a configurar y arrancar la LCD en nuestro Proyecto.C.
Primero incluimos lo siguiente:

    #include "GenericTypeDefs.h"      //obligatorio
    #include "Graphics\Graphics.h"   //obligatorio
    #include "EEPROM.h"      //Solo si queremos usar la eeprom en la controladora
    #include "SST25VF016.h"      //Solo si vamos a usar la lectora SD
    #include "TouchScreen.h"  //solo si vamos a usar el touchscreen que se usa en las capas superiores
    #include "Beep.h"   //solo si se va a usar el beep de la tarjeta
    #include "cpld.h"  //no se que es pero yo no lo tengo.

Y ahora tenemos que inicializar lo que vayamos a usar

  GOL_MSG msg;                    // GOL message structure to interact with GOL. Es para la capa de aplicación
    INTEnableSystemMultiVectoredInt();  //activa el sistema multi vector para la interrupción
    SYSTEMConfigPerformance(GetSystemClock());  //La librería se adapta a al velocidad configurada para poder operar adecuadamente.
    GOLInit();                      // inicializa la librería
    SST25Init();                    // inicializa GFX3 SST25 flash SPI
 //   TouchInit();                    // inicializa touch screen
   InitGraph();
 //   TickInit();                     // inicializa tick counter (for random number generation). No lo van a usar a menos que vayan a usar el touchscreen pero para eso hay que definir el Void que lo que hace es iniciar el Timer 3 para que se active con la interrupción. Cada vez que se interrumpa, ejecuta la función TouchProcessTouch() que es la que lee el touchscreen pero eso es arena de otro costal y no se va a explicar en ésta sección.

 
Ya tenemos inicializado la LCD y queremos dibujar pero como funciona?


Prácticamente la LCD es una matriz de pixeles pero como es RGB, cada pixel en realidad son 3 pixeles.
Como en cada LCD, la forma de dibujar es ubicándonos  en un pixel y activándolo pero como es un pixel RGB, debemos primero darle el color.
Para ello vamos a usar la función SetColor(), el cual acepta números enteros para definir el color. La librería tiene una paleta de colores
pequeña definida en el archivo PeletteColorDefines.H donde podrán ver que hay algunos colores. Por ejemplo, si queremos dibujar en color blanco,
escribimos SetColor(WHITE);, y ya el blanco es seleccionado. Ahora queremos activar un pixel, entonces usamos la instrucción PutPixel(X,Y);,
donde X y Y son las coordenadas donde quieres activar el pixel en color blanco y ya, así de sencillo dibujamos.

Si queremos limpiar podemos seleccionar color negro y barrer los pixeles activados o simplemente limpiar la pantalla con ClearDevice();.

Si queremos escribir, usamos la instrucción OutTextxy(x,y, string); donde X y Y son las instrucciones y string es el texto que queremos usar.
Sin embargo, antes de escribir, se debe seleccionar la fuente y eso se hace una sola vez y se puede hacer al principio del programa con
la instrucción SetFont((void *) &GOLFontDefault);.

Para dibujar líneas, usamos la función LineTo(x,y); el cual nos dibuja una línea desde la posición actual del cursor a la coordenada establecida
y para mover el cursos usamos la función MoveTo(x,y);

Por lo que ven, no es complicado y sé que a veces no es fácil arrancar pero para cerrar la sección de la capa primitiva, voy a colocar un workplace
completo que incluya configuración, todas las librerías e inicializaciones para que sea compatible con todas las funciones de la controladora y de la LCD
de forma que sean ustedes quienes decidan que usar y en base a ese proyecto, colocaré un par de ejemplillos. Eso lo haré la semana que viene.



Título: Re: PIC32 + librerías gráficas
Publicado por: migsantiago en 17 de Octubre de 2010, 12:46:38
Oye, gracias por los pasos para usar esta librería.

Sobre el mensaje en el primer post, creo que no hace falta. Los interesados no se deberán cansar de leer todo. Y si se cansan... entonces no están interesados.
Título: Re: PIC32 + librerías gráficas
Publicado por: manwenwe en 17 de Octubre de 2010, 14:41:15
Creo que este hilo será muy productivo para todos.

Tambiém creo que sería buena idea añadir info entre todos acerca del hardware:

- Controladores compatibles: dónde adquirirlos y cmo conectar PIC+Controlador+LCD.
- Controladores NO compatibles: dónde adquirilos, cómo conectar PIC+Controlador+LCD, crear driver y cómo modificar HardwareProfile.h.
- Displays compatibles con controladores: dónde adquirlos.

No se a vosotros pero a mi me ha dado muchos quebraderos de cabeza encontrar hardware para realizar mis propias placas. Los controladores se  encuentran más o menos fácil pero los LCD NO: la mayoría son chinos y hay pocas webs online de electrónica que los vendan (por ejemplo Mouser tiene bastantes).

Por otro lado está el tema de los nuevos PIC24FJ256DA que llevan el controlador gráfico integrado. Tengo a medias mi propia placa con la intención de hacer un marco digital con pendrive: simplemente por el gusto de probar el rendimiento que tienen (ya sé que podría haber comprado la tarjeta de evaluación pero soy cabezota y me gusta probar las cosas antes para tener el esquemático en un futuro). Cuando la termine de montar y la programe colgaré el esquema y el código :-)

En fin, gran post y demós gracias a Microchip que nos provee una GUI gratis: que yo sepa ningún fabricante más lo hace...

Saludos
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 02 de Noviembre de 2010, 14:26:05
Una consulta, las librerías gráficas que provee Microchip implementa drivers para los controladores de los paneles touch, como por ejemplo uno compatible con el ADS7843 ?

Si tienen información de estos driver, bienvenida sea  :mrgreen:


Saludos!
Título: Re: PIC32 + librerías gráficas
Publicado por: manwenwe en 02 de Noviembre de 2010, 16:57:52
Hola Suky.

Si no está escondido por ahí y no lo he visto: no hay driver para controladores de touchpanel. Lo que sí proveen es una librería para controlar la pulsación en touchscreen resistivo a través del ADC del propio micro. No es preciso del todo pero tp es que funcione mal.

Saludos.
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 02 de Noviembre de 2010, 17:24:53
Hola Suky.

Si no está escondido por ahí y no lo he visto: no hay driver para controladores de touchpanel. Lo que sí proveen es una librería para controlar la pulsación en touchscreen resistivo a través del ADC del propio micro. No es preciso del todo pero tp es que funcione mal.

Saludos.

Es lo que me paso, revise todo y no me pareció verlo, pero como hay tantas cosas!  :D Igualmente estuve mirando el datasheet del ADS7843 y parece sencillo, a trabajar!  :mrgreen:


Saludos!
Título: Re: PIC32 + librerías gráficas
Publicado por: manwenwe en 02 de Noviembre de 2010, 17:30:28
Suky, ¿qué ventajas tienen este tipo de controladores sobre el método analógico? La desventajas del método analógico para mí son: resolución y carga de proceso.

Saludos
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 02 de Noviembre de 2010, 17:37:53
Suky, ¿qué ventajas tienen este tipo de controladores sobre el método analógico? La desventajas del método analógico para mí son: resolución y carga de proceso.

Saludos

No he analizado nada al respecto  :? Me ha llegado una pantalla con este controlador y no me queda otra que usarlo  :D Por lo que leí de este controlador, es muy interesante, dispone de interfaz SPI (que con 24 clock realizamos una conversión), una linea que puede generar una interrupción en el microcontrolador cuando la pantalla táctil, a la cual está conectado, se toca.

Veremos que sale  ;-)


Saludos!
Título: Re: PIC32 + librerías gráficas
Publicado por: fram_22 en 10 de Febrero de 2011, 01:15:27
Hola:

Este hilo me es sumamanete interesante y ha sido de gran ayuda para entender el uso del software.
Sin embargo he notado que microchip en sus tarjetas demo incluye un CI el (SSD1926). Pero no me
queda del todo claro la funcion que cumple. Es absolutamente necesario para utilizar el display? Si no lo es. Que funcion cumple?
Alguien tiene la hoja de datos a la mano?
De ante mano muchas gracias por su respuesta.
Título: Re: PIC32 + librerías gráficas
Publicado por: Suky en 10 de Febrero de 2011, 10:20:14
SSD1926->
http://www.google.com.ar/search?sourceid=chrome&ie=UTF-8&q=datasheet+SSD1926

Por lo visto es de gran ayuda ese C.I.  :mrgreen:


Saludos!
Título: Re: PIC32 + librerías gráficas
Publicado por: fram_22 en 10 de Febrero de 2011, 15:08:34
Hola:

Estoy comenzando a utilizar la libreria grafica de microchip pero tengo problemas.
He instalado la libreria y cuento con una Graphics PICtail Plus Daughter Board igual a la de elavismo.
Sin embargo cuando compilo el programa (que aun no tiene nada mas que la inicializacion y los include que menciona elavismo) obtengo como error
lo siguiente:

Código: [Seleccionar]
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Program Files (x86)\Microchip\MPLAB C32 Suite\bin\pic32-gcc.exe" -mprocessor=32MX360F512L -x c -c "imagenes_codigo.c" -o"imagenes_codigo.o" -MMD -MF"imagenes_codigo.d"  -g
imagenes_codigo.c:3:47: Graphics\Graphics.h: No such file or directory
imagenes_codigo.c:4:78: EEPROM.h: No such file or directory
imagenes_codigo.c:5:66: SST25VF016.h: No such file or directory
imagenes_codigo.c:6:99: TouchScreen.h: No such file or directory
imagenes_codigo.c:7:65: Beep.h: No such file or directory
imagenes_codigo.c:8:55: cpld.h: No such file or directory
imagenes_codigo.c:14: error: syntax error before "Font25"
imagenes_codigo.c:14: warning: data definition has no type or storage class
imagenes_codigo.c:15: error: syntax error before "Font35"
imagenes_codigo.c:15: warning: data definition has no type or storage class
imagenes_codigo.c: In function `main':
imagenes_codigo.c:20: error: `GOL_MSG' undeclared (first use in this function)
imagenes_codigo.c:20: error: (Each undeclared identifier is reported only once
imagenes_codigo.c:20: error: for each function it appears in.)
imagenes_codigo.c:20: error: syntax error before "msg"
imagenes_codigo.c:30:2: warning: no newline at end of file
Halting build on first failure as requested.

Este error no me hace mucho sentido porque he agregado los archivos de la libreria a mi proyecto. Acaso tengo tambien que copiarlos al directorio del mismo?
Cualquier ayuda sera apreciada.
saludos
Título: Re: PIC32 + librerías gráficas
Publicado por: fram_22 en 10 de Febrero de 2011, 15:14:33
Casi lo olvido. tambien anexo el codigo.
Como pueden ver es practicamente lo que señala elavismo para inicial el proyecto.
Pero no se que ocurre con los archivos.

Código: [Seleccionar]
#include <plib.h>
#include "GenericTypeDefs.h"      //obligatorio
#include "Graphics\Graphics.h"   //obligatorio
#include "EEPROM.h"      //Solo si queremos usar la eeprom en la controladora
#include "SST25VF016.h"      //Solo si vamos a usar la lectora SD
#include "TouchScreen.h"  //solo si vamos a usar el touchscreen que se usa en las capas superiores
#include "Beep.h"   //solo si se va a usar el beep de la tarjeta
#include "cpld.h"  //no se que es pero yo no lo tengo.
//
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
#pragma config POSCMOD = XT, FNOSC = PRIPLL, FPBDIV = DIV_2
//
///////////////////////////////// FONTS ///////////////////////////////////////
extern const FONT_FLASH     Font25;
extern const FONT_FLASH     Font35;
//////////////////////////////////MAIN/////////////////////////////////////
int main(void){
SYSTEMConfigPerformance(80000000); // Fpb=10Mhz
//
 GOL_MSG msg;                    // GOL message structure to interact with GOL. Es para la capa de aplicación
    INTEnableSystemMultiVectoredInt();  //activa el sistema multi vector para la interrupción
    SYSTEMConfigPerformance(GetSystemClock());  //La librería se adapta a al velocidad configurada para poder operar adecuadamente.
    GOLInit();                      // inicializa la librería
    SST25Init();                    // inicializa GFX3 SST25 flash SPI
 //   TouchInit();                    // inicializa touch screen
   InitGraph();
 

}

saludos
Título: Re: PIC32 + librerías gráficas
Publicado por: manwenwe en 10 de Febrero de 2011, 16:54:39
fram_22,

Si copias los fuentes a tu proyecto te vas a volver loco. Hay decenas de "includes" que hacen referencia a archivos de cabecera desde una ruta "relativa" no "absoluta". Además hay includes de archivos fuente por lo que a simple vista no se intuye que sean parte del proyecto.

Para trabajar con cualquier stack de microchip, mi consejo es que partas desde un ejemplo. Crea el directorio de tu proyecto y alli copias la caperta del ejemplo desde que vas a partir y la carpeta "Microchip". Te compilará a la primera. Más adelante puedes ir eliminando todo lo que no necesites...

Un saludo.
Título: Re: PIC32 + librerías gráficas
Publicado por: fram_22 en 11 de Febrero de 2011, 17:14:17
Manwenwe:

Hice lo que me has dicho y he logrado hacerlo funcionar. Muchas gracias por la sugerencia.
Ahora a graficar los datos. Cuando termine les paso algunas fotos.
Saludos!!
Título: Re: PIC32 + librerías gráficas
Publicado por: manwenwe en 12 de Febrero de 2011, 10:45:12
Me alegro de que te funcionase...

A dibujar!!! jeje
Título: Re: PIC32 + librerías gráficas
Publicado por: curlae en 11 de Junio de 2012, 16:13:25
fram_22,

Si copias los fuentes a tu proyecto te vas a volver loco. Hay decenas de "includes" que hacen referencia a archivos de cabecera desde una ruta "relativa" no "absoluta". Además hay includes de archivos fuente por lo que a simple vista no se intuye que sean parte del proyecto.

Para trabajar con cualquier stack de microchip, mi consejo es que partas desde un ejemplo. Crea el directorio de tu proyecto y alli copias la caperta del ejemplo desde que vas a partir y la carpeta "Microchip". Te compilará a la primera. Más adelante puedes ir eliminando todo lo que no necesites...

Un saludo.

Hola, queria saber bien como seria esto de copiar las carpetas. En tu nueva carpeta pones la carpeta del ejemplo y también la carpeta microchip (esta ultima que carpeta microchip seria).
Saludos