lunes, 13 de febrero de 2012

Bitmaps RGBI

Los mapas de bits que voy a poner de ejemplo son a toda pantalla. Como ya dije en su día voy a utilizar una resolución de 208x144, así que cada imagen ocupará:

208 * 144 = 29952 B
29952 / 1024 = 29.25 KB

Arduino Mega dispone de 8KB de SRAM, así que hay que utilizar memoria de programa. Una vez creado el array de datos podemos acceder a él y copiar los datos que vamos a utilizar a SRAM, pero tenemos el inconveniente de que esto tarda un tiempo si lo hacemos desde Arduino. Pero si lo hacemos desde ASM sólo necesitamos 3 ciclos, nos sobra 1 para pintar. Para saber más acerca de los tiempos que tarda Arduino en ejecutar algunas de las instrucciones os recomiendo que miréis este link.

Esta semana he estado buscando información sobre assembler para microcontroladores AVR ya que no lo utilizo desde las prácticas de la universidad, hace por lo menos doce años. Encontré este documento en la web de Atmel con todas las instrucciones ASM para AVR.

Buscando un poco más he encontrado la web de Masami Watanabe que ha realizado varios ejemplos para pintar bitmaps con escalas de grises en NTSC. Él utiliza las siguientes instrucciones para pintar un píxel:

 
...
"lpm r0,z+\n\t"     // 1
"nop\n\t"
"out 0x08,r0\n\t"
...
 
LPM: Carga memoria de programa en el registro e incrementa el contador de posición de memoria de programa (Z).
NOP: Delay de un ciclo.
OUT: Escribe el registro en el puerto de salida.

Total: 3 ciclos (LPM) + 1 ciclo (NOP) + 1 ciclo (OUT) = 5 ciclos.

He creado una imagen de prueba y luego la he indexado con GIMP utilizando una paleta con los 16 colores, este es el resultado:

Imagen en 16 colores RGBI

Resultado en el monitor

Para pasar la imagen a código, he hecho una pequeña aplicación en VB.Net que lee la imagen pixel a pixel y genera el código del array. Está en la página de descargas.

Y como estoy contento con el resultado, he probado de pintar alguna foto:


Proceso para generar una imagen CGA válida.

Gan Buda de Kamakura. Una foto que hice en 2008.

Resultado en el monitor.

Mi gata

Resultado en el monitor.

El código del ejemplo está en la página de descargas.





PROGMEM:
http://arduino.cc/es/Reference/PROGMEM

Ready, Set, Oscillate! The Fastest Way to Change Arduino Pins:
http://www.billporter.info/ready-set-oscillate-the-fastest-way-to-change-arduino-pins/

8-bit AVR Instruction set:
http://www.atmel.com/Images/doc0856.pdf

Masami Watanabe:
http://homepage3.nifty.com/two_legs/

GIMP:
http://www.gimp.org/

No hay comentarios:

Publicar un comentario