Autor Tema: PIC32 + librerías gráficas  (Leído 14375 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
PIC32 + librerías gráficas
« 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.



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:



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 


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PIC32 + librerías gráficas
« Respuesta #1 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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PIC32 + librerías gráficas
« Respuesta #2 en: 14 de Junio de 2010, 21:27:46 »
Hola, hace unos días Microchip publicó un tutorial para arrancar con esas pantallitas.



Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
Re: PIC32 + librerías gráficas
« Respuesta #3 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++;
        }
    }
}

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PIC32 + librerías gráficas
« Respuesta #4 en: 15 de Junio de 2010, 11:44:11 »
Según veo, SetColor() establece el color del pixel que dibujarás con SetPixel().  :huh:

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PIC32 + librerías gráficas
« Respuesta #5 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!

No contesto mensajes privados, las consultas en el foro

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
Re: PIC32 + librerías gráficas
« Respuesta #6 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++;
        }
    }
}

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
Re: PIC32 + librerías gráficas
« Respuesta #7 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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PIC32 + librerías gráficas
« Respuesta #8 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!
No contesto mensajes privados, las consultas en el foro

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
Re: PIC32 + librerías gráficas
« Respuesta #9 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.



Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PIC32 + librerías gráficas
« Respuesta #10 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!
« Última modificación: 27 de Julio de 2010, 18:52:24 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
Re: PIC32 + librerías gráficas
« Respuesta #11 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.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PIC32 + librerías gráficas
« Respuesta #12 en: 09 de Agosto de 2010, 12:16:22 »
Así, por ejemplo:

PORTBbits.RB0= dato & 0b00000001;

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PIC32 + librerías gráficas
« Respuesta #13 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!
No contesto mensajes privados, las consultas en el foro

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PIC32 + librerías gráficas
« Respuesta #14 en: 09 de Agosto de 2010, 14:51:45 »
¿El paso a booleano no es automático, Suky?


 

anything