Hola amigos!
Este hilo surge a partir del proyecto de crear una sencilla plataforma para juegos basada en PIC (http://www.todopic.com.ar/foros/index.php?topic=22402.0).
Trasladamos aqui la discusion de como hacer un generador de video, para mantener el orden.
Una base de discusión podria ser este articulo (http://www.ucontrol.com.ar/wiki/index.php/PIC_PAL_Video_Library).
(http://www.ucontrol.com.ar/wiki/images/thumb/7/70/089-PIC-PAL-TV-pic_pal_video_1.JPG/300px-089-PIC-PAL-TV-pic_pal_video_1.JPG)
A mi parecer, si se toma como punt de partida, deberiamos migrarlo a CCS (está en MikroC).
Si quieres bajar inmediatamente el resultado de este gran proyecto (http://rapidshare.com/files/146616006/Emulador_de_GLCD_para_video.rar.html).
Hola amigos!
que bien va esto!!!!!!!!!!!
El flaco ya escribiendo codigo, Mario aportando los casi 80 años de experiencia reunida en su trabajo, Valdorre, Leon, Savagechiken, Gera, y hasta Manolo metidos en este proyecto!
Respecto al tema de la memoria "de video" (vamos a tener que empezar a buscar un nombre para cada parte, para que sea mas facil nombrarlas!! :) ), definiendo algunos pines de cada PIC como "Enable" creo que lo tenemos resuelto....no es tan dificil el sincronizar los accesos entre ellos.
Si tenemos las señales del PIC enano correctamente implementadas, deberiamos hacer que uno de los pines que le quedan libres se ponga en "1" cuando comienza el despliegue de la linea, del cuadro o lo que mas convenga, para que el otro PIc sepa que puede enviar datos a la memoria.....
Todavia es un rompezabezas infernal de partes, pero se me ocurre que estamos cerca de encontrar una solucion, y luego...a implementarla!
Un par de imagenes de la C64, a 16 colores en 320 puntos por 200...pueden servir para imaginar a donde podemos llegar:
(http://www.zee-3.com/pickfordbros/archive/images/street_64.gif)
(http://www.zee-3.com/pickfordbros/archive/images/ste_loading_screens_512.jpg)
(ampliar a 1280 de ancho (http://www.zee-3.com/pickfordbros/archive/images/ste_loading_screens_1280.zip))
Hola gente !
Sigo lo más cerca que puedo el hilo y está súper !
Pollo realmente coincido con Ariel que sos un monstruo trabajando. Admiro mucho a las personas que se apasionan por una causa y luchan por sacarla a la luz cómo lo estás haciendo vós, Gera, Claudio y Ariel obviamente. (la mente perversa que ha embarcado a todos en ésto :D )
Respecto a los codificadores RGB, en mi caso, he trabajado con el MC1377 y es una muy buena elección.
También he visto el CXA1645, pero no mucho.
Lo que veo a medida que avanza el hilo, es que van a largar directamente con color.
Eso significa que el PIC que entregue la señal al codificador, deberá generar los tres colores por separado.
El Rojo, el Verde y el Azul.
Para no complicar el trabajo inicial con el filtrado de los colores al generar el programa, se podría generar una imagen B/N única y atacar proporcionalmente la entrada RGB del codificador, para tener una señal monocromática en un TV color y después que éso esté logrado, encarar la generación de los tres colores por separado.
Es una idea.
Las proporciones a mantener en la entrada del encoder debieran ser
Y (luminancia) = 0,3 Rojo + 0,59 Verde + 0,11 Azul
Esto debe respetarse para lograr obtener un raster ó cuadro de color blanco perfecto en pantalla.
Es decir, debemos hacer divisores resistivos a la entrada de cada color del encoder, para que de los 5 Volts que entregan los PIC, vayan un 30% al Rojo, un 59% al Verde y un 11% al Azul para así lograr un Blanco.
Saludos !
Mario
Ariel, esta es una parte de tus librerías, las podrías modificar según explico en la misma? lo que pasa es que no sé como se hace :mrgreen:
Esta noche me pongo. Como veras, entro poquisimo aca, pero eso ya está por cambiar! :)
De paso...miren esto:
http://belogic.com/uzebox/
(http://belogic.com/uzebox/images/megatris_small.jpg)
(http://belogic.com/uzebox/images/test1.jpg)
(http://belogic.com/uzebox/images/board_reverse_small.jpg)
¿No es impresionante?
Hola amigos!
Existe un sitio ruso en el que su autor ha logrado una buena imagen VGA (solo texto, 30x30 caracteres de 8x16 pixeles en 16 colores) con solo un PIC18F de 28 pines y poco mas.
Lo he armado, y anda perfecto. De hecho, hasta hemos preparado un articulo para el próximo número de la revista uControl (http://www.ucontrol.com.ar/forosmf/novedades-en-ucontrol/). Aqui posteamos una explicación sobre este proyecto (http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/), y se las transcribo por si les resulta de utilidad :lol:
Generar señal VGA con un PIC 18Fxxxx
Casi todos hemos intentando alguna vez utilizar un microcontrolador para generar una señal de vídeo compatible con un monitor VGA, utilizados por la mayoría de los ordenadores. Se trata de una buena idea, que puede dotar a nuestros proyectos de una pantalla “de verdad”, barata, grande, brillante y en colores. Sin embargo, no se trata en absoluto de una tarea sencilla: los breves tiempos implicados en la generación de cada píxel hace que sea un objetivo muy difícil de lograr. A lo largo de este artículo intentaremos proporcionarte información útil para que puedas encarar con éxito ese desafío.
Cuando un producto de cualquier tipo se fabrica en enormes cantidades, su costo disminuye notablemente. Ese es, sin dudas, el caso de los monitores utilizados en los ordenadores personales. Los monitores VGA, sobre todo aquellos más viejos que utilizan como elemento de imagen un tubo de rayos catódicos, pueden conseguirse por muy poco dinero, e incluso, si buscamos un poco, gratis. Ante este panorama surge inevitablemente la idea de “usarlos para algo”, y como nuestra pasión es la electrónica, lo más natural del mundo es intentar convertirlos en parte de nuestros proyectos. Si lográsemos generar las señales adecuadas, podríamos utilizar estas pantallas como “display” en cualquiera de nuestros proyectos. Desafortunadamente, esto no es algo sencillo. Basta con buscar un poco por la red para darse cuenta de que solo hay un puñado de proyectos destinados a generar imágenes de vídeo compatibles con monitores VGA, y la mayoría de ellos simplemente generan barras de color, o imágenes en blanco y negro de muy baja resolución. Sin embargo, es posible crear imágenes y texto en colores, con pocos componentes, un microcontrolador y el programa adecuado.
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6929)
Figura 1:“Podemos utilizar un monitor VGA como parte de nuestros proyectos.”
A lo largo de este articulo vamos a intentar proporcionar las bases necesarias para que puedas desarrollar un dispositivo pequeño y barato, capaz de recibir ordenes a través de un puerto SPI y desplegar texto -en colores- sobre un monitor VGA. Uno de los mejores trabajos que se pueden consultar sobre como generar estas señales -y el resto de los parámetros de la imagen- con un microcontrolador PIC18 es el de Victor Timofeev (http://www.pic24.ru/), en el que nos hemos basado para escribir esto y cuya lectura recomendamos fuertemente. El sitio de Victor está en ruso (algunas partes en inglés), pero es posible lograr una traducción bastante decente utilizando Google Translator.
La imagen VGA
Lo primero que necesitamos conocer -y al detalle- es la forma en que uno de estos monitores genera su imagen. No debemos olvidar que no intentamos utilizar una placa VGA como la que poseen los ordenadores para generar la imagen, sino que nuestro proyecto debe encargarse de proporcionar al monitor las señales adecuadas para que este muestre lo que queremos. Esto significa que conceptos como “segmento de memoria de vídeo” o “modo 13” -propios de los adaptadores VGA mencionados- no tienen ninguna utilidad para nosotros. Necesitamos enviar al monitor, en el momento exacto, la información necesaria para que este pueda “dibujar” cada píxel que conforma la imagen.
Un monitor VGA común puede ser controlado utilizando solo 5 lineas: dos de sincronismo (horizontal y vertical) y tres señales analógicas (rojo, verde y azul). Las señales de sincronismo, como su nombre lo indica, sirven para que el monitor “sepa” cuando se encuentra en el comienzo de un cuadro o de una linea. Las señales analógicas correspondientes a cada color permiten variar la intensidad del los mismos simplemente variando su voltaje. Al menos en teoría, combinando correctamente el valor de tensión aplicado a las tres lineas analógicas se puede obtener cualquier color que deseemos. En la práctica, la velocidad de nuestro microcontrolador y las características de nuestro conversor digital-analógico determinarán la cantidad de colores que podemos mostrar. La imagen se dibuja linea a linea, de arriba hacia abajo. Cada linea comienza a la izquierda y termina a la derecha de la pantalla. Cuando una linea se ha completado, debemos enviar un pulso de sincronismo horizontal para que la electrónica del monitor la haga avanzar a la posición siguiente. Cuando todas las lineas que conforman una imagen han sido dibujadas, enviamos un pulso de sincronismo vertical para indicarle al monitor que la imagen (el “cuadro”) está completo y que la próxima linea a dibujar debe estar, nuevamente, en la parte superior de la pantalla. Todo esto se repite decenas de veces por segundo.
La “resolución” de nuestra imagen se mide en píxeles. Decir que tenemos una resolución de “640x480” significa que la imagen se compone de 640 píxeles a lo ancho -o 640 píxeles en cada línea- y 480 lineas por cuadro. Nuestro programa debe ser capaz de enviar al monitor la tensión adecuada en cada una de las lineas analógicas para que cada uno de los píxeles que la componentes tenga el color deseado. Veamos un ejemplo concreto: si queremos mostrar 60 cuadros por segundo, en el modo “VGA Standar” de 525 lineas (de las cuales “vemos” solo 480), disponemos de solo
Tiempo por linea = 1 segundo / 60 cuadros / 525 lineas = 31,75 us.
31,75 milésimas de segundo para dibujar cada linea. Por razones derivadas del diseño, el trazo de la linea solo es visible durante 25.17 ms. (ver figura 2). En ese lapso de tiempo tenemos que obtener los datos correspondientes a cada píxel y colocar el valor correspondiente a cada linea analógica (R, G, B), una vez para cada píxel. Si pensamos dibujar 640 píxeles, solo tenemos
Tiempo por píxel = 25,17 ms / 640 = 0.039328125us (39,33 ns)
poco más de 39 millonésimas de segundo por cada píxel. No es demasiado, pero si se cuenta con un microcontrolador lo suficientemente rápido, es posible hacerlo.
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6931)
Figura 2: “Diagramas de tiempos.”
El primer problema que enfrentamos es la generación de los pulsos de sincronismo. Necesitamos un pulso -bajo- de una duración de 3,9 us cada 31,75us., que será nuestro pulso de sincronismo horizontal. Y durante la generación de las últimas dos lineas de la imagen -lineas 524 y 525- necesitamos un pulso -también negativo- que sirva como sincronismo vertical. Victor recomienda utilizar una interrupción para generar el pulso de sincronismo horizontal. Para generar los valores adecuados de tensión en las lineas analógicas correspondientes a los colores rojo, verde y azul, puede utilizarse un esquema como el propuesto en pic24.ru (http://www.pic24.ru/):
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6937)
Figura 3: “4 pines del PIC bastan para generar el color de cada píxel.”
Tres pines con salidas tipo “open drain” pueden “encender” o “apagar” las lineas correspondientes al rojo, verde y azul. Son 8 combinaciones que proporcionan 8 colores diferentes. El cuarto pin en cuestión (Y) proporciona un rudimentario mecanismo de control de brillo. Cuando esa salida está en nivel bajo, el transistor se cierra y los voltajes presentes en los nodos etiquetados como VGA-R, VGA-G y VGA-B se modifiquen a través del divisor formado por los resistores y diodos. Victor sugiere utilizar diodos 1N5819 -funcionan perfectamente, como puedes ver en las fotos- pero en las pruebas que hemos realizado pudimos comprobar que incluso un común y modesto 1N4148 sirve. Esto nos permite duplicar la cantidad de colores, ya que disponemos de 8 colores “vivos” y 8 colores “lavados”. En la practica -como se ve en la figura 4- son solo 15, ya que dos de ellos corresponden al negro.
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6935)
Figura 4: “Tenemos 15 colores diferentes, sin necesidad de conversores DA externos.”
El pin “data”, en la parte superior de la figura 3, se encarga de encender o apagar cada píxel. Resumiendo, para generar un píxel necesitamos ajustar el valor de los pines R, G, B e Y, y poner el pin “data” en el estado correcto. Si vamos a mostrar solo texto, no necesitamos cambiar el color de cada uno de los píxeles que componen la linea, sino que basta con hacer el cambio cada vez que el trazo del haz de electrones pasa de un carácter a otro. Esto significa que disponemos de un poco más de tiempo para controlar la señal “data”, que es la que en definitiva va a determinar nuestra resolución horizontal. Victor, en el trabajo mencionado, explica todo esto en detalle y proporciona un programa completo (código fuente incluido) que, junto al circuito de la figura 5, permite escribir 30 filas de 30 columnas de texto, con 16 colores posibles para cada carácter, sobre fondo negro, en un monitor VGA estándar.
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6933)
Figura 5: “Circuito propuesto por Victor Timofeev.”
Los caracteres a mostrar se envían al dispositivo mediante el bus SPI. La velocidad máxima de transmisión de datos es de 250Kbps, y los comandos que acepta son:
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6939)
Todo esto está implementado en una librería que puede descargarse junto al resto del código fuente, junto a una explicación más detallada de cada comando, desde aquí (http://www.pic24.ru/lib/exe/fetch.php/osa/articles/terminal.rar).
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6941)
Figura 6:“Este es el juego de caracteres incluidos. Por supuesto, puede modificarse.”
La figura 6 muestra los 256 caracteres disponibles. La definición de estos caracteres se encuentra en el archivo font.asm y puede ser modificado para incluir caracteres no contemplados. Las fotografías que ilustran esta nota permiten apreciar la calidad y definición de la imagen obtenida con esta interfaz. Con poco trabajo puede construirse un dispositivo pequeño y flexible que permitirá a nuestros proyectos mostrar texto en cualquier monitor. ¿Te animas a construirla?
Estas son algunas fotografías del que hemos construido en uControl:
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6943) (http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6945)
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6947) (http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6949)
(Descarga las imágenes para verlas más grandes)
El conector VGA
Un conector "HD-15” -a veces también llamado "RGBHV" o "HD-15"- como el que poseen la mayoría de los monitores VGA posee 15 pines dispuestos en tres hileras de 5 cada una. Es posible que aún haya en funcionamiento algún viejo monitor dotado de una versión anterior del conector actual, con solo 9 pines (llamado "DE-9"), pero el 99% de los monitores VGA que encuentres por ahí tendrán el conector azul de 15 pines que ves en la fotografía.
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/?action=dlattach;attach=6951)
“Conector VGA de 15 pines, conocido como “HD-15”
Las letras “HD” hacen referencia a “High Density” (“Alta densidad”), para diferenciarlos de los conectores que tienen el mismo factor de forma, pero sólo 2 filas de pines. Este conector permite transportar las cinco señales básicas que se necesitan para obtener una imagen vertical: los componentes analógicos rojo, verde y azul, y las señales de sincronismo vertical y horizontal.