Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

23/07/2008 #1


Generar una señal de video NTSC usando un PIC
Hola a todos. Estoy trabajando en un proyecto para generar video NTSC usando un PIC 16F88 a 12MHz. Estos dias he estado leyendo alguna documentación sobre señales de video pero la información que he encontrado no me ha quedado muy clara.

Hasta ahora el único avance que he tenido ha sido un programa de prueba (similar al de el PIC Video Howto de Rickard Gunee) para desplegar barras de colores (negro, gris y blanco) que realicé basandome en el diagrama de sincronización horizontal que se muestra a continuación

Mi implementación tiene algunos cambios con respecto a ese diagrama, el valor de voltaje del front y back porch es 0.33V (el mismo del color negro) y el valor de sincronización es 0V en vez de -0.4V como aparece en el diagrama. El resultado fue este:

Los tiempos de las líneas horizontales son bastante cercanos a los del estándar NTSC, aproximadamente 12us de sincronización y 52us de señal de video.

El gran problema que estoy teniendo es que no he sido capaz de realizar una sincronización vertical. Las imágenes de video se van dibujando en la pantalla una línea a la vez, primero las impares y después las pares. Según he entendido al terminar de dibujar todas las líneas impares se debe realizar la sincronización vertical para comenzar a dibujar las líneas pares, despues se vuelve a realizar la sincronización vertical y vuelven a dibujarse las impares. Hasta ahora no he sido capaz de realizar eso, lo único que logro es dibujar líneas verticales a partir de la rutina que controla la sincronización horizontal.

Hay muchos proyectos que generan video con pic, el tetris y pong de Rickard Gunee, el PIC Breakout, el &microSCOPE, PIC-Pong y PIC-Tock de Eric Smith, entre otros, pero yo quisiera saber si alguien podría darme información sobre los tiempos de sincronización horizontal y vertical (aunque la horizontal creo que ya la tengo dominada) del estándar NTSC, además si hay algún iluminado en el tema no estaría mal una explicación para el resto de nosotros.

Bueno, aqui dejo esto, si a alguien le interesa el tema tal vez podamos colaborar y realizar entre todos una buena librería para generar video usando un PIC.

Por último adjunto el código de prueba y el diagrama de conexión que uso entre el pic y la entrada de video

La resistencia de 450 en realidad puede ser de 470 y la de 900 puede ser de 1K, la de 75 ohms representa la entrada de video RCA del televisor.
23/07/2008 #2


Cuando hablas de ntsc es que quieres generar color, creo que con el pic andas muy justo, en pal no daba tiempo.

Si la señal es en blanco y negro no necesitas generar la señal de burt lo que se te simplifica mucho.

Si quieres colo lo mas comodo es utilizar la entrada RGB posterior de tu TV o sea el euroconector o Scard.


Para el tema de las tensiones recuerda que tienes tres estados o sea nivel alto, bajo y alta impedancia lo que te permite tener 3 tensiones facilmente.


Si buscas un poco encontraras un tutorial es pdf en español aunque es para pal que es lo que yo conozco.
Ya diseñe hace unos años un patron con un pic16f876 en colo via RGB.
23/07/2008 #3


gracias tiopepe por tu respuesta pero no estoy buscando generar una señal a color, se que con el pic no me alcanza (y menos a esa velocidad), quiero generar una señal blanco y negro que cumpla con la norma ntsc, lo que sería el estándar RS-170 (RS-170A es para color).

No sabía que en B/W no hacía falta el burst del backporch, yo no lo había hecho, solo había hecho el backporch, con razón si funcionaba.

Bueno, de nuevo gracias, seguiré buscando porque creeme que ya he buscado y leido bastantes manuales pero aún no me queda claro como hacer la sincronización vertical. Si alguien tiene alguna idea o sabe algo de esto agradecería su ayuda.
23/07/2008 #4

Avatar de Meta

Si puede ser, también es bueno saber de PAL que es el que uso aquí en España, bueno, aunque en mi país también puedes usar el NTSC pero el predeterminado es el PAL, en concreto el PAL-D que es una mejora del PAL normal, para que lo tengan en cuenta.

He visto por ahí que el que quiera color usan los dsPIC de 16 bits y dicen que con 32 bits es la leche. Con el 16 Bits han conseguido algo con 16 colores.

Hace un tiempo quería hacer algo pero no tengo ni idea, a ver si entre todos hacemos algo.

16F84A conetacto al TV y Tetris

En español.
http://www.taringa.net/posts/informa...pia-consola-1-

http://server-die.alc.upv.es/asignat...eb_C05/02.html

http://www.pablin.com.ar/electron/ci...pong/index.htm

EDIT:
http://www.ucontrol.com.ar/wiki/inde..._Video_Library

http://www.pablin.com.ar/electron/ci...tris/index.htm

http://wk3.iespana.es/tetris.htm
23/07/2008 #5


En esos enlaces todos usan el código de Rickard Gunee, su explicación es muy sencilla pero aún así no logro comprenderla del todo.
23/07/2008 #6

Avatar de Meta

pic-man dijo:
su explicación es muy sencilla pero aún así no logro comprenderla del todo.
Yo tampoco, lo lograremos con la práctica, por no entenderlo lo he dejado, pero como veo a más personas animadas, me han animado y haré ese proyecto aunque sea en color. Eso si, en realidad es el 16F84, pero como el 16F88 tiene más RAM y Flash, mejor que mejor.

Este hombre si lo entiende.
YouTube - PROGRAMANDO EL TETRIS EN EL PIC 16F84
24/07/2008 #7


Sigo sin lograr la resolución vertical pero aqui les dejo un avance del proyecto:

YouTube - microTV: Señal de Video NTSC usando PIC16F88

El video generado esta desentrelazado y tiene una resolución vertical de 260 lineas, aunque claro la imágen que se despliega (space invaders yeah!) ocupa gran parte de la pantalla por lo que no se ve una super resolución, pero con 260 líneas disponibles (tal vez menos, habrá que hacer más pruebas) se pueden hacer cosas interesantes, o al menos eso espero.

El efecto de scroll aunque queda bien no es intensiónal, eso se debe a que aún no logro hacer la sincronización vertical, simplemente dibujé línea a línea la pantalla, espero encontrar la solución para la sincronización vertical pronto y que con eso quede fija la imágen en la pantalla.

Aqui dejo esto, espero que alguien se anime y consigamos la sincronización vertical
24/07/2008 #8

Avatar de Meta

Muy interesante.

YouTube - Video NTSC / PALM & PIC

YouTube - PIC Microcontroller generating PAL TV signal

YouTube - PIC PAL video OSD superimposer


1- ¿Hacerlo con el 16F88 no es lo mismo que un 16F84? Lo digo porque todo el mundo usa ese (16F84), aún así el 16F88 tiene más RAM que ayuda mucho.

2- ¿Te cuesta mucho programar un dibujo en pantalla como el que hiciste?

3- ¿Es complicado el tema de hacer algo con señal de vídeo?

Si tienes más ejemplos lo pones, cada vez que te veo hacer algo, más gana me dan de hacer algo. A ver si vienen más personas que les interesen estos temas.
24/07/2008 #9


El 16F84 sin duda debe ser el más común de los pics de gama media, yo no programo en el porque me sale más caro que otros pics como el 16f628 o el 16f88. Son pics parecidos, tienen el mismo conjunto de instrucciones (dos más o dos menos, algo asi), pero además el 16f628 tiene un oscilador interno de 4MHz y el 16f88 uno de 8MHz (además de otros añadidos como el convertidor analógico digital, más memoria y cosas asi). Un código escrito para el 16F84 puede funcionar con algunos cambios en un 16F88, pero hay que saber que cambiar y eso en un código sin comentarios muchas veces no es sencillo.

Hacer el dibujo que hice no es complicado, simplemente modifiqué el primer código que puse para dibujar las 260 líneas, usé 9 líneas distintas, una todo negro y otras 7 que son las que forman la imágen, lo demás fue simplemente repetir. El código al final no es nada eficiente y es demasiado largo para lo que hace pero en realidad solo quería hacer una prueba para ver la resolución vertical.

El tema de video a mi me parece un poco complicado, ya ves llevo 3 días investigando y aún no logro la sincronización vertical.

En cuanto tenga más ejemplos o avance un poco con el proyecto iré publicandolos, por lo pronto aqui dejo el código fuente del ejemplo del video que se me olvidó subirlo en el post anterior.

Por cierto, el segundo video que pusiste lo vi ayer o antier, es bastante impresionante y la verdad es que cuando termine mi proyecto creo que lo voy a montar en una pequeña televisión como la de ese alemán.
Archivos Adjuntos
Tipo de Archivo: asm utv_prueba_1__space_invaders_scroll_up_194.asm (13,6 KB (Kilobytes), 224 visitas)
24/07/2008 #10

Avatar de Meta

Muchas gracias por las respuestas.

Voy a mirar el código, a ver si lo puedo adaptar al 16F84A ya que es el único que tengo por ahora.

Voy a intentar poner una imagen como tu a ver si me sale en estos días, ya que actualmente estoy haciendo otro proyecto para presentarlo en una revista oficial de España.

Eso si, seguiré investigando mientras pueda sobre el tema de señales de TV, aunque estoy para el sistema PAL, pero bueno.

Me he dado cuenta que el NTSC y el PAL son *.hex a parte ya que el 16F84A no cabe.

¿Con 4Kb que tiene el 16F88 crees que cabe el NTSC y PAL a la vez? Eso si, habrá que seleccionar uno o otra en el código de entrada con un simple btfss.

Otra cosa que me olvidaba, ¿con qué frecuencia utilizas el oscilador? Porque por lo que he visto por ahí, el tetris funciona con 16MHz.
24/07/2008 #11


Para el sistema PAL creo que la sincronización horizontal es la misma, 12us de sincronización y 52us de señal de video, es la resolución vertical lo que cambia, mi video es de 260 lineas pero para PAL sería de 312, desentrelazado igual que el mío.
24/07/2008 #12

Avatar de Meta

Ok.

Te recuerdo que oscilador usas, porque para estas cosas suelen usar de 16MHz y quizás estás usando otro.

Cuando ya consigas algo, si es posible hace unos tutoriales con tus palabras de cómo hacer un dibujo y reflejarlo en pantalla (siempre que no sea una gran molestia, claro). Así aprendemos más del tema.

A ver si algún día hacemos algo de esto:




EDIT:
Mirando con el MPLAB 8.14, me he dado cuenta que sólo usas dos variable de la memoria RAM.
24/07/2008 #13


De hecho solo uso una "delaycnt", las demás las dejé ahi pero en verdad no las ocupo, el oscilador que uso es de 12MHz, es el más rápido que puedo conseguir en mi ciudad pero con el se pueden ejecutar 3 millones de instrucciones por segundo, suficiente para las pruebas que estoy haciendo.

---

Conseguí la sincronización vertical, ahora la imágen ya no se va hacia arriba ni se ve ese parpadeo, la figura se queda fija en el televisor, es ya un buen avance.

Algunas fotos y el código fuente modificado:


Como nota, la imágen aparece justo donde comienza la pantalla. Antes de la imágen en el código hay 22 líneas negras que no aparecen así que la resolución real ya se va reduciendo un poco, digamos que ronda alrededor de las 240 líneas verticales.

La resolución vertical la hice gracias a un diagrama de la página de PIC Breakout, consiste en pulsos de sincronización alternados que duran 9 líneas horizontales:
- Primero pulsos de sincronización cortos: 30us de Negro seguidos de 2us de Sincronización. Se repite 3 veces.
- Luego pulsos de sincronización largos: 30us de Sincronización seguidos de 2us de Negro. Se repite 3 veces
- Por último pulsos de sincronización cortos de nuevo: 30us de Negro seguidos de 2us de Sincronización. Se repite 3 veces.

Con eso se logra la sincronización vertical!
Archivos Adjuntos
Tipo de Archivo: asm utv_prueba_1_2_788.asm (16,9 KB (Kilobytes), 237 visitas)
25/07/2008 #14


Aqui está otro avance. Ya puedo desplegar letras además de figuras "hechas a mano". Para desplegar texto se lee primero de una tabla y luego se va desplegando línea a línea. De prueba solo tengo una línea que despliega "A". Mejorando un poco el código se debe poder reducir el espacio entre cada caracter. El único problema es que las letras me aparecen un poco recorridas en la parte de arriba, no tengo idea por qué pero seguiré trabajando para solucionarlo.




El hardware cambió, ahora la resistencia de 1k se conecta a RA0 y la de 470 a RB7.
Archivos Adjuntos
Tipo de Archivo: txt prueba_video_1_1_180.txt (13,4 KB (Kilobytes), 234 visitas)
27/07/2008 #15

Avatar de gzaloprgm

Buenisimo!

Voy a ver si puedo reescribir parte del código para que funcione a 20mhz (Pic16f628a) y así poder lograr mayor resolución horizontal.

Gracias por publicar tus códigos!
Gonzalo
27/07/2008 #16

Avatar de Meta

gzaloprgm dijo:
Buenisimo!

Voy a ver si puedo reescribir parte del código para que funcione a 20mhz (Pic16f628a) y así poder lograr mayor resolución horizontal.

Gracias por publicar tus códigos!
Gonzalo
¿Y por qué no un 16F88 que es más potente en todo? También con 20MHz.
27/07/2008 #17


Yo no he encontrado cristales de 20MHz pero cuando lo haga también adaptaré los códigos para esa velocidad. Con 12MHz me gusta la resolución que se logra, pero con 20MHz se pueden hacer 2 instrucciones más por microsegundo así que se debe poder hacer cosas bastante interesantes.

Aqui dejo una imagen más de lo que he hecho. Con el código que publiqué en el último post se puede armar un buen texto, lo que sigue es lograr desplegar gráficos.

28/07/2008 #18

Avatar de gzaloprgm

Sí, basicamente es el único micro que tengo ^_^, por eso lo voy a usar. que bueno lo que lograste hacer! (no vi el código todavia) estás usando el puerto como shift register para un pixel por instrucción no?

Saludos,
Gonzalo
28/07/2008 #19

Avatar de Meta

Si te hace falta más megaherzios 48 por ejemplo, utilizas el 18F2550. Encima las operaciones y con las instrucciones que hay, lo haces con menos código.
28/07/2008 #20


Así es gzaloprgm, por el puerto B recorro los bits para tener mayor resolución. El tipo de letra es el de Capcom que me pareció que quedaba bien

Usando un pic como el que dice Meta si se tendría una muy buena resolución.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.