Hola amigos que tal? Estoy trabajando con este proyectito para una aplicación escolar y les voy a hablar un poco de lo que se sobre el tema para aquel que le sea de utilidad.
Estoy utilizando un Pic16F84 con un cristal de 20Mhz, lo cual me es suficiente para generar imagen a buena resolución en blanco y negro. También se puede generar imagen a color pero es bastante mas complicado asi que por lo pronto les hablo del que esta en blanco y negro.
Miren, para programar eso (los que saben assambler y lo van a programar de mano propia) hay que tener muy en cuenta el tiempo dado que la señal debe estar perfectamente sincronizada y conseguirlo hay que cuantificar el tiempo que tarda cada instrucción de nuestro programa y determinar los tiempos de cada instrucción. En el caso de un cristal de 20Mhz, mi microcontrolador Pic16F84 genera un ciclo maquina con duración de 200ns en instrucciones simples y 400ns en instrucciones de ramificado (branch). Cada instrucción hay que sumar su tiempo para ir midiendo cuando nos dura la ejecución durante el barrido de la imagen en pantalla.
El estándar NTSC indica que genera una imagen de 525 lineas horizontales y cada una de ellas puede dividirse en una resolución que varía entre 240 (VHS), 330 (señal de TV común), 380(TV satelital común) y 540(DVD) pixeles dependiendo el sistema que se utilice. Cada imagen esta compuesta de 2 campos entrelazados, el primero que imprime en pantalla 262.5 líneas (números pares) y el segundo las siguientes 262.5 (números impares). Entre los 2 campos se imprime en pantalla 1 cuadro o foto en una fracción de 1/30 segundos con lo que sabemos que el primer campo es de 1/60 seg y el segundo transcurre en el 1/60 seg siguiente.
Bueno ahora vamos a los tiempos, es necesario comprender todo esto antes de poder programar un PIC que genere estas señales necesarias para mostrar imagen en pantalla.
Cada línea horizontal en pantalla tiene una duración de 64us y esta dividido en 2 partes, la primera que es la señal análoga de la imagen y dura 52microsegundos y la segunda parte que son los 12us restantes que utilizan un pulso de sincronismo durante el cual se borra la siguiente línea antes de comenzarla a imprimir, además de que este también es el pulso de sincronismo horizontal.
La señal queda como se muestra a continuación:
Bueno para el sincronismo vertical es otro rollo diferente. Les explicare de manera resumida. En el sistema NTSC la imagen está compuesta de 525 líneas como dijimos anteriormente, pero de éstas solo se muestran en la pantalla únicamente 480, las 45 líneas restantes son utilizadas para datos adjuntos al video .Las que realmente son importantes son las primeras 21 que son para datos de video las 24 que nos quedan son las finales que se utilizan para subtítulos y datos escritos en pantalla. Volviendo a las primeras 21 en ellas están contenidos datos críticos del video, unas de ellas son especialmente utilizadas para el sincronismo vertical. En ellas se entrega un tren de pulsos que sincroniza el monitor y determina el inicio de cada imagen. Como comprendimos cada imagen se divide en 2 campos de 262 líneas. Cada campo debe ser sincronizado individualmente así que de sus 262.5 líneas las primeras 9 son las que determinan el sincronismo y en las que entregaremos el tren de pulsos de sincronía vertical. Las 9 líneas van separadas en 3 grupos de 3 líneas cada uno. El primer y tercer grupo se denomina zona de igualación y el segundo zona de sincronía. Cada uno tiene que tener un tren de pulsos digital como se muestra a continuación en la imagen, nótese que el tren de la zona de igualación es inverso al de sincronización:
Ahora para imprimir cada pixel hay que conocer como se maneja la señal. La señal de video tiene un rango de 0 a 1 V siendo 0 el punto de sincronismo, .3v es el rango para el valor nulo o equivalente al color negro y un valor de 1v para el color blanco más brillante. Para sacar variantes de la escala de grises únicamente hay que modular el dato entre .3 y 1V para generar el gris deseado. Ese nivel será el que se coloque en cada punto o pixel de la imagen.
Por ultimo aplicaremos esto en el pic. Ya sabemos que cada instrucción tiene una duración de 1 o 2 ciclos de reloj dependiendo del tipo, por defecto la instrucción simple de 1 ciclo de reloj tiene una duración de 200ns. Si sabemos que la señal dada para una sola línea de imagen horizontal tiene una duración de 64us podemos calcular que en ese periodo el PIC puede realizar 320 instrucciones, y más específicamente dentro del periodo de la señal de imagen en una línea (que tiene una duración de 52us como dijimos anteriormente) únicamente podremos realizar 260 instrucciones en base a esto podemos determinar que resolución nos acomoda dependiendo de nuestra aplicación. En mi caso solo requiero imprimir en monitor algunos datos asi que para mi comodidad puedo utilizar una resolución de 130 pixeles en las que al imprimir cada pixel utilizare 2 instrucciones. Esto esta un poco reducido pero si aumentamos el numero de instrucciones por pixel también reducimos el numero de pixeles por línea. Puedo decirles que con 2 instrucciones es suficiente, 1 para traer el dato (bit individual 1 para blanco y 0 para negro), y otra para imprimirlo (dando salida en un puerto del pin). Como tip para el almacenamiento del dato que quieren mostrar en pantalla, cada línea la pueden dividir en fracciones de 8 pixeles (1byte).
Como pueden ver es simple generar una imagen en blanco y negro con un Pic16F84, es un poco justo pero es suficiente. Dependiendo de su aplicación pueden variar. Una opción que vi en algunas aplicaciones para poder procesar información en el pic y luego imprimirla en pantalla es que únicamente se utiliza un campo de la imagen para imprimir y en el periodo que debería mostrarse el segundo es tiempo que el pic utiliza para realizar sus cálculos para imprimir el campo siguiente (nuevamente el 1). Sin perder nunca el tiempo de ejecución del programa porque de lo contrario la señal se desordenará.
En seguida les publicaré mas sobre mi proyecto mientras tanto aquí les comparto los fundamentos sobre los que hay que trabajar.