Autor Tema: Generación de Video Color con PIC  (Leído 16633 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re: Generación de Video Color con PIC
« Respuesta #15 en: 16 de Septiembre de 2009, 01:29:51 »
Una Imagen vale más que mil palabras...


Si!!! es posible generar video a color con un PIC 18F2550
Se pueden lograr fácilmente 128 tonalidades y unos 220 pixeles por línea (que es la cantidad de pixeles mostrada en la foto)
No saben la alegría que tengo de haberlo logrado, todabía me quedan algunos detalles, como pueden observar solo logro 64 tonalidades (4 colores y 16 tonalidades por color) pero es un problema con la generación de los 28,636360 Mhz, estoy trabajando a 14.31818 Mhz, por lo que solo logro 4 colores en lugar de 8.
Otra cosa que lamento es la calidad de las fotos, les aseguro que se ve mucho más nítido directamente en la tele.

Adjunto otra imagen donde se ve el protoboard, para que no piensen que es un montaje, jajaja.


Ya con más tiempo ire agregando la documentación correspondiente, y cuando consiga una cámara subiré un video a youtube.

Me gustaría si Marioguillote me da una mano, y me explica por que la imágen se distorciona en la parte superior, ya que él programa en el 18F2550 hace todas las líneas con el mismo tiempo de duración, sin embargo las líneas superiores quedan algo distorcionadas.

Estimado Manolo, la próxima foto será de un HELLO WORLD a colores.

Es muy tarde ya, tengo que dormir, pero no podía dejar de postear , un abrazo grande a todos y les dejo otra fotito del protoboard en primer plano.


Salud  8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Generación de Video Color con PIC
« Respuesta #16 en: 16 de Septiembre de 2009, 01:46:57 »
Queda precioso, pollo. Felicidades. Seguiré el hilo para cuando publiques avances.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Generación de Video Color con PIC
« Respuesta #17 en: 16 de Septiembre de 2009, 01:54:44 »
 :-/ :-/ Grande SavageChicken!! Esperamos el HELLO WORLD  :-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Generación de Video Color con PIC
« Respuesta #18 en: 16 de Septiembre de 2009, 08:58:03 »
Grande Pollo!!!  :-/ :-/ :-/ :-/ :-/ :-/ :-/
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Generación de Video Color con PIC
« Respuesta #19 en: 16 de Septiembre de 2009, 10:48:42 »
 :shock: :shock: :shock:

EXCELENTE!!!!!

Gran avance Pollo (jeje así mismo me decían en la U)

Saludos
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Generación de Video Color con PIC
« Respuesta #20 en: 16 de Septiembre de 2009, 14:07:41 »
epa gallo claudio!

que buen proyecto! felicidades, espero pronto lo tengas con más avances :-/ :-/
.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Generación de Video Color con PIC
« Respuesta #21 en: 16 de Septiembre de 2009, 14:41:10 »
Increible!!! Te felicito!!! te pasaste macho!! jaja.  :-/ :-/

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re: Generación de Video Color con PIC
« Respuesta #22 en: 17 de Septiembre de 2009, 00:56:12 »
  Bien, vamos a comenzar con la parte de documentación.
No quisiera dejar este proyecto solo como una anécdota, sino, convertirlo en algo útil e instructivo para todos, en especial en el aspecto de la generación de video a color.

  Partamos analizando la señal de color que vemos a continuación:


  Esta imagen corresponde a la forma de onda de una línea de video en la norma NTSC, mostrando sus partes y tiempos, pueden observar que la amplitud de la señal va desde -40 IRE hasta 100 IRE, como pueden observar no se miden en volts, estos rangos son relativos y pueden variar dependiendo del país y del sistema, nosotros para realizar este trabajo y simplificarnos las cosas, vamos a tomar un voltaje de excursión desde los 0 V hasta los 1,4 V, esto significa que -40 IRE equivaldrán a 0 V y 100 IRE equivaldrá a un valor cercanos a los 1,4 V.

  Como se puede ver en la imagen, la  duración total de una línea de video es de 63,5 uS, de este tiempo total, hay una serie de partes de la señal que tienen una duración determinada y que debemos respetar para poder generar una imagen estable en el televisor. Los invito a estudiarla en detalle, además en el programa fuente del 18F2550 está explicado con todo detalle la generación de cada una de estas partes de la señal. Solo basta agregar que para el nivel de Blanking, corresponde a un voltaje levemente inferior al color negro, los voltajes inferiores a este valor son usados como señal de sincronismo, mientras que valores superiores a este nivel generan el brillo del pixel en la pantalla, 7,5 IRE (un valor cercanos a los 0,5 Volts) generaría un pixel apagado o de color negro, llegando a los 100 IRE (1,4 Volts) tendríamos un pixel en su máxima intensidad o brillo.

  Pasemos ahora a la parte color, que es la que da quebradero de cabeza, pero finalmente con un poco de ingenio es posible de lograr.


  Vale destacar que la forma de lograrlo es usada por la mayoría de las consolas de juego antiguas y de las home computers ochenteras.

  Se basa en una circuitería anexa para darnos simultáneamente un rango de 4, 8 o 16 colores, de los cuales el procesador escoge uno para mostrar,  de estos colores además es posible darle distintos niveles de brillo (como se explicó algunos párrafos atrás), en nuestro caso, estamos generando 8 colores base, y podemos darle 16 intensidades de brillo, lo que representa un total de 128 tonalidades de color.

Mañana más……
« Última modificación: 17 de Septiembre de 2009, 01:01:35 por SavageChicken »
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re: Generación de Video Color con PIC
« Respuesta #23 en: 17 de Septiembre de 2009, 14:43:51 »
  Ya hemos explicado como se transmiten las señales de sincronismo y el nivel de brillo de los pixeles, es hora de ver como le agregamos color a nuestra señal de video.

  Para mantener la compatibilidad con las antiguos televisores blanco y negro, se decidió buscar una alternativa que permitiera agregar la señal de color sin grandes modificaciones a la señal existente, habiendo estudiado el espectro de colores se llegó a la conclusión de que la señal de intensidad o brillo de cada píxel aportaba cierta información de color, a esta señal se le llamó Y, su composición contiene un 30% de color Rojo, un 59% de color verde y un 11% de color azul, normalmente esta señal se define como: Y = 0.30R + 0.59G + 0.11B. Esto significa que el solo hecho de enviar la señal de intensidad (que a partir de ahora llamaremos luminancia), ya estamos enviando cierta información de color, bastaría ahora agregar dos señales más que contengan otros porcentajes de Rojo, Verde y Azul para poder determinar los tres colores básicos y tener una señal de “croma” o color.

  Para poder lograr este objetivo sin modificar sobremanera la señal de luminancia, se decidió agregar dos señales (a las que se les llamó Q e I) moduladas en fase sobre la señal de luminancia, esto implica que se debe agregar una señal portadora ( de casi 3.58 Mhz) y dependiendo del desfase de la señal agregada con respecto a una señal de muestra sin desfasar, (que es enviada cada comienzo de línea a la señal de luminancia) se puede determinar los valores de las señales Q e I y finalmente saber que porcentajes de rojo verde y azul tienen el píxel que queremos mostrar.

  La señal de muestra es llamada “Color Burst” y como decía es enviada sin desfasar cada vez que comienza una línea de video, esto le permite al televisor hacer una comparación entre la señal con desfase 0 y el desfase existente en cada píxel de la línea y decidir a qué color corresponde.

  Para hacerlo más comprensible veamos un ejemplo:


  Teniendo una señal de luminancia de 30 IRE que nos daría un cierto nivel de brillo, tendríamos algo como lo mostrado en la primera parte para una señal blanco y negro, mientras que en una señal a color tendríamos algo así como lo mostrado en la segunda parte, una tele en blanco y negro tomaría el nivel medio de la señal como intensidad de brillo, mientras que una tele a color detectaría la señal modulada de color y compararía la fase de ese tramo de la señal con la fase del “Color Burst” para determinar los valores de color correspondiente.

Luego... mas...
« Última modificación: 17 de Septiembre de 2009, 21:25:37 por SavageChicken »
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re: Generación de Video Color con PIC
« Respuesta #24 en: 17 de Septiembre de 2009, 22:29:45 »
  Bien con estos datos a más de uno se le estará ocurriendo como hacer para agregarle color a nuestra señal de video blanco y negro.... efectivamente, añadiendole una señal sobre la señal de luminancia y dependiendo del color deseado desfasarla entre 0º y 359º

  Existen en el mercado algunos integrados que realizan esta parte por nosotros, algunos generan toda la secuencia de sincronismos, otros son RGB encoders, que indicándole la cantidad de Rojo, Verde y azul que deseamos, generan el desfase adecuado en la señal de croma, pero yo me decidí por lo siguiente:

  Dado todo lo expuesto podríamos generar una señal de 3.58 Mhz y con ello tendríamos la señal de "color burst", con algun mecanismo podemos desfasarla por ejemplo 90º, 180º y 270º y de esta manera obtendríamos 4 colores, luego a la hora de elegir el color añadimos a la señal de luminancia alguna de ellas y... voilá... tenemos color.

  Esto es muy fácil de lograr con un par de flip-flop tipo D o un registro de desplazamiento, lo importante es que para poder desfasar la señal en 180º necesitamos una señal de clock el doble de la señal a desfasar, dado que la señal a desfasar es de 3,58 Mhz, deberíamos tener 7,16 Mhz de clock, para poder hacer desfases de 90º, necesitamos una frecuencia de clock del doble de lo anterior ( 14,32 Mhz) y para lograr desfases de solo 45º, la frecuencia del clock debe volver a duplicarse (28,64 Mhz).
  Increíblemente lo que más me ha costado es lograr esta frecuencia, ya que los cristales que consigo solo llegan a los 14,32 Mhz y todos los intentos por duplicar la frecuencia no me han dado frutos.

  En el siguiente ejemplo se desfasa la señal con 4 flip-flops 0º, 45º, 90º y 135º, aprovechando la salida Q negada que tienen estos flip-flops, obtenemos además 180º, 225º,270º y 315º, esto nos permite obtener 8 colores, la señal a desfasar proviene de un contador que reduce la señal de 28,64 Mhz a 3,58 Mhz.


Ok, ahora solo se necesita elegir alguna de ellas, con un multiplexor podemos hacerlo, solo necesitamos 3 bit para elegir alguna de las 8 opciones de color y a la salida del multiplexor tendremos la señal de croma indicada para añadir a la señal de luminancia.


  Bien, en eso se basa todo, en la próxima entrega el circuito completo con la descripción de sus elementos y finalmente el código fuente para el 18F2550.

Nos vemos prontito y salud  8)

No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Generación de Video Color con PIC
« Respuesta #25 en: 18 de Septiembre de 2009, 00:56:29 »
Mejor explicado imposible, si hasta yo entendí que soy medio tarugo para estas cosas.

Excelente, y reitero: MUCHAS GRACIAS.

Saludos
El papel lo aguanta todo

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: Generación de Video Color con PIC
« Respuesta #26 en: 18 de Septiembre de 2009, 12:42:39 »
mis felicitaciones SavageChicken!, verdaderamente impresionante éste hilo,.... y lo bueno es ver cómo y de que manera progresa asombrosamente.!
SAludos!  8)
« Última modificación: 19 de Septiembre de 2009, 18:50:39 por NANO1985 »
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re: Generación de Video Color con PIC
« Respuesta #27 en: 19 de Septiembre de 2009, 12:12:03 »
  Muchas gracias a todos por el apoyo al proyecto, es estimulante saber que es de vuestro agrado y sirve a otros amigos del foro.

  Con lo visto hasta el momento seguramente quedan varias dudas, no tengan miedo de hacer consultas, estaré encantado de aclararlas en la medida que pueda responderlas.

  Dos preguntas que pueden surgir son:

  1.- Afecta en algo el voltaje pico a pico de la señal de color.
  La respuesta es sí. El voltaje de esta señal nos da lo que se llama "saturación del color" pensemos que sillevamos ese valor pico a pico a 0 V tendríamos solo un punto en una tonalidad de gris ( la señal se convertiría en blanco y negro) si aumentamos el voltaje pico a pico vamos teniendo un mismo color cada ves mas fuerte y definido.
  Esto tambien serviría para tener otras tonalidades de color, pero en nuestro circuito mantendremos invariable este valor de pico.

  2.- ¿Que colores obtengo con los desfases que tengo?
  La respuesta no es sencilla, habría que hacer un pequeño estudio al respecto, pero experimentalmente solo he logrado cuatro colores (ya que aún no logro los 28.64 Mhz para obtener 8 colores) y son azul, rojo, verde y amarillo, tan pronto logre más podremos hablar al respecto de este importante punto.

  Ahora lo prometido desde un principio... el código fuente:

Código: Microchip Assembler
  1. ;******************************************************************************
  2.  
  3.         LIST P=18F2550          ;directive to define processor
  4.         #include <P18F2550.INC> ;processor specific variable definitions
  5.         ERRORLEVEL -306, -302                   ; Apaga mensages del Cruse de pagina.  
  6.  
  7. ;******************************************************************************
  8. ;Configuration bits
  9. ;Microchip has changed the format for defining the configuration bits, please
  10. ;see the .inc file for futher details on notation.  Below are a few examples.
  11.  
  12.         CONFIG  PLLDIV = 5
  13.         CONFIG  CPUDIV = OSC1_PLL2
  14.         CONFIG  USBDIV = 1
  15.         CONFIG  FOSC = HSPLL_HS
  16.         CONFIG  FCMEN = OFF
  17.         CONFIG  IESO = OFF
  18.         CONFIG  PWRT = OFF
  19.         CONFIG  BOR = OFF
  20.         CONFIG  BORV = 0
  21.         CONFIG  VREGEN = ON
  22.         CONFIG  WDT = OFF
  23.         CONFIG  WDTPS = 32768
  24.         CONFIG  MCLRE = OFF
  25.         CONFIG  LPT1OSC = OFF
  26.         CONFIG  PBADEN = OFF
  27.         CONFIG  CCP2MX = ON
  28.         CONFIG  STVREN = ON
  29.         CONFIG  LVP = OFF
  30.         CONFIG  XINST = OFF
  31.         CONFIG  DEBUG = OFF
  32.         CONFIG  CP0 = OFF
  33.         CONFIG  CP1 = OFF
  34.         CONFIG  CP2 = OFF
  35.         CONFIG  CP3 = OFF
  36.         CONFIG  CPB = OFF
  37.         CONFIG  CPD = OFF
  38.         CONFIG  WRT0 = OFF
  39.         CONFIG  WRT1 = OFF
  40.         CONFIG  WRT2 = OFF
  41.         CONFIG  WRT3 = OFF
  42.         CONFIG  WRTB = OFF
  43.         CONFIG  WRTC = OFF
  44.         CONFIG  WRTD = OFF
  45.         CONFIG  EBTR0 = OFF
  46.         CONFIG  EBTR1 = OFF
  47.         CONFIG  EBTR2 = OFF
  48.         CONFIG  EBTR3 = OFF
  49.         CONFIG  EBTRB = OFF
  50.  
  51. ;******************************************************************************
  52. ;Variables Tenemos disponibles desde 0x20 hasta 0x7F en el Banco 0
  53. ;Mirar Datasheet para los otros bancos de memoria.
  54.         CBLOCK  0x000
  55.                 LINEA                   ;Contador de línea interlazada como son 253 líneas nos alcanza con 1 byte
  56.                 d1                              ;Variable para delay
  57.         ENDC
  58.  
  59. ;*** Constantes
  60. ;Asignación de Pines PORTA
  61. SINC            equ             H'0004'         ;Señal de Sincronismo
  62. BLK_LEV         equ             H'0001'         ;Nivel de Negro
  63. BLANKING        equ             H'0000'         ;Nivel de Blanking
  64.  
  65. ;Asignación de Pines PORTB
  66.  
  67.  
  68.                 ORG     0x0000
  69.  
  70.                 goto            Rst             ;go to start of main code
  71. ;******************************************************************************
  72. ;Start of main program
  73. ; The main program code is placed here.
  74.  
  75.  
  76. ;Sector de Inicio del Block de Programa
  77.                 ORG             0x0020
  78. Tabla_Col
  79. ;Esta es una tabla de colores, cada byte contiene 1 pixel, los tres primeros bits conforman el color,
  80. ;El cuarto corresponde a si el pixel es a color o escala de grises y los 4 últimos bytes nos dan el nivel de brillo del pixel.
  81.  
  82.         data 0x8090, 0xA0B0, 0XC0D0, 0xE0F0
  83.         data 0x8090, 0xA0B0, 0XC0D0, 0xE0F0
  84.         data 0x8090, 0xA0B0, 0XC0D0, 0xE0F0
  85.         data 0x8090, 0xA0B0, 0XC0D0, 0xE0F0
  86.         data 0x8090, 0xA0B0, 0XC0D0, 0xE0F0
  87.         data 0x8090, 0xA0B0, 0XC0D0, 0xE0F0
  88.         data 0x8090, 0xA0B0, 0XC0D0, 0xE0F0
  89.  
  90. Rst
  91.                 clrf    LATA                                    ;Inicializamos el Puerto A
  92.                 movlw   0x0F                                    ;Configuramos A/D
  93.                 movwf   ADCON1                                  ;Como entradas digitales
  94.                 movlw   0x07                                    ;Configuramos los comparadores
  95.                 movwf   CMCON                                   ;Como entradas Digitales
  96.                 clrf    TRISA                                   ;Pines 0,1 y 2 como salidas
  97.                 clrf    LATB                                    ;Ponemos las salidas del Puerto B en 0
  98.                 clrf    TRISB                                   ;Todo el puerto B como salidas
  99.                 clrf    LATC                                    ;Ponemos las salidas del Puerto B en 0
  100.                 clrf    TRISC                                   ;Todo el puerto B como salidas
  101.  
  102. ;---------------------------------------------------------------------------------
  103.  
  104. ;*** Rutina principal
  105. Inicio
  106.  
  107. ; Tenemos entoces que hacer lo siguiente:
  108. ; 6 Pulsos de Pre-ecualización
  109. ; 6 Pulsos de Sincronismo
  110. ; 6 Pulsos de Post-ecualización
  111. ; Todo esto lo realiza la Rutina VSincro
  112.  
  113.                 call    VSincro
  114.                
  115. ; Luego hacemos
  116. ; 252 Cuadros Normales
  117.                 movlw   0xFC
  118.         movwf   LINEA                   ;Cargo la Variable línea con 252 (Que son los cuadros normales)
  119.  
  120. ;*** Cuadros Normales
  121. ;*************************************************************************************************************************************
  122. ;*** La rutina deberá ser capáz de generar una señal de la forma siguiente
  123. ;***
  124. ;*** 100%                                                   _
  125. ;***                                _                      / \
  126. ;***       |                       / \      __   /\___/\  /   \/\
  127. ;***       |                    /\/   \  __/  \_/       \/      |
  128. ;***       |                   |       \/                       |
  129. ;***  30%  |_____         _BB__|                                |_____         _____
  130. ;***             |       |                                            |       |
  131. ;***             |       |                                            |       |
  132. ;***   0%        |_______|                                            |_______|
  133. ;***
  134. ;***       |<-A->|<--B-->|<-C->|<--------------E--------------->|<-A->|<--B-->|
  135. ;***       |<--------------------- 63.5 us -------------------->|
  136. ;***
  137. ;*** A:  1.5 us Llamado Portal Anterior (Front Porsh) previo a la Señal de Sincronismo vertical
  138. ;*** B:  4.7 us Sincronismo Horizontal
  139. ;*** C:  4.7 us Portal Posterior (Back Porsh) Posterior a la Señal de Sincronismo Ver Detalle de Burst (BB)
  140. ;*** E: 52.6 us Que corresponden al tiempo donde se envía la señal de video propiamente
  141. ;*** La señal de sincronismo entonces ocupa los tiempos A+B+C y representan un total de 10.9 us
  142. ;***
  143. ;*** Detalle de Burst (BB)
  144. ;***      
  145. ;***                                                   /
  146. ;***                                                   |
  147. ;***  30%                 ______  /\  /\  /\  /\_______|
  148. ;***                     |      \/  \/  \/  \/
  149. ;***                     |
  150. ;***   0%  ______________|
  151. ;***
  152. ;***       -----B------->|<-F->|<------G------>|<--H-->|
  153. ;*** F:  0.6 us Llamado Breezeway
  154. ;*** G:  2.5 us Señal de Burst, dura entre 8 y 10 Ciclos de la Señal de Portadora (3,5794 Mhz) y 30% del Voltaje PP
  155. ;*** H:  1.6 us
  156. ;*************************************************************************************************************************************
  157.  
  158. Campo_0
  159. ;Se genera ahora la imagen de Video
  160. ;*** Portal Anterior, Parte A de la Señal
  161.                 movlw   0x01                    ;Apagamos Nivel de Negro, Nivel de Brillo y Encendemos nivel de Blanking
  162.                 movwf   LATA
  163.                 call    Wait_A                  ;Llamamos a la rutina de delay para el tramo A de la señal
  164. ;*** Sincronismo Vertical propiamente, parte B de la Señal
  165.                 bcf             LATA,BLANKING   ; Apagamos todo nivel de señal
  166.                 call    Wait_B                  ;Llamamos a la rutina de delay para el tramo B de la señal
  167. ;*** portal posterior, Parte C de la Señal
  168.                 bsf             LATA,BLANKING   ; Llevamos a la señal hasta el nivel de Blanking
  169.                 call    Wait_F                  ;Llamamos a la rutina de delay para el tramo F de la señal
  170.                 movlw   0x80                    ; Llevo a la salida la señal de Burst...
  171.                 movwf   LATB                    ; ...Sincronizada con desfase 0º
  172.                 call    Wait_G                  ; Llamamos a la rutina de delay de 2.5 us correspondiente al Burst (Tramo G)
  173.                 clrf    LATB                    ; Apagamos la señal de Burst
  174.                 call    Wait_H                  ;Llamamos a la rutina de delay para el tramo G de la señal
  175. ;*** Aquí debe implementarse la rutina para presentar los pixeles en pantalla (Parte E de la Señal)
  176.                 movlw   0x03                    ; Activamos los niveles para lograr brillo mínimo
  177.                 movwf   LATA
  178.                 call    Video_Signal    ;Esta rutina muestra los pixeles en pantalla (56.2 uS)
  179.                 clrf    LATB                    ;Apagamos todo nivel de señal de color
  180.                 decfsz  LINEA,f                 ;Me fijo si se completaron las 252 líneas...
  181.                 goto    Campo_0                 ;Aún no, repetimos esta parte
  182.                
  183. ; 1/2 Cuadro Correspondiente a la línea 253
  184. ;*************************************************************************************************************************************
  185. ;*** La rutina deberá ser capáz de generar una señal de la forma siguiente
  186. ;***
  187. ;*** 100%                                      
  188. ;***                                _          
  189. ;***       |                       / \      __
  190. ;***       |                    /\/   \  __/  \
  191. ;***       |                   |       \/      |
  192. ;***  30%  |_____         _____|               |_____
  193. ;***             |       |                           |       |
  194. ;***             |       |                           |       |
  195. ;***   0%        |_______|                           |_______|
  196. ;***
  197. ;***       |<-A->|<--B-->|<-C->|<--- 1/2 E --->|<-A->|<--B-->|
  198. ;***       |<--------------- 37.9 us --------------->|
  199. ;***
  200. ;*** A:  1.5 us Llamado Portal Anterior (Front Porsh) previo a la Señal de Sincronismo vertical
  201. ;*** B:  4.7 us Sincronismo Horizontal
  202. ;*** C:  4.7 us Portal Posterior (Back Porsh) Posterior a la Señal de Sincronismo
  203. ;*** 1/2 E: 27 us Que corresponden al tiempo donde se envía la señal de video propiamente
  204. ;*** La señal de sincronismo entonces ocupa los tiempos A+B+C y representan un total de 10.9 us
  205. ;*************************************************************************************************************************************
  206.  
  207. ;*** Ahora debo generar el sincronismo horizontal y media línea, correspondiente a la 253
  208. ;*** Portal Anterior, Parte A de la Señal
  209.                 movlw   0x01                    ;Apagamos Nivel de Negro, Nivel de Brillo y Encendemos nivel de Blanking
  210.                 movwf   LATA
  211.                 call    Wait_A                  ;Llamamos a la rutina de delay para el tramo A de la señal
  212. ;*** Sincronismo Vertical propiamente, parte B de la Señal
  213.                 bcf             LATA,BLANKING   ; Apagamos todo nivel de señal
  214.                 call    Wait_B                  ;Llamamos a la rutina de delay para el tramo B de la señal
  215. ;*** portal posterior, Parte C de la Señal
  216.                 bsf             LATA,BLANKING   ; Llevamos a la señal hasta el nivel de Blanking
  217.                 call    Wait_F                  ;Llamamos a la rutina de delay para el tramo C de la señal)
  218.                 movlw   0x80                    ; Llevo a la salida la señal de Burst...
  219.                 movwf   LATB                    ; ...Sincronizada con desfase 0º
  220.                 call    Wait_G                  ; Llamamos a la rutina de delay de 2.5 us correspondiente al Burst (Tramo G)
  221.                 clrf    LATB                    ; Apagamos la señal de Burst
  222.                 call    Wait_H                  ;Llamamos a la rutina de delay para el tramo H de la señal
  223. ;*** Aquí debe implementarse la rutina para presentar los pixeles en pantalla (Parte E de la Señal)
  224. ;*** Esta línea no la pintaremos con pixeles, ya que la pérdida es mínima y la implementación requeriría de mucha programación
  225.                 movlw   0x03                    ; Activamos los niveles para lograr brillo mínimo
  226.                 movwf   LATA
  227.                 call    Wait_E2                 ;Llamamos a la rutina de delay para el tramo 1/2 E de la señal
  228.  
  229. ;*** De ahora en más entramos en el segundo campo, de las líneas pares
  230. ; Debemos hacer:
  231. ; 6 Pulsos de Pre-ecualización
  232. ; 6 Pulsos de Sincronismo
  233. ; 6 Pulsos de Post-ecualización
  234. ; esto lo realiza la rutina VSincro
  235.  
  236.                 call    VSincro
  237. ;*** Ahora debo esperar el tiempo faltante correspondiente a 1/2 línea
  238.                 movlw   0x03                    ; Activamos los niveles para lograr brillo mínimo
  239.                 movwf   LATA
  240.                 call    Wait_E2                 ;Llamamos a la rutina de delay para el tramo 1/2 E de la señal
  241.  
  242. ;*** Finalmente dibujo las 252 Líneas del Campo 1
  243. ;*** Cuadros Normales
  244.                 movlw   0xFC
  245.         movwf   LINEA                   ;Cargo la Variable línea con 252 (Que son los cuadros normales)
  246.  
  247. Campo_1
  248. ;*** Portal Anterior, Parte A de la Señal
  249.                 movlw   0x01                    ;Apagamos Nivel de Negro, Nivel de Brillo y Encendemos nivel de Blanking
  250.                 movwf   LATA
  251.                 call    Wait_A                  ;Llamamos a la rutina de delay para el tramo A de la señal
  252. ;*** Sincronismo Vertical propiamente, parte B de la Señal
  253.                 bcf             LATA,BLANKING   ; Apagamos todo nivel de señal
  254.                 call    Wait_B                  ;Llamamos a la rutina de delay para el tramo B de la señal
  255. ;*** portal posterior, Parte C de la Señal
  256.                 bsf             LATA,BLANKING   ; Llevamos a la señal hasta el nivel de Blanking
  257.                 call    Wait_F                  ;Llamamos a la rutina de delay para el tramo F de la señal
  258.                 movlw   0x80                    ; Llevo a la salida la señal de Burst...
  259.                 movwf   LATB                    ; ...Sincronizada con desfase 0º
  260.                 call    Wait_G                  ; Llamamos a la rutina de delay de 2.5 us correspondiente al Burst (Tramo G)
  261.                 clrf    LATB                    ; Apagamos la señal de Burst
  262.                 call    Wait_H                  ;Llamamos a la rutina de delay para el tramo H de la señal
  263. ;*** Aquí debe implementarse la rutina para presentar los pixeles en pantalla (Parte E de la Señal)
  264. ;*** por ahora solo esperaremos el tiempo de imagen (52.6 us)
  265.                 movlw   0x03                    ; Activamos los niveles para lograr brillo mínimo
  266.                 movwf   LATA
  267.                 call    Video_Signal    ;Esta rutina muestra los pixeles en pantalla (52.6 uS)
  268.                 clrf    LATB                    ;Apagamos todo nivel de señal de color
  269.                 decfsz  LINEA,f                 ;Me fijo si se completaron las 252 líneas...
  270.                 goto    Campo_1                 ;Aún no, repetimos esta parte
  271.                 goto    Inicio                  ;Finalmente Repetimos la rutina
  272.  
  273.  
  274. VSincro
  275. ;*** Sincronismo Vertical
  276. ;*** La parte dificil viene en los sincronismos verticales
  277. ;*** La "National Television Systems Committee" describe la señal de video textualmente así:
  278. ;*************************************************************************************************************************************
  279. ;*** Field 0 contains 262.5 lines, as follows.
  280. ;***
  281. ;***   3 lines: 6 pre-eq pulses
  282. ;***   3 lines: 6 vertical sync pulses
  283. ;***   3 lines: 6 post-eq pulses
  284. ;*** 253 lines: normal scan lines (many of these are invisible and some are reserved
  285. ;***            for closed-caption data, cable tv scrambler data, etc...
  286. ;***            but so far as sync is concerned, these lines are all "normal" scan lines)
  287. ;*** 0.5 lines: the last line of the field quits right in the middle!
  288. ;***
  289. ;*** Field 1 contains 262.5 lines, as follows.
  290. ;***
  291. ;*** 3 lines: 6 pre-eq pulses
  292. ;*** 3 lines: 6 vertical sync pulses
  293. ;*** 3.5 lines: 7 post-eq pulses
  294. ;*** 253 lines: normal scan lines
  295. ;***
  296. ;*** Con esta información el sincronismo vertical del Campo 1 correspondiente a las líneas Pares puede verse así:
  297. ;***
  298. ;*** 100%
  299. ;***      
  300. ;***                
  301. ;***           |\  /|
  302. ;***           | \| |
  303. ;***  30%    _/     |_   ___   ___   ___   ___   ___   ___     _     _     _     _     _     _   ___   ___   ___   ___   ___   ___
  304. ;***      | |         | |   | |   | |   | |   | |   | |   |   | |   | |   | |   | |   | |   | | |   | |   | |   | |   | |   | |   |
  305. ;***      | |         | |   | |   | |   | |   | |   | |   |   | |   | |   | |   | |   | |   | | |   | |   | |   | |   | |   | |   |
  306. ;***   0% |_|         |_|   |_|   |_|   |_|   |_|   |_|   |___| |___| |___| |___| |___| |___| |_|   |_|   |_|   |_|   |_|   |_|   |
  307. ;***        
  308. ;***                  <1>   <2>   <3>   <4>   <5>   <6>   <1->  <2->  <3->  <4->  <5->  <6->  <1>   <2>   <3>   <4>   <5>   <6>
  309. ;***      |<Línea 253>|<-Línea 1->|<-Línea 2->|<-Línea 3->|<-Línea 4->|<-Línea 5->|<-Línea 6->|<-Línea 7->|<-Línea 8->|<-Línea 9->|
  310. ;***                  |<------- Pre  Ecualización ------->|<------ Sincronismo Vertical------>|<------- Post Ecualización ------->|
  311. ;***                  |       Tiempo en Bajo 2.5 us       |       Tiempo en Bajo 27 us        |       Tiempo en Bajo 2.5 us
  312. ;***                  |       Tiempo en Alto 29 us        |       Tiempo en Alto 5 us         |       Tiempo en Alto 29 us
  313. ;***
  314. ;*** Mientras que el sincronismo del Campo 0 correspondiente a las líneas Pares puede verse así:
  315. ;***
  316. ;*** 100%
  317. ;***      
  318. ;***                
  319. ;***           |\
  320. ;***           | \
  321. ;***  30%    _/  |  ___   ___   ___   ___   ___   ___     _     _     _     _     _     _   ___   ___   ___   ___   ___   ________
  322. ;***      | |    | |   | |   | |   | |   | |   | |   |   | |   | |   | |   | |   | |   | | |   | |   | |   | |   | |   | |        |
  323. ;***      | |    | |   | |   | |   | |   | |   | |   |   | |   | |   | |   | |   | |   | | |   | |   | |   | |   | |   | |        |
  324. ;***   0% |_|    |_|   |_|   |_|   |_|   |_|   |_|   |___| |___| |___| |___| |___| |___| |_|   |_|   |_|   |_|   |_|   |_|        |
  325. ;***        
  326. ;***             <1>   <2>   <3>   <4>   <5>   <6>   <1->  <2->  <3->  <4->  <5->  <6->  <1>   <2>   <3>   <4>   <5>   <6>
  327. ;***      |<-M1->|<-Línea 1->|<-Línea 2->|<-Línea 3->|<-Línea 4->|<-Línea 5->|<-Línea 6->|<-Línea 7->|<-Línea 8->|<-Línea 9->|<M2>|
  328. ;***             |<------- Pre  Ecualización ------->|<------ Sincronismo Vertical------>|<------- Post Ecualización ------->|
  329. ;***             |       Tiempo en Bajo 2.5 us       |       Tiempo en Bajo 27 us        |       Tiempo en Bajo 2.5 us
  330. ;***             |       Tiempo en Alto 29 us        |       Tiempo en Alto 5 us         |       Tiempo en Alto 29 us
  331. ;***
  332. ;***  Siendo M1: La línea 253 (Media Línea) y M2: La línea 10 de las Pares (Media Línea)
  333. ;*************************************************************************************************************************************
  334.  
  335. ;*** Pre Ecualización
  336.                 movlw   0x06
  337.         movwf   LINEA                   ;Cargo la Variable línea con 6
  338.                 clrf    LATB                    ;Apago todo nivel de color a la salida
  339.                 bcf             LATA,BLK_LEV
  340.  
  341. Pre_EQ
  342.                 bcf             LATA,BLANKING
  343.                 call    Wait_C                  ;(2.4 us)
  344.                 bsf             LATA,BLANKING
  345.                 call    Wait_D                  ;(29 us)
  346.                 decfsz  LINEA,f
  347.                 goto    Pre_EQ
  348.  
  349.  
  350.                 movlw   0x06
  351.         movwf   LINEA                   ;Cargo la Variable línea con 6
  352. Vert_Sinc
  353.                 bcf             LATA,BLANKING
  354.                 call    Wait_E2                 ;(27 us)
  355.                 bsf             LATA,BLANKING
  356.                 call    Wait_B                  ;(4.6 us) Casi los 5 us que necesitamos
  357.                 nop                                             ; Agregamos un par de nop para completar el tiempo
  358.                 nop
  359.                 decfsz  LINEA,f
  360.                 goto    Vert_Sinc
  361.  
  362. ;*** Post Ecualización
  363.                 movlw   0x06
  364.         movwf   LINEA                   ;Cargo la Variable línea con 6
  365. Post_EQ
  366.                 bcf             LATA,BLANKING
  367.                 call    Wait_C                  ;(2.4 us)
  368.                 bsf             LATA,BLANKING
  369.                 call    Wait_D                  ;(29 us)
  370.                 decfsz  LINEA,f
  371.                 goto    Post_EQ
  372.                 return
  373.  
  374.  
  375. ;Esta Rutina efectua una demora de 1.5 us
  376. Wait_A
  377.                 movlw   0x03
  378.                 movwf   d1
  379. Delay_A
  380.                 decfsz  d1, f
  381.                 goto    Delay_A
  382.                 return
  383.  
  384.  
  385. ;Esta Rutina efectua una demora de 4.7 us
  386. Wait_B
  387.                 movlw   0x0C
  388.                 movwf   d1
  389. Delay_B
  390.                 decfsz  d1, f
  391.                 goto    Delay_B
  392.                 return
  393.  
  394. ;Esta Rutina efectua una demora de 2.5 us
  395. Wait_C
  396.                 movlw   0x06
  397.                 movwf   d1
  398. Delay_C
  399.                 decfsz  d1, f
  400.                 goto    Delay_C
  401.                 return
  402.  
  403. ;Esta Rutina efectua una demora de 29 us
  404. Wait_D
  405.                 movlw   0x73
  406.                 movwf   d1
  407. Delay_D
  408.                 decfsz  d1, f
  409.                 goto    Delay_D
  410.                 nop
  411.                 nop
  412.                 return
  413.        
  414. ;Esta Rutina efectua una demora de 52.6 us
  415. Wait_E
  416.                 movlw   0xD2
  417.                 movwf   d1
  418. Delay_E
  419.                 decfsz  d1, f
  420.                 goto    Delay_E
  421.                 return
  422.  
  423. ;Esta Rutina efectua una demora de 27 us
  424. Wait_E2
  425.                 movlw   0x6B
  426.                 movwf   d1
  427. Delay_E2
  428.                 decfsz  d1, f
  429.                 goto    Delay_E2
  430.                 nop
  431.                 nop
  432.                 return
  433.  
  434. ;Esta Rutina efectua una demora de 0.6 us
  435. Wait_F
  436.                 goto    $+2
  437.                 return
  438.  
  439. ;Esta Rutina efectua una demora de 2.5 us
  440. Wait_G
  441.                 movlw   0x06
  442.                 movwf   d1
  443. Delay_G
  444.                 decfsz  d1, f
  445.                 goto    Delay_G
  446.                 return
  447.  
  448. ;Esta Rutina efectua una demora de 1.6 us
  449. Wait_H
  450.                 movlw   0x03
  451.                 movwf   d1
  452. Delay_H
  453.                 decfsz  d1, f
  454.                 goto    Delay_H
  455.                 return
  456.  
  457. Video_Signal
  458.                                 ;52.6 us
  459.                 movlw   0x20                    ; Cargo la dirección inicial donde tengo los pixeles a mostrar
  460.                 movwf   TBLPTRL
  461.                 movlw   0x10                    ; En este caso hago un bucle que leerá 16 colores base  y solo incrementaremos su brillo
  462.                                                                 ; esto formará 16 barras de colores en pantalla, cada barra mostrará elmismo color con
  463.                                                                 ; 16 niveles de brillo.
  464.                 movwf   d1
  465. Muestra_Pixeles
  466.                 tblrd*+                                 ; Leo la tabla e incremento
  467.                 movf    TABLAT, W               ; Paso el dato a W
  468.                 movwf   LATB                    ; Pongo el pixel en pantalla
  469.                 nop                                             ; espero un ciclo con el mismo pixel
  470.                 incf    LATB                    ; Incremento el brillo
  471.                 nop                                             ; espero un ciclo con el mismo color y nivel de brillo
  472. ; Este proceso se repite hasta llegar al máximo brillo
  473.                 incf    LATB
  474.                 nop
  475.                 incf    LATB
  476.                 nop
  477.                 incf    LATB
  478.                 nop
  479.                 incf    LATB
  480.                 nop
  481.                 incf    LATB
  482.                 nop
  483.                 incf    LATB
  484.                 nop
  485.                 incf    LATB
  486.                 nop
  487.                 incf    LATB
  488.                 nop
  489.                 incf    LATB
  490.                 nop
  491.                 incf    LATB
  492.                 nop
  493.                 incf    LATB
  494.                 nop
  495.                 incf    LATB
  496.                 nop
  497.                 incf    LATB
  498.                 nop
  499.                 incf    LATB
  500.                 nop
  501.  
  502.                 decfsz  d1,f
  503.                 goto    Muestra_Pixeles
  504.                 return
  505.  
  506.  
  507.                 end                                             ;Fin del Programa

Y finalmente el circuito:


  El circuito tiene algunas cositas a futuro, contempla la opción de conexion USB para reprogramar el 18F2550 o cargarle imágenes (esto no esta implementado en el código) y además una conexión para audio, que permita tener también sonido.
Espero le puedan sacar gran provecho.

Salud  8)

« Última modificación: 20 de Septiembre de 2009, 00:34:48 por SavageChicken »
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Generación de Video Color con PIC
« Respuesta #28 en: 19 de Septiembre de 2009, 14:05:00 »
Te felicito SavageChicken   :-/ :-/ :-/ :-/ :-/ :-/ Es exelente el proyecto , además escrito en ensamblador....impresionante  :shock:

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Generación de Video Color con PIC
« Respuesta #29 en: 19 de Septiembre de 2009, 14:19:34 »
Bravo pollo!!! genial aplicación y genial explicación!

Gracias por compartir :)