TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: KALLITOS en 02 de Abril de 2012, 13:42:34

Título: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 02 de Abril de 2012, 13:42:34
Hola amigos, utilizando el graphic resource de microchip, obtengo un archivo .c, el cual es una imagen bmp, lo que deseo hacer es mostrarla en un display TFT, me gustaria hacerlo dibujando punto por punto de una manera no lineal ni en orden, para que ese efecto haga que no se note como va dibujando pixel a pixel.

Código: C
  1. asm(".section .const, psv");
  2.  
  3. extern const char __logo_BMP_desa[] __attribute__((space(prog), aligned(2)));
  4.  
  5. const IMAGE_FLASH logo_BMP_desa =
  6. {
  7.     (FLASH | IMAGE_MBITMAP | COMP_NONE),
  8.     (FLASH_BYTE *)__logo_BMP_desa
  9. };
  10. asm(".section *, code");
  11. asm(".global ___logo_BMP_desa");
  12. asm(".align 2");
  13. asm("___logo_BMP_desa:");
  14. /****************************************
  15.  * Bitmap header
  16.  ****************************************/
  17. asm(".byte 0x00");           // Compresssion
  18. asm(".byte 0x10");           // Color Depth
  19. asm(".byte 0xDD, 0x00");     // Height
  20. asm(".byte 0x90, 0x01");     // Width
  21. /********************************
  22.  * Bitmap Image Body
  23.  *********************************/
  24. asm(".byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF");
  25. asm(".byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF");
  26. asm(".byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF");
  27. asm(".byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF");
  28. ......
  29. ....
  30. ...

Como puedo hacer para acceder a cada byte del archivo?
Estoy usando C30.

Saludos
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 02 de Abril de 2012, 14:48:50
Encontré algo de codigo en la web de suky.
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 02 de Abril de 2012, 21:30:19
Buscando en la carpeta de microchip encontre como hacen dibujo de archivo bmp, estoy intentando usar solo parte del codigo y meterlo en el mio, pero la data generada por el soft hace referencia a graphics.h y este a un monton de cosas que no me interesan.

Como puedo hacer para mi archivo no dependa de ese bendito graphics.h.

El codigo para mostrar el bmp es este
Código: C
  1. void PutImage16BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch)
  2. {
  3.     register FLASH_WORD *flashAddress;
  4.     register FLASH_WORD *tempFlashAddress;
  5.     WORD                sizeX, sizeY;
  6.     register WORD       x, y;
  7.     WORD                temp;
  8.     register BYTE       stretchX, stretchY;
  9.  
  10.     // Move pointer to size information
  11.     flashAddress = (FLASH_WORD *)bitmap + 1;
  12.  
  13.     // Read image size
  14.     sizeY = *flashAddress;
  15.     flashAddress++;
  16.     sizeX = *flashAddress;
  17.     flashAddress++;
  18.  
  19.     DisplayEnable;
  20.     for(y = 0; y < sizeY; y++)
  21.     {
  22.         tempFlashAddress = flashAddress;
  23.         for(stretchY = 0; stretchY < stretch; stretchY++)
  24.         {
  25.             flashAddress = tempFlashAddress;
  26.             SetAddress(left, top);
  27.             for(x = 0; x < sizeX; x++)
  28.             {
  29.  
  30.                 // Read pixels from flash
  31.                 temp = *flashAddress;
  32.                 flashAddress++;
  33.  
  34.                 // Set color
  35.                 SetColor(temp);
  36.  
  37.                 // Write pixel to screen                  
  38.                 for(stretchX = 0; stretchX < stretch; stretchX++)
  39.                 {
  40.                     WritePixel(_color);
  41.                 }
  42.             }
  43.             top++;
  44.         }
  45.     }
  46. }

Y la imagen esta por aca

Código: C
  1. asm(".section .const, psv");
  2.  
  3. extern const char __logo_BMP_desa[] __attribute__((space(prog), aligned(2)));
  4.  
  5. const IMAGE_FLASH logo_BMP_desa =
  6. {
  7.    (FLASH | IMAGE_MBITMAP | COMP_NONE),
  8.    (FLASH_BYTE *)__logo_BMP_desa
  9. };
  10. asm(".section *, code");
  11. asm(".global ___logo_BMP_desa");
  12. asm(".align 2");
  13. asm("___logo_BMP_desa:");
  14. /****************************************
  15. * Bitmap header
  16. ****************************************/
  17. asm(".byte 0x00");           // Compresssion
  18. asm(".byte 0x10");           // Color Depth
  19. asm(".byte 0xDD, 0x00");     // Height
  20. asm(".byte 0x90, 0x01");     // Width
  21. /********************************
  22. * Bitmap Image Body
  23. *********************************/
  24. asm(".byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF");
  25. asm(".byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF");
  26. asm(".byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF");
  27. asm(".byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF");
  28. ......
  29. ....
  30. ...

Saludos
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: Suky en 02 de Abril de 2012, 23:38:48
Y la imagen donde la tenes? En una eeprom, SD, o? En la memoria de programa está  :mrgreen:

Citar
Como puedo hacer para mi archivo no dependa de ese bendito graphics.h.

Vas a tener que ver que vincula la funcion que utilizas con los include  :tongue: Microchip en eso complica bastante las cosas. Por ahí te conviene entender como es que están guardados los datos de la imagen en el archivo y hacer tu propia función

Dibujar pixeles aleatorios va a ser un toque complejo me parece, pensando en que elijes al azar, verificando que no se haya elegido antes y además de completar el dibujo  :tongue: A estas horas de la noche no se me ocurre nada  :x
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 03 de Abril de 2012, 00:50:26
La imagen esta en la flash del pic.
Logre hacer que ya no me de errores, colocandole los siguientes includes

#include "GenericTypeDefs.h"
#include "Primitive.h"

y eliminando el graphics.h

En el display solo se muestra una linea  :?, lo de aleatoria lo estuve pensando y mejor lo hare por bloques fijos desordenados :z) pero la idea sigue siendo la misma, evitar que se vea el dibujo pixel a pixel, línea a línea.

En lo que estoy es mostrar la imagen, aun no logro hacerlo, por los codigos que he vistao, creo que voy bien.

Sigo en esto  :)

saludos
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 03 de Abril de 2012, 01:20:22
Logré dibujar el bmp en el display, la imagen esta pequeña, ahora me toca hacerla de tamaño completo.

sigo con esto  :)
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 03 de Abril de 2012, 02:18:21
Ahora ya es muy grande el archivo y no compila por el tamaño.  :?

Y ahora, ya no puedo poner memoria externa. otro  :?
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: Suky en 03 de Abril de 2012, 08:34:00
Ahora ya es muy grande el archivo y no compila por el tamaño.  :?

Y ahora, ya no puedo poner memoria externa. otro  :?

Si, las imágenes a color ocupan mucho espacio. Generalmente se puede usar memorias de 16 Mbit o una SD Card  :?


Saludos!
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 03 de Abril de 2012, 12:32:01
Bueno aun sigo en esto, ya muestro imagen a pantalla completa haciendo un zoom de 3, no tiene buena resolución pero bueno pasa, lo de la muestra "aleatoria" aun esta en pausa, y es que tengo que poner algo mas de codigo y ya no entra, me dice que use un pic de mas capacidad, estoy usando un pic24HJ256Gp210, lo raro es ke en el memory usage me muestra 34818 de 87552 en flash y en ram 1626 de 16384, acaso el archivo de la imagen bmp no es cargada en el calculo del memory usage o hay que hacer algun arreglo en el mplab.

Ayudenme please.

saludos
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 03 de Abril de 2012, 19:42:03
Definitivamente el pic no esta lleno, veo en el soft del pickit3 que aun queda bastante memoria libre, pero me sigue dando este error:

ILI9327+HX.o(.text+0x18): In function `Lcd_Init':
D:\CARLOS\CARLOS\codigo\ILI9327+HX.c:127: Link Error: PC Relative branch to '___delay32' is out of range. Suggest large-code model.
ILI9327+HX.o(.text+0x20):D:\CARLOS\CARLOS\codigo\ILI9327+HX.c:129: Link Error: PC Relative branch to '___delay32' is out of range. Suggest large-code model.
ILI9327+HX.o(.text+0x28):D:\CARLOS\CARLOS\codigo\ILI9327+HX.c:131: Link Error: PC Relative branch to '___delay32' is out of range. Suggest large-code model.
ILI9327+HX.o(.text+0x3c):D:\CARLOS\CARLOS\codigo\ILI9327+HX.c:136: Link Error: PC Relative branch to '___delay32' is out of range. Suggest large-code model.
Link step failed.
----------------------------------------------------------------------
Release build of project `D:\CARLOS\CARLOS\codigo\asdf.mcp' failed.
Language tool versions: pic30-as.exe v3.31, pic30-gcc.exe v3.31, pic30-ld.exe v3.31, pic30-ar.exe v3.31
Tue Apr 03 17:32:24 2012
----------------------------------------------------------------------
BUILD FAILED

Que puedo hacer con eso? Estara entrando a tallar la limitación de codigo?, no creo.

 :?



Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 04 de Abril de 2012, 21:28:29
Alguna sugerencia  :lol:
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: Suky en 04 de Abril de 2012, 21:38:51
Hola! Viste que te sugiere algo? Fíjate que se puede hacer en Project/Build Options/Project ... MPLAB C30/Categories/Memory Model  ;-)


Saludos!
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 05 de Abril de 2012, 13:04:40
Joer suky, ya compilo, estaba mirando pero lo del heap size y no me di cuenta de eso.

Crei que me sugeria un pic con mas memoria  :lol:

Muchas gracias suky  :)

saludos
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: Vtronic en 05 de Abril de 2012, 17:16:36
La imagen bmp se dibuja píxel por píxel, lo que se me ocurre es

hacer una matriz con dos vectores del mismo tamaño de la imagen
llenar con 1 la posición de la matriz que corresponda la coordenada del píxel
generar las posiciones del píxel aleatoriamente
verificar
            si esta ya esta llena la casilla generar otra coordenada
            si esta vaciá dibujar el píxel con el valor correspondiente
haces esto hasta que los píxeles dibujados sean igual a la cantidad de píxeles de la imagen

mencione vectores porque no se me viene el nombre de la función para hacer una matriz   :oops: algo parecido implemente en un juego de ajedrez tal vez se ponga lento al dibujar en la pantalla pero es una opción

Saludos.
Título: Re: Mostrar imagen bmp de manera aleatoria
Publicado por: KALLITOS en 09 de Abril de 2012, 23:54:36
Nuevamente aparece el error  :(,


Program Memory  [Origin = 0x200, Length = 0x2a9fe]

section                    address   length (PC units)   length (bytes) (dec)
-------                    -------   -----------------   --------------------
.text                        0x200              0x177a          0x2337  (9015)
.const                      0x197a               0x6f6           0xa71  (2673)
.text                       0x2070              0xa418          0xf624  (63012)
C:\Users\Carlos\AppData\Local\Temp/cc6RQS3R.s.scn1    0xc488              0x4ad6          0x7041  (28737)
.text                      0x10f5e               0x9ec           0xee2  (3810)
.dinit                     0x1194a               0x26e           0x3a5  (933)
.text                      0x11bb8               0x1e8           0x2dc  (732)

                     Total program memory used (bytes):        0x1a970  (108912) 41%


Data Memory  [Origin = 0x800, Length = 0x4000]

section                    address      alignment gaps    total length  (dec)
-------                    -------      --------------    -------------------
.nbss                        0x800                   0           0x112  (274)
.ndata                       0x912                   0           0x10e  (270)
.data                        0xa20                   0           0x200  (512)
.dconst                      0xc20                   0            0x2a  (42)
.data                        0xc4a                   0            0x26  (38)
.bss                         0xc70                   0             0x6  (6)
.heap                        0xc76                   0           0x3e8  (1000)

                        Total data memory used (bytes):          0x85e  (2142) 13%


Dynamic Memory Usage

region                     address                      maximum length  (dec)
------                     -------                      ---------------------
heap                         0xc76                               0x3e8  (1000)
stack                       0x105e                              0x37a2  (14242)

                        Maximum dynamic memory (bytes):         0x3b8a  (15242)

c:/program files/microchip/mplab c30/bin/bin/../../lib\libc-coff.a(fputc.XXo)(.libc.fputc+0x6e):fake: Link Error: PC Relative branch to '_write' is out of range. Suggest large-code model.
c:/program files/microchip/mplab c30/bin/bin/../../lib\libc-coff.a(flsbuf.XXo)(.libc._flsbuf+0x30):fake: Link Error: PC Relative branch to '_write' is out of range. Suggest large-code model.
c:/program files/microchip/mplab c30/bin/bin/../../lib\libc-coff.a(flsbuf.XXo)(.libc._flsbuf+0x52):fake: Link Error: PC Relative branch to '_write' is out of range. Suggest large-code model.
c:/program files/microchip/mplab c30/bin/bin/../../lib\libc-coff.a(flsbuf.XXo)(.libc._flsbuf+0x76):fake: Link Error: PC Relative branch to '_write' is out of range. Suggest large-code model.
Link step failed.
----------------------------------------------------------------------






alguna otra cosa por hacer que no sea poner memoria externa?

Saludos