uControl
Mayo 22, 2013, 11:14:47 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2 3 4 5   Ir Abajo
  Imprimir  
Autor Tema: [GUIA] Generar señal VGA con un PIC 18Fxxxx  (Leído 20297 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Ariel
Global Moderator
dsPIC
****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 10231



WWW
« : Noviembre 08, 2010, 06:19:03 »

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.


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, 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.



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:


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.


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.


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:


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


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:

 

 
(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.


 “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.

* PICVGA01.JPG (75.44 KB - descargado 8525 veces.)
* vga_sync.png (11.58 KB - descargado 8891 veces.)
* vga_terminal_scheme_.png (86.13 KB - descargado 9070 veces.)
* PICVGA02.JPG (9.22 KB - descargado 6317 veces.)
* vga_color_control_scheme.png (10.01 KB - descargado 8761 veces.)
* Pantallazo.png (56.59 KB - descargado 8723 veces.)
* vga_trm_fonttable.png (26.35 KB - descargado 8675 veces.)
* SDC12096.JPG (60.34 KB - descargado 6437 veces.)
* SDC12095.JPG (67.58 KB - descargado 6652 veces.)
* SDC12099.JPG (71.21 KB - descargado 6322 veces.)
* SDC12108.JPG (78.46 KB - descargado 6616 veces.)
* ConectorVGA2.JPG (51.14 KB - descargado 6365 veces.)
« Última modificación: Noviembre 08, 2010, 06:50:24 por Ariel » En línea

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert
Ariel
Global Moderator
dsPIC
****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 10231



WWW
« Respuesta #1 : Noviembre 08, 2010, 06:56:40 »

Para terminar, una fotografía tomada desde poca distancia del monitor, que permite apreciar la calidad de la imagen generada:


Hay que tener en cuenta que la cámara no es especialmente buena tomando imágenes de una pantalla. Así y todo, puede apreciarse que no hay sombras ni vibraciones ni nada que desmerezca la imagen. El monitor utilizado es un LCD, pero en un CRT (como puede verse en el post anterior), la imagen es igual de buena.

* SDC12170.JPG (72.59 KB - descargado 5723 veces.)
« Última modificación: Noviembre 08, 2010, 07:00:08 por Ariel » En línea

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert
Moyano Jonathan
Amigo de uControl
PIC16F
******
Desconectado Desconectado

Mensajes: 589



WWW
« Respuesta #2 : Noviembre 08, 2010, 01:02:41 »

Muchas gracias por el tuto ariel ....esas placas las hiciste vos o las mandaste a fabricar ?
En línea
Ariel
Global Moderator
dsPIC
****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 10231



WWW
« Respuesta #3 : Noviembre 08, 2010, 01:08:57 »

Muchas gracias por el tuto ariel ....esas placas las hiciste vos o las mandaste a fabricar ?

De nada! Grin

Las mandé a hacer...la idea era ponerlas como "kit" o como la placa ya montada con PIC y todo en la "Tienda uControl", por eso las mande a hacer. Al ser fabricadas industrialmente pude hacer pistas más pequeñas, etc, asi que la placa quedó realmente chiquita y facil de "meter" en cualquier proyecto.

Saludos!
En línea

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert
carlosmaid
PIC10F
*
Desconectado Desconectado

Mensajes: 42


WWW
« Respuesta #4 : Noviembre 08, 2010, 06:33:41 »

Che!!! fantastica tu traduccion del ruso al español! cuando lei el texto original hmmm...  Insultos y los traductores automaticos nunca lo hacen bien... apenas pueda me pongo a leer todo de forma detallada para arrancar  rolleyes2

p.d: Se viene la primer placa de expansion de la pic-putadora?? una placa de video VGA!?

Saludos!
 
« Última modificación: Noviembre 08, 2010, 06:35:35 por carlosmaid » En línea
Ariel
Global Moderator
dsPIC
****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 10231



WWW
« Respuesta #5 : Noviembre 08, 2010, 07:10:18 »

Che!!! fantastica tu traduccion del ruso al español! cuando lei el texto original hmmm...  Insultos y los traductores automaticos nunca lo hacen bien... apenas pueda me pongo a leer todo de forma detallada para arrancar  rolleyes2

p.d: Se viene la primer placa de expansion de la pic-putadora?? una placa de video VGA!?

Si, claro! Justamente buscando la forma de obtener una imagen VGA para la compu fue que encontré este trabajo.

Dentro de unas 36 hs vas a poder verla andando: Tu PCB está rumbo a tu casa Grin

Saludos!
En línea

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert
carlosmaid
PIC10F
*
Desconectado Desconectado

Mensajes: 42


WWW
« Respuesta #6 : Noviembre 08, 2010, 07:26:48 »

Que buenooooo!! gracias arieeell!!!  rolleyes2 rolleyes2 rolleyes2 rolleyes2
Se me ocurria que podiamos hacer con algun pic que tenga parallel slave port e I2C, el ¨controlador¨ de la placa vga junto al pic18 que genera el video en si. La idea seria usar el parallel slave port para tomar los datos del bus del sistema en forma de bytes de datos e instrucciones y convertirlos a la trama i2c que usa el pic18. En el PSP vienen ya las lineas cs, rd, y wr. Asi que seria super compatible con el bus de la picputadora, y lo mejor, ya tengo todo eso hecho par la flia 16F, por ahi se puede aprovechar..

Saludos!
« Última modificación: Noviembre 08, 2010, 07:41:15 por carlosmaid » En línea
Ivan
Amigo de uControl
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 550



« Respuesta #7 : Noviembre 12, 2010, 12:29:17 »

una pregunta, no se puede manejar los pixeles independientes por falta de memoria?
En línea

¿Qué es un circuito?
Es un lugar donde hay elefantuitos, caballuitos, payasuitos...
Suky
**----- ^^ ------**
Moderador
dsPIC
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5345


Con Qt...


WWW
« Respuesta #8 : Noviembre 12, 2010, 12:36:48 »

una pregunta, no se puede manejar los pixeles independientes por falta de memoria?


Te conviene leer el articulo que ha expuesto Ariel  Grin Y presta atención a velocidades, y con un par de cuentas, puedes sacar la memoria que tendrias que usar si fuera solo monocromo  Tongue


Saludos!
En línea

Ariel
Global Moderator
dsPIC
****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 10231



WWW
« Respuesta #9 : Noviembre 12, 2010, 12:42:17 »

una pregunta, no se puede manejar los pixeles independientes por falta de memoria?

Ese es uno de los factores. Pero lo más complicado -me parece- es el tema de la velocidad necesaria para poder hacerlo.
En línea

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert
Ivan
Amigo de uControl
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 550



« Respuesta #10 : Noviembre 12, 2010, 12:52:09 »

preguntaba porque estaba mirando la barra del simbolo % y se ve que con ese micro tiene la velocidad para generar ese tamaño de pixel, por eso decia lo de la memoria.
En línea

¿Qué es un circuito?
Es un lugar donde hay elefantuitos, caballuitos, payasuitos...
Ariel
Global Moderator
dsPIC
****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 10231



WWW
« Respuesta #11 : Noviembre 12, 2010, 12:58:14 »

Si, eso es cierto. Pero esos pixeles provienen de una tabla que contiene la "forma" de cada caracter...cada "tira" de 8 pixeles horizontales están en un mismo byte, y tienen el mismo color. Si tuvieses que graficar una linea diagonal o cualquier cosa que implique un cálculo, sonaste!

Obviamente, dibujar una pantalla estática con un bitmap en un solo color -desde el punto de vista de la velocidad- seguramente se puede. Pero no mas que eso. En cuanto a la memoria, tenes 30x30 caracteres de 8x16 píxeles...son 30x30x16 bytes = 14.400 bytes por cada pantalla en "modo bitmap".  shocked
En línea

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert
Suky
**----- ^^ ------**
Moderador
dsPIC
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5345


Con Qt...


WWW
« Respuesta #12 : Noviembre 12, 2010, 01:04:06 »

O si queres guardar una imagen de 640x480 monocromo, tenes (640x480)/8= 38400 Bytes  laugh Y ahora quieres ir a leerlo en alguna memoria externa  Idiota Nos faltan un par de micro-segundos para lograrlo  Grin
En línea

Ivan
Amigo de uControl
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 550



« Respuesta #13 : Noviembre 12, 2010, 06:45:38 »

estaba mirando un par de revistas elektor mas viejas y habia para armar una placa generadora de video de 512x512, lo que habria que hacer es dejar a un contador que se encargue de direccionar la memoria y el pic se encargaria de habilitar el contador, generar sincronismos y llenar la memoria.
« Última modificación: Noviembre 12, 2010, 06:50:07 por Ivan » En línea

¿Qué es un circuito?
Es un lugar donde hay elefantuitos, caballuitos, payasuitos...
Ariel
Global Moderator
dsPIC
****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 10231



WWW
« Respuesta #14 : Noviembre 12, 2010, 07:14:41 »

Todos nos hemos preguntado ¿Como generar una señal VGA de 640x480 puntos con TTL/PIC? Grin Grin
En línea

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert
Páginas: [1] 2 3 4 5   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.18 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.122 segundos con 28 consultas. (Pretty URLs adds 0.016s, 3q)