sábado, 4 de febrero de 2012

Más resolución

Para dar más resolución primero hay que entender cómo funciona la señal de video en una televisión. El sistema PAL utiliza 25 fotogramas por segundo, cada uno de los cuales está formado por dos imágenes. En las líneas impares del fotograma se pinta la primera imagen (campo impar) y en las pares la segunda (campo par), generando así una frecuencia de 50 imágenes por segundo. Entonces, cada fotograma es el resultado de entrelazar dos imágenes.

 Las características del sistema PAL son las siguientes:
Aspecto: 4:3
Líneas: 625
Líneas visibles: 576
Columnas: 720
Frecuencia de cuadro: 25Hz (25 fotogramas por segundo o 40ms por fotograma)
Frecuencia de campo: 50Hz (50 imágenes por segundo o 20ms por imagen)
Periodo de línea: 64us
Periodo visible de línea: 52us
Pórtico anterior: 1.5us (Señal HIGH)
Sincronismo horizontal: 4.7us (Señal LOW)
Pórtico posterior: 5.8us (Señal HIGH)
Pulso vertical: 27.3us
Pulso igualador: 2.35us

Con esta información sabemos que cada línea invierte 64us en total y que si la parte visible invierte 52us, nos quedan 12us para generar una señal de sincronía horizontal.



Ciclos de reloj de línea visible: 52us * 16MHz = 832 ciclos


¿Qué resolución horizontal podemos obtener con 832 ciclos?

Resolución horizontal Ciclos por píxel
832 1
416 2
208 4
104 8
52 16
... ...

Yo creo que la resolución buena es la de 208px, esto quiere decir que invertiremos 4 ciclos en pintar cada uno de los píxels que forman la línea.

Si el aspecto es 4:3, entonces la resolución vertical sería:



208px / 4 * 3 = 156px.


¿Cuál es la resolución vertical disponible que más se acerca si tenemos 576 líneas visibles?

Resolución vertical Líneas por pixel
576 1
288 2
192 3
144 4
... ...

El valor más cercano a 156 es 144, así que utilizando 4 líneas para cada píxel tenemos una resolución final de 208x144.

Sincronía:

Monochrome Composite Video
Imagen original (Batsocks)

Viendo el gráfico anterior, vemos que los 12us no visibles de cada línea visible se invierten en generar una señal de sincronía horizontal de la siguiente forma:

4.7us HSync + 5.8us Back Porch + 1.5us Front Porch = 12us
4.7us HSync + 5.8us Back Porch + 52us color + 1.5us Front Porch = 64us


La sincronía vertical se obtiene de la siguiente forma:

2.5 líneas: 5 pulsos de igualación
2.5 líneas: 5 pulsos vertical
2.5 líneas: 5 pulsos de igualación
Total: 7.5 líneas de sincronía por campo


Además, entre las líneas de sincronía vertical y las líneas visibles existen otras líneas reservadas a otros temas como por ejemplo teletexto o información digital como el nombre de la cadena que estamos viendo. Estas líneas no las utilizaremos.

Pues bien, hoy voy a intentar conseguir la resolución horizontal.
Para pintar un píxel utilizando 4 ciclos he probado el siguiente código:

 
...
// Puertos
#define SYNC     PORTB
#define PORT     PORTC
...
// Dibuja un pixel
#define DrawPx(color) PORT=color; NOP; NOP; NOP;
...
 



La instrucción para escribir en un puerto (PORT=color) tarda un ciclo.
La instrucción NOP espera un ciclo sin hacer nada.
Además, esta vez he utilizado interrupciones de timer cada 40000us (1 fotograma) así dejo libre el loop para el futuro código del juego.


Resultado en el monitor


El código lo podéis descargar aquí.

No hay comentarios:

Publicar un comentario