Tetris con Pic

He hecho el juego Tetris con un PIC16F84 corriendo @ 12MHz.

Foto del juego.


Foto de como quedo la tarjeta.


Foto de mi hijo y el juego, el mas indicado para probar su funcionamiento.
¿Que es Tetris? 
Tetris es un juego antiguo ruso donde se debe tratar de encajar bloques en un campo de juego, muy simple pero muy divertido. Todos los bloques se construyen a partir de cuatro ladrillos (el nombre Tetris se deriva de la palabra griega para cuatro: "tetra"), hay siete combinaciones de los cuatro ladrillos. Esta versión está utilizando un sistema de juego de PIC como plataforma, para generar una señal de vídeo en software. El hardware utilizado para la generación de vídeo es de dos resistencias que forman un convertidor de 2-bit DA. Por lo general, la señal de vídeo se genera en los juegos de vídeo con unos chips de vídeo. En este proyecto la señal de vídeo se calcula en tiempo real por el microprocesador así como el haz de electrones pasa sobre la pantalla. 
Cuando se enciende el juego comienza! (No había memoria disponible para una pantalla de introducción de lujo o similar). La puntuación se muestra en la esquina inferior derecha, y el bloque siguiente a venir se muestra en la esquina superior izquierda de la pantalla.  Los bloques, que pueden desplazar lateralmente mediante el uso de la palanca de mando, la velocidad de caída puede ser temporal y aumenta al mover joystick hacia abajo. El botón fuego se utiliza para girar los bloques. Cuando una línea horizontal está llena, entonces se quita. Se consiguen puntos por líneas continuas y bloques colocados. A medida que se acumula más puntos el nivel de dificultad se incrementa y aumenta la velocidad del bloque. La velocidad de música se incrementa a medida que aumenta la velocidad del juego. Usted pierde el juego cuando el nivel del campo de juego ha llegado a la cima y no hay espacio para más bloques.
Algunos  TV  están construidos con  tubos de vacío, que tiene una pantalla de fósforo y si se disparan electrones  desde el canon., cuando los electrones  llegan a la pantalla,  luz es emitida por el fósforo. El haz de electrones desde el cañón de electrones se puede doblar por lo que el uso de imanes y asi se  dispara a diferentes partes de la pantalla. Si este haz de electrones es controlado, se pueden dibujar líneas horizontales por toda la pantalla repetidamente,  la intensidad del haz también puede ser controlada. La pantalla se vuelve a dibujar 25 veces por segundo en un sistema PAL, pero para reducir el parpadeo de la imagen está entrelazado, que muestra primero todas las líneas impares y luego todas las líneas pares, por lo que la imagen está parcialmente actualizada 50 veces por segundo. Gracias a la "persistencia del efecto de la visión" del cerebro humano la imagen parece ser constante en lugar de parpadeo de 50Hz. Para obtener el color de cada punto de la pantalla se divide en tres colores: rojo, verde y azul, sin embargo aquí sólo vamos a discutir la televisión en blanco y negro, porque eso es sólo lo  posible de generar en tiempo real en el software usando un PIC.
Creación de señales de vídeo en software Como se sabe una señal de vídeo, es muy fácil de generar en software, cuando se tiene el poder de procesamiento ilimitado. El problema es que requiere mucha potencia del procesador, pero si usted no tiene un potente procesador que se puede hacer de todos modos, a pensar antes de escribir el código.
En los ejemplos de código en esta parte voy a utilizar las dos siguientes macros: DNOP - dual nop, una macro que espera dos ciclos de reloj, en lugar de dos nops retraso - una macro retardo que retarda 3 veces el número de ciclos de reloj en el W- registrarse.
El hardware Para ser capaz de generar una señal de vídeo, con un poco de hardware que se necesita  ser capaz de generar niveles de señal entre 0 y 1V. Para tener una idea necesitará al menos 3 niveles. El televisor necesita sincronización y el nivel de negro para ser capaz de bloquear la señal de vídeo. Si desea más de una imagen en negro que necesita un poco de nivel de gris o blanco. Algún tipo de convertidor de digital a analógico, con por lo menos 2bits para obtener niveles suficientes. La impedancia de entrada de la entrada del compuesto en una TV estándar es de 75 ohmios, y mediante el uso de dos resistencias de un DA 2-bit se puede crear, gracias a la división de tensión.

Al conectar las D0 y D1 a tierra, el voltaje en la entrada de la TV será 0v (nivel de sincronización), porque no hay nada conectado a VDD.


Conexión a tierra D1 y D0 a 5v, pondrá el resistor 450ohm en paralelo con la impedancia de entrada de 75 ohmios de la televisión, y con la resistencia de 900ohm conectado en serie, y gracias a esta división de tensión genera 0.33v en la entrada de la TV, y que es bastante negro. (Nivel de negro verdadero es 0.3V)



Conexión a tierra D1 y D0 a 5v, pondrá el resistor 900ohm en paralelo con la impedancia de entrada de 75 ohmios de la televisión, y con la resistencia de 450ohm conectado en serie, y gracias a esta división de tensión genera 0.67v en la entrada de la TV, y que es de color gris.
Conexión de ambos D1 y D0 a 5v, pondrá el resistor 450ohm en paralelo con la resistencia 900 ohmios, con la impedancia de entrada de 75 ohmios del televisor conectado en serie, y gracias a esta división de tensión genera 1,0 en la entrada de la TV, y que es el nivel de blanco.
Con este circuito, cuatro niveles se pueden crear. La imagen de arriba muestra los circuitos equivalentes para los cuatro niveles diferentes y cómo las tensiones se crean. Valores de resistencia no son críticos, podría utilizar los valores más estándar 470 y 1k en vez de 450 y 900, seguirá siendo el trabajo de todos modos.
Una exploración de línea, por lo que una barra vertical.

La primera prueba que hice cuando empecé a experimentar con el vídeo generado por el software era hacer una barra blanca vertical en la pantalla. Mediante la creación de un ciclo de scan-line con información de color gris-negro-blanco-negro-gris, y se repitió el análisis de línea de siempre, la imagen puede verse en un televisor mas o menos así. La señal de sincronización horizontal de la figura-pulso, seguido por un retardo y entonces la información de color, por lo que la televisión podría bloquear la señal horizontalmente. (No verticalmente porque, no había verticalmente sync-pulsos). 

La señal de vídeo generada por el código de abajo se vería así en un osciloscopio. Los golpes bajos son las barras de color gris, y el gran bache en el medio está la barra blanca. La señal de vídeo generada por el código de abajo sería así si la entrada en un televisor. Dos barras grises y una barra blanca.(El borde marrón se supone que es la TV)


principal:
movlw COLOR_SYNC , Obtener niveles de sincronización (1)
; **** Sync 4US ****
movwf VIDEO_PORT , Conjunto de valores puerto (1)
movlw 3 ; Configuración DelayTime
DELAY ; Retardo para 3US (9)
movlw Color_Black , Obtener el nivel de negro (1)
; **** 8 nos demorar ****
movwf VIDEO_PORT , Conjunto de valores puerto (1)
movlw 7 ; Configuración DelayTime (1)
DELAY ; Retardo para 7US (21)
movlw COLOR_GRAY ; Ponerse de color gris (1)
; **** 52 datos de imagen ****
movwf VIDEO_PORT , Conjunto de valores puerto (1)
movlw 3 ; Configuración DelayTime (1)
DELAY ; Retardo para 3US (9)
movlw Color_Black , Obtener el nivel de negro (1)
movwf VIDEO_PORT , Conjunto de valores puerto (1)
movlw 19 ; Configuración DelayTime (1)
DELAY ; Retardo de 19us (57)
movlw Color_White , Obtener el nivel de blanco (1)
movwf VIDEO_PORT , Conjunto de valores puerto (1)
movlw 3 ; Configuración DelayTime (1)
DELAY ; Retardo para 3US (9)
movlw Color_Black , Obtener el nivel de negro (1)
movwf VIDEO_PORT , Conjunto de valores puerto (1)
movlw 19 ; Configuración DelayTime (1)
DELAY ; Retardo de 19us (57)
movlw COLOR_GRAY , Obtener niveles de gris (1)
movwf VIDEO_PORT , Conjunto de valores puerto (1)
2 movlw ; Configuración DelayTime (1)
DELAY ; Retardo para 2us (6)
DNOP , Aplazar por dos relojes (2)
goto principal ; Bucle infinito salto (3)



Como se puede ver, el número total de ciclos de reloj es de 192 por cada vuelta del bucle, por lo que la 64us scan-line. El momento es muy importante, así que esto es lo que tiene que ver con los ciclos de reloj de conteo.
 --------------------------------------------------------------------------------------