12 de Enero, 2015

Video compuesto con Arduino Uno, desde SRAM externa

Este pasado fin de semana le eché un rato al tema y decidí empezar desde cero, más que nada porque no entendía el código que estaba usando y eso me impedía seguir adelante con el proyecto.

He encontrado bastante documentación, y ha sido cosa de leerla hasta entender cómo funciona PAL:

He repetido con la idea de usar SPI para enviar bytes a 8MHz (lo más rápido que se puede con el micro a 16MHz), y consigo salida de vídeo 32x24 en blanco y negro.

En mis pruebas he podido llegar a 40x24 caracteres, pero es un poco extremo para el microcontrolador y al final he decidido quedarme en 32x24 caracteres (que es la resolución del Spectrum, ¿casualidad?). Estoy usando code page 437, que es la codificación de caracteres para DOS; en una fuente bitmap de 256 caracteres, 8x8 pixeles.

En el ejemplo estoy usando un "modo texto", con lo que solo necesito 768 bytes de memoria de video (1 byte por caracter para saber los 8 bytes de nuestra fuente hay que mandar a la memoria de vídeo).

Para soportar gráficos, aunque sea con tiles, debería almacenar 6144 bytes de memoria de vídeo, así que decidí probar una experimento que consiste en usar memoria externa SRAM.

Estoy usando 23LCV512 de Microchip, que es bastante más de lo que necesito (64KB), pero tiene la ventaja de soportar SPI y además 5.5v (Microchip tiene chips de 32KB, pero funcionan a 3.3v, y no se pueden usar con las señales del Arduino a 5v).

La idea básica es escribir en la SRAM la memoria de vídeo, y al leer la memoria de nuevo, la salida de la SRAM iría a parar al DAC para generar la señal de vídeo.

El microcontrolador sigue generando los pulsos de sincronización y dirige el envío de datos (hay que enviar un byte desde el microcontrolador por cada byte que sale de la SRAM), pero podemos manejar mucha más memoria de vídeo a la misma velocidad: usando SRAM externa como memoria de vídeo.

El "problema" que tengo ahora es que la SRAM gestionada con SPI es muy lenta, y usando el interfaz SPI no podemos estar actualizando la pantalla y actualizando la memoria de vídeo al mismo tiempo, y en las 310 lineas de PAL que tenemos antes de empezar a dibujar (cada una es solo 64µs), no da tiempo a escribir gran cosa en la memoria de vídeo (un caracter son 8 bytes no consecutivos y SPI es muy lento: seleccionar el chip, enviar WRITE, enviar la dirección de 16-bits, enviar datos, deseleccionar el chip).

Tengo varias ideas para probar y creo que me estoy acercando a un diseño que puede valer. En ese momento publicaré esquemas y puede que algo de código.

Anotación por Juan J. Martínez, clasificada en: arduino, avr.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: