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:
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í.