Generar Señal de Video con PIC

Saludos Alejandro..

Instrucciones privilegiadas? Creo que me equivoque a la hora de plasmar la idea en texto, el pic18F252 de instrucciones privilegiadas utiles para esto solo serial TBLRD* y MOVFF, pero lo que realmente queria decir es que la serie 18F tiene "Registros privilegiados" que permiten el manejo de vectores de manera eficiente.

Los punteros a registros FSR0,FSR1,FS2 de 16 bits, permiten indexar toda la memoria ram
Con los registros POSTINC,PREINC,POSTDEC,PREDEC,PLUSW puedes accesar muy rapidamente la memoria ram.

Ejemplo de convinacion de instrucciones y registros de la serie 18F

MOVFF POSTINC0,TBLPTRL // Leo el num de sprite y lo indexo en FlashMem (TBLPTR)
TBLRD*+ // Leo un byte en FlashMen correspondiente al sprite eh incrementa el puntero TBLPTR
MOVFW TABLAT // Pongo el byte en el registro W para indexar una paleta de colores
MOVFF PLUSW1,PORTB // Presento el byte indexado por una paleta de colores en el puerto B
SWAPF WREG // Intercambio los 4bits inferiores por los superiores para indexar otro pixel.
MOVFF PLUSW1,PORTB // Muevo el color indexado al puerto B


Si te das cuenta, para una rutina asi son necesaria estos registros eh instruccciones, La instruccion MOVFF es muy util porque mueve bytes entre posiciones con una sola instruccion y sin ocupar el registro W.
El registro POSTINC0, regresa un byte, que es indexado por FSR, ademas despues de leerlo incrementa el indice FSR para asi poder leer el siguiente byte en memoria la proxima vez. todo en una sola instruccion.

Espero poder haber aclarado esto.

Porcierto.. Ayer hice pruebas en mi casa con sonidos, resulta ser que no es necesario utilizar un PIC de apoyo para generar el sonido, el mismo PIC18F252 que grafica todo, lo puede hacer, el truco es ocupar la misma interrupcion de 64uS para graficar las lineas horizontales, la forma mas facil es por muestreo. Osea, almaceno en un vector las muestras del sonido que quiero reproducir y cada vez que entra a la interrupcion presento una muestra en un puerto con DAC. No tengo nada de experiencia con sonidos y pics, pero espero tener algo pronto.
 
gzaloprgm dijo:
La velocidad del pic es 4MIPS (a 12MHz), la del atari2600 era 1MIPS (supongo) pero tenía un procesador de video analógico aparte, que seguramente corría mucho más rapido y leia de una memoria de video compartida entre ambos.

Si podemos conseguir procesadores de videos podríamos dedicar el pic unicamente a manejar la memoria, por lo que se podrían crear cosas más complejas sin depender de las sincronizaciones correctas y la lógica para escribir en la pantalla, dejando unicamente una rutina de acceso a una memoria vram.

Hola amigos.
Como dijo el compañero Gonzalo en el mensaje #24, los que diseñaron el atari2600 no se complicaron tanto con la programación digital y no les hacia mella el hecho de tener un procesador de 1MIPS, ya que tenían algo mucho más poderoso: un procesador de video analógico. Tener un procesador a la medida de nuestras necesidades es mucho mejor que cualquier micro programable, por eso se me hace interesante la idea de construir un procesador de video que deje atrás los líos de la programación, ya que el microcontrolador sólo se ocuparía de las rutinas más sencillas como mandar la información del color y posición de pixeles (x,y) al procesador de video que con ayuda del integrado AD725, convierte las señales RGB en NTSC/PAL.

Quiero darme la tarea de construir un procesador de video, pero necesito mucha RAM porque quiero tener un buffer completo para toda la imagen. Para generar una imagen con registros de 8 bits manteniendo una proporción de aspecto de (4:3) la máxima resolución posible sería 256x192 (49152px). Si se quiere que se tengan 256 tonos por color para cada pixel, siendo tres los colores básicos se necesitarían 3 bytes (un byte por color) quedando así la imagen con una calidad de colores de 24 bits. Tenemos pues que (49152px)*(24 bits) = 1179648 localidades de memoria, lo que es igual a 1152kb o también equivale a 1.125Mb o también a 144kB. Todo esto puede parecer demasiado pero he visto que las tarjetas de RAM de una PC poseen módulos de circuitos integrados con capacidades superiores.

Para todo esto, hablando sin rodeos, quisiera saber si alguien conoce alguna memoria RAM expansible para ser conectada en un microcontrolador sencillo o en un circuito secuencial que pueda se usado como procesador. También me serviría contar con información de cómo utilizar los módulos de las tarjetas de memoria RAM.

Les agradeceré cualquier dato.
 
Javilondo dijo:
Para todo esto, hablando sin rodeos, quisiera saber si alguien conoce alguna memoria RAM expansible para ser conectada en un microcontrolador sencillo o en un circuito secuencial que pueda se usado como procesador. También me serviría contar con información de cómo utilizar los módulos de las tarjetas de memoria RAM.

Les agradeceré cualquier dato.

Has considerado la opción de usar una memoria accedida via USB ?
Capacidad de almacenamiento no te va a faltar, y la manejás con un pic.
 
Alejandro Sherar dijo:
Has considerado la opción de usar una memoria accedida via USB ?
Capacidad de almacenamiento no te va a faltar, y la manejás con un pic.

Lo que comentas no es muy práctico porque sólo cubre la necesidad del espacio o capacidad, pero no la de velocidad, que es realmente la propiedad que interesa en un procesador de video. Lo que pasa es que las memorias RAM son de ciclos rápidos de lectura/escritura (en el orden de ns) y las memorias EEPROM y FLASH tardan mucho más en ser leídas y escritas (n el orden de µs y ms), consumiendo así tanto tiempo que resultaría éste insuficiente para generar las instrucciones de sincronía horizontal de 64µs y ni pensar las de sincronía vertical. Además las memorias no volátiles tienen una vida limitada de ciclos de escritura que rápidamente se acabarían en los procesos de video, lo cual es malo porque cuando a un cluster de memoria se le termina la vida útil de sus ciclos de escritura sólo podrá ser leído, y ya no podrá almacenar nuevas variables.

¿O acaso te refieres a una memoria RAM USB? En ése caso si es factible, pero aún seguiría sin ser práctico, ya que le quitarías la simpleza al diseño al utilizar un protocolo de comunicación de alta velocidad y complejidad, siendo así, si cuentas con los recursos suficientes para comunicarte por protocolo USB, sería mejor encausar tal potencia de procesamiento a generar con el mismo PIC las rutinas y patrones de video, condición que volvería innecesaria una memoria externa.
 
Como diria una cancion..
"Close your eyes so you don't feel them."
No se desanimen, todos podemos usar la imaginacion y proponer soluciones a un problema, lo que si seria bueno, es agrupar las ideas en objetivos similares.. see this..

objetivos diferentes (que agrupan objetivos similares)
- Un generador de video para televisores NTSC con resoluciones alrededor de (256x224) en colores, sin Video RAM (Generacion por Mosaicos,sprites).
- El mismo que el anterior pero con una memoria de Video (256Kbytes minimo).
- Un generador de video para computadora VGA con resoluciones alrededor de (640x480) utilizando Video RAM (1Mbyte como minimo)
- Un generador de video en 1 o 2 chips. (aplica para los 4 anteriores)
- Un generador de video super complejo (muchos chips y aplica para los 4 primeros).
- Generar video con logica digital (compuertas, flipflops etc) (aplica para los 4 primeros)
- Genrear video con un microprocesador (aplica para los 4 primeros)

Asi que seria bueno que nos hubiquemos cada uno en algun grupo, o reconocieramos ideas similares y le pusieramos nombre a la propuesta para poder saber de cual idea estamos haciendo un comentario.

Como ven? Yo en lo personal tengo muy avanzada la primera idea, pero despues me gustaria intentar un controlador avanzado con Video RAM para imitar un Playstation. Ya imagino que se puede, solo tengo que utilizar Mucha RAM y microcontroladores poderosos (100MIPS-32bits or better).

Nos vemos, esta semana me enferme y no hice nada en casa, ya me siento mejor, este fin de semana siguo trabajando con el PIC18F252.
 
gzaloprgm dijo:
La velocidad del pic es 4MIPS (a 12MHz), la del atari2600 era 1MIPS (supongo) pero tenía un procesador de video analógico aparte, que seguramente corría mucho más rapido y leia de una memoria de video compartida entre ambos.

Javilondo dijo:
Como dijo el compañero Gonzalo en el mensaje #24, los que diseñaron el atari2600 no se complicaron tanto con la programación digital y no les hacia mella el hecho de tener un procesador de 1MIPS, ya que tenían algo mucho más poderoso: un procesador de video analógico.

Yo revise un poco sobre el tema...... en realidad era un CPLD Xilinx que hacia la funcion de procesador de video...
 
En esa epoca (atari2600) era imposible generar video con microprocesadores dedicados porque eran muy lentos (1 MIPS), asi que eso se resolvia con logica digital (CPLD), pero ahora las cosas son diferentes, tenemos microprocesadores que corren a mas de 100 MIPS. Aunque incluso hoy en dia siguen utilizando la logica digital (FPGA).

Suerte con el proyecto, yo seguire intentandolo con microcontroladores, porque me sientan bien, los que quieran intentar con logica digital adelante, luego nos platican como programar en VHDL o Verilog... (El PPU de nintendo esta escrito en Verilog).
 
que onda jeje
aca reviviendo temas
me parece muy interesante todo lo que han estado comentando en este tema jaja
felicidades a los que lograron hacer todo esto

bueno tengo un problema
la verdad es que no me sale nada
mi meta es para mañana hacer un videojuego sencillo con el pic 16f84
ya tengo unos dias estudiando esto hice varias pruebas e incluso descargue el tetris de rickards projects

para empezar debo mencionar que estoy utilizando un cristald e 4mhz
y en este momento me es imposible conseguir uno mas rapido
donde vivo als tiendas de electronica estan muy pobres
en ocaciones nisiquiera tienen el 16f84 y no se diga otros pics todos son sobre pedido
el detalle es que no puedo trabajar para mañana con otro pic que nos ea este y otro oscilador.

estoy haciendo pruebas apenas de sincronizacion horizontal
y lo hago exactamente como lo mencionan quiza un poco diferente por las limitaciones de este oscilador
-frontporch de 2us en 0.3v
-sync de 5us en 0v
-un delay deunos 6us en 0.3
-finalmente la información entre 0.3 y 1v durante 49us que es lo que me resto

y este patron lo repito indefinidamente
MI TELEVISOR ES NTSC soy de mexico :) aunque en sincronizacion horizontal no deberia afectar

pero no me funciona si trato de poner una barra vertical blanca me sale toda la pantalla con diversas lineas blancas
tengo un par de dudas que me gustaria me pudieran resolver:

1.-estoy metiendo la señal por rca es lo correcto cierto ?
2.- el televisor que uso no es muy antiguo rickard hace alucion a televisores antiguos y por ahi lei que hay televisores de señal entrelazada, es cierto? puede este ser mi problema
3.- otra cosa lapantalla de video normalmente es azul y cuandos e conecta algun dispositivo por rca la visualiza entonces pero al visualizar mis errores solo al cambiar a ese canal puedo ver lo que estoy haciendo por alrededor de 1 o 2 segundos despues nuevamente se ve azul pero con una leve distorcion (como puedoe stabilizar la señal para que me siga apareciendo lo que hago?

quiza los siga molestando pero esas son las dudas que tengo para poder empezar a hacer algo

el tetris que baje lo corre pero solo puedo ver una porcion un poco extraña supongo que se debe al oscilador
 
Hola

felicidades por tu proyecto picman
yo no encontre el 16f88 pero cambie el programa para que funcione en el 16f877a y funciona a la perfeccion. los cambios son miserables pero si quieren el programa modificado lo subo.

tambien consegui un RF-Converter de un vhs muy antiguo y logre transmitir la señal por el canal 3 y 4.

la idea de usar el pic18f2550-18f5440 para la generacion de color me parece muy interesante porque con un cristal de 4MHz puedes trabajar a 48MHz 12Mips configurando el PLL.
ademas de tener mucha mas memoria.

salu2:)
 
Aqui va el codigo que estaba utilizando por lo del oscilador no quice arriesgarme a usar mal los tiempos asi que tengo muchos NOP :) si alguien sabe de algo que me pueda ayudar digame porfas

este programa me da muchas rallas blancas distribuidas a lo largo d ela pantalla parpadeando que deberia dejarmelas en 1 sola linea vertica separadas por muchas lineas negras :(

igual si alguien tiene un ejemplo sencillo para el 16f84 que me facilite seria de gran ayuda =D gracias

Código:
list P=16F84A
#INCLUDE P16F84A.INC
#DEFINE BANCO_0 BCF STATUS,5
#DEFINE BANCO_1 BSF STATUS,5
COLOR_SYNC EQU 0H
COLOR_BLACK EQU 1H
COLOR_GRAY EQU 2H
COLOR_WHITE EQU 3H
VIDEO_PORT EQU PORTA 
DELAY_CNT EQU 0CH
CNT_1 EQU 0DH
CNT_2 EQU 0EH
;EL DELAY TIENE UNA PERDIDA DE 4N+2 CICLOS DE RELOJ
DELAY	MACRO
	LOCAL LABEL
	MOVWF DELAY_CNT
LABEL DECFSZ DELAY_CNT,1
	GOTO LABEL
	ENDM
;FIN DELAY
	ORG 0H
	GOTO BEGIN
	ORG 05H
BEGIN NOP
	BANCO_1
	BCF TRISA,0
	BCF TRISA,1
	BANCO_0
HORIZONTAL	
;----SINCRO VERTICAL----
	MOVLW 6
	MOVWF CNT_1 
SHORT_SYNC	MOVLW COLOR_BLACK
	MOVWF VIDEO_PORT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	MOVLW COLOR_SYNC
	MOVWF VIDEO_PORT
	DECFSZ CNT_1
	GOTO SHORT_SYNC
	MOVLW 6
	MOVWF CNT_1 
LONG_SYNC	MOVLW COLOR_SYNC
	MOVWF VIDEO_PORT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	MOVLW COLOR_BLACK
	MOVWF VIDEO_PORT
	DECFSZ CNT_1
	GOTO LONG_SYNC
	MOVLW 6
	MOVWF CNT_1 
SHORT_SYNC2	MOVLW COLOR_BLACK
	MOVWF VIDEO_PORT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	MOVLW COLOR_SYNC
	MOVWF VIDEO_PORT
	DECFSZ CNT_1
	GOTO SHORT_SYNC2
;----FIN VERTICAL------
	MOVLW .200
	MOVLW CNT_1
;----------SINCRONIZACION HORIZONTAL--------
BLACK	MOVLW	COLOR_SYNC
	MOVWF	VIDEO_PORT
	NOP
	NOP
	NOP
	NOP
	MOVLW  COLOR_BLACK
	MOVWF	VIDEO_PORT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP	
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ CNT_1
	GOTO BLACK
WHITE	MOVLW	COLOR_SYNC
	MOVWF	VIDEO_PORT
	NOP
	NOP
	NOP
	NOP
	MOVLW  COLOR_BLACK
	MOVWF	VIDEO_PORT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	MOVLW  COLOR_WHITE
	MOVWF	VIDEO_PORT
	MOVLW  COLOR_BLACK
	MOVWF	VIDEO_PORT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP	
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	MOVLW .200
	MOVLW CNT_1
BLACK2	MOVLW	COLOR_SYNC
	MOVWF	VIDEO_PORT
	NOP
	NOP
	NOP
	NOP
	MOVLW  COLOR_BLACK
	MOVWF	VIDEO_PORT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP	
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ CNT_1
	GOTO BLACK2

;----FIN HORIZONTAL---------
	GOTO HORIZONTAL
	END
 
alpharsp: Por favor usa el comando
Código:
 para que los programas no se extiendan demasiado y se pueda tener una lectura clara de las respuestas en el foro...

Gracias...
 
Hola gente, quiero hacer un generador de barras verticales en escala de grises, algo muy sencillo, tengo un 16f84a y un 16f876a, preferentemente con el 16f84a quisiera hacerlo.
Me ayudan?
Estuve buscando algún código en la web pero no encontré nada hecho... :(
 
Hola otra vez, basandome en el sitio http://www.rickard.gunee.com/projects/video/pic/howto.php en el código de ejemplo que está incompleto, que debería generar una barra blanca en el medio y dos grises a los costados del tv. Lo hice para un pic 16f876a, los delay los hice con nop, suponiendo que cada nop tiene una duración de 1us, ya que uso un cristal de 4mhz.
El problema es que me sale lo siguiente en el TV:
http://img97.imageshack.us/img97/1170/210909tv.jpg
Y no se porque sale eso... alguna ayuda?
Este es el código:
Código:
	LIST P=16F876A 
	PROCESSOR 16F876A 
	INCLUDE "P16F876A.INC" 
	RADIX           DEC
	__IDLOCS        H'0000'
	ERRORLEVEL      0, -302, -306

	__CONFIG 		_CP_OFF&_PWRTE_ON&_BODEN_OFF&_LVP_OFF&_DEBUG_OFF&_XT_OSC&_WDT_OFF&_WRT_OFF 


	ORG 00h

	bsf STATUS,RP0 
	bcf STATUS,RP1		;pagina 1
	movlw 00000000B		;todos como salida
	movwf TRISB
	bcf STATUS,RP0 		;pagina 0

main:	
	movlw B'00000001'	;get black level (1)
	movwf PORTB		;set port value (1)
	movlw B'00000000'	;get sync level (1)
			;****5 4us sync ****	
	movwf PORTB		;set port value(1)
	NOP			;delay for 4us (4)
	NOP
	NOP
	NOP			
	movlw B'00000001'	;get black level (1)
			; **** 8 us delay ****	
	movwf PORTB		;set port value (1)
	NOP			;delay for 8us (8)
	NOP			
	NOP
	NOP
				;NOP
				;NOP
				;NOP
				;NOP
	movlw B'00000010'	;get gray color (1)
			; **** 52 image data ****	
	movwf PORTB		;set port value (1)
	NOP			;delay for 4us (4)
	NOP
	NOP
	NOP
	movlw B'00000001'	;get black level (1)
	movwf PORTB		;set port value (1)
	NOP			;delay for 20us (20)
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	movlw B'00000011'	;get white level (1)
	movwf PORTB		;set port value (1)
	NOP			;delay for 4us (4)
	NOP
	NOP
	NOP
	movlw B'00000001'	;get black level (1)
	movwf PORTB		;set port value (1)
	NOP			;delay for 20us (20)
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP	
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	movlw B'00000010'	;get gray level (1)
	movwf PORTB		;set port value (1)
	NOP			;delay for 3us (3)
	NOP
	NOP
	NOP	

	goto main		;loop forever jump (3)
END
Muchas gracias!! Saludos
 
chekate esto:http://www.geocities.com/SiliconValley/Monitor/1802/
es muy muy viejo lo hizimos hace 12 años y funcino prfecto, alguien copio el website y lo mantiene vivo aun. fue un decodificador de cable y genera toda la señal de tv, habia uno de Rudolf F. Graff y William Sheets que con otros medios generaba hasta el color usando un chip viejo de videocamara el CD22402 lo interesante de ese era la forma en que regeneraba todas las sincronias a partir del burst de crominancia de otra señal usando cristal, pll, divisores y multiplicadores.
en esa pagina debe de estar todo, pero yo devo de tener aun el codigo original en algun disco viejo.
 
lo que itvboy ha logrado es genial, este es un proyecto que practicamente ya tengo abandonado aunque aún me queda la espina de lograr generar color con un PIC, este es uno de los proyectos que tengo pensado retomar próximamente, ahora siguiendo los pasos de itvboy
 
Atrás
Arriba