Está en la página 1de 8

UNIVERSIDAD DISTRITAL

FRANCISCO JOSE DE CALDAS

LABORATORIO N°3 MICROCONTROLADORES

TETRIS

OSCAR EDUARDO LÓPEZ 20151005735


ALBEIRO CARRANZA 20151005576

BOGOTÁ D.C, MARZO DEL 2018


Objetivo general
- Aprender a usar las interrupciones y el módulo de teclado del microcontrolador.

Objetivos específicos
 Diseñar e implementar un juego de tetris en el microcontrolador.
 Configurar una LCD para visualizar datos específicos del juego.

Planteamiento del problema


Esta práctica de laboratorio consiste en diseñar un tetris usando dos matrices de leds 8x8 en
donde la interrupción IRQ del microcontrolador deberá ser el inicio y la pausa del juego y el
módulo del teclado KBI deberán ser los movimientos comunes de las figuras (desplazar hacia
la izquierda, desplazar hacia la derecha, rotar y bajar más rápido), además tendrá que tener 5
diferentes niveles que se verán reflejados en la velocidad de caimiento de la figura, estos
niveles dependen del puntaje del usuario el cual aumentará dependiendo de las líneas
horizontales que se vallan obteniendo, (1 línea = 1 punto, 2 líneas = 3 puntos, 3 líneas = 6
puntos, 4 líneas = 10 puntos).
Para esta práctica también se tendrá que usar una LCD para visualizar el nivel, el puntaje y
el puntaje más alto del juego.

Análisis del problema


Para comenzar con la solución de esta práctica, primero se tiene en cuenta todo proceso que
habrá que tener para el movimiento de la ficha, pues con un buen diseño con respecto al
movimiento de la ficha, se tiene gran parte de la práctica, además tienen que crearse varias
subrutinas para cumplir con las diferentes cosas que pide la práctica, como revisar línea, es
decir, si una o varias líneas horizontales están llenas, crear pieza aleatoria y otras más que
serán explicadas en el diseño.

Diseño y modelo
Como se dijo en el análisis del problema, lo importante es tener un buen manejo en la figura,
por lo tanto, como son 2 matrices de leds de 8x8, se decide crear 16 registros que serán la
pantalla estática, es decir, estos registros guardarán las figuras que ya han caído totalmente,
también se crea otros 16 registros los cuales son para visualizar en las matrices tanto la
pantalla estática como la figura descendiendo(pantalla dinámica), y por último se crean un 8
registros los cuales son para tener controlada la figura, es decir, 4 de estos 8 registros tienen
la figura que sale de la creación aleatoria y los otros 4 son un auxiliar el cual sirve para
guardar la figura antes mencionada, revisar si esta puede moverse (no choca con algo ya
estático) y si puede moverse, pasar lo que hay en el auxiliar a la figura.
El proceso principal se muestra en el diagrama de flujo 1.

Diagrama de flujo 1. Proceso principal del tetris.


Como se puede ver en el anterior diagrama de flujo, al comenzar cada juego, primero se
ponen en ‘0’ las matrices, es decir, los registros de pantalla estática y también los registros
de pantalla dinámica, luego de esto se crea la pieza aleatoria, para esto se llama la subrutina
de PiezaAleatoria, en la cual se hace uso del algoritmo de generación de números aleatorios,
el cual es,

En donde el primer valor de X (semilla), se escoge como ‘1’, 𝑎 = 5, y c es un valor que se


toma de un registro el cual está aumentando cuando se está en modo pausa o antes del inicio,
y por último se enmascara el valor de X con 0FH, con esta lógica se logra crear 32 piezas
aleatorias, que luego se repiten, pero que al comenzar cada juego se creen las piezas en orden
diferente, además en esta subrutina, hay un registro llamado “Posicion”, el cual tomará un
valor de uno cada vez que se cree una nueva figura indicando que la esta está en el lugar más
alto del tablero, esto con el fin de tener un control detallado de la pieza sabiendo en qué lugar
del tablero está.
Cuando se retorna la rutina de PiezaAleatoria ya se tiene la nueva pieza en los 4 registros de
figura, y se verifica si estos registros chocan con los cuatro primeros registros de la pantalla
estática por medio de la operación lógica “And”, si chocan, quiere decir que el juego ha
terminado, si no, quiere decir que la figura puede bajar.
Para el proceso de descenso de la figura, primero se llama la rutina de TIEMPO, en donde el
acumulador toma el valor de un contador el cual cambia dependiendo del nivel, después los
cuatro registro de figura auxiliar toman el valor de la figura y el bit 2 del registro
“Movimiento” se hace 1, esto con el fin de que al llamar la rutina de Revisar se sepa que la
figura está descendiendo, en el diagrama de flujo 2 se presenta el proceso que se tiene en
cuenta para revisar cuando la figura valla a hacer algún movimiento. Como se puede ver en
el diagrama de flujo, primero se pregunta en qué posición está la figura, para esto el uso del
registro “Posicion”, luego de identificar en qué parte del tablero está la figura, se procede a
preguntar si la figura está moviéndose a los lados, girando o está desendiendo, para esto se
usa el registro “Movimiento” en el cual, cuando el bit 4 o 2 de este registro esté en ‘1’ es
porque la figura está desendiendo, al saber que la figura va a desender se procede a aumentar
en una unidad el regitro “Posición” indicando que la figura ha desendido una posición más,
y luego dependiendo en qué posición estaba la figura se verifica si hay o no un choque con
los respectivos registros de la pantalla estática; cuando no se presenta un choque quiere decir
que la figura puede decender y por lo tanto se hace la operación lógica OR entre los
respectivos registros de la pantalla estática y la figura para que el decenso pueda ser
visualizada en la pantalla dinámica.
Diagrama de flujo 1. Proceso principal del tetris.

Cuando el bit 1 o 3 del registro “Movimiento” está en ‘1’ es porque la figura está girando o
desplazándose a los lados y sabiendo esto se procede a verificar si hay un choque entre los
respectivos registros de la pantalla estática y la figura dependiendo de la posición de esta;
cuando no se presenta ningún choque quiere decir que la figura puede desplazarse o girar y
por lo tanto se llama la subrutina ActualizarFigura en la que se transfiere la figura auxiliar a
la figura, y luego se hace la operación lógica OR entre los respectivos registros de la pantalla
estática y la figura para que el desplazamiento o giro pueda ser visualizada en la pantalla
dinámica.
Por último si hubo un choque, salta a una posición de memoria en la que solo se incrementa
un registro llamado “Revision” y retorna la subrutina.
Siguiendo con el proceso principal, luego de haber retornado la subrutina de Revisar, se borra
el registro “Movimiento” para saber que se ha terminado el descenso y así dejar el registro
libre por si llegase a ocurrir una interrupción para desplazar o girar la figura y así setear los
bits correspondientes a estos movimientos; luego de esto, se verifica si hubo choque o no, es
decir, si el registro “Revision” es ‘1’ o ‘0’ respectivamente, si no hubo choque quiere decir
que la figura puede seguir descendiendo, por lo tanto salta a la posición de memoria donde
se llamaba la subrutina TIEMPO y se repite el proceso; si hubo un choque se borra el registro
“Revision” y quiere decir que la figura ya chocó con algo estático y entonces se tiene que
quedar ahí, por lo tanto se actualiza la pantalla estática, transfiriendo todo de la pantalla
dinámica es esta, luego se procede a revisar si hay o no líneas horizontales llenas llamando
la subrutina RevisarLinea, luego de esto se hace el proceso para el puntaje en el cual primero
se pregunta por un registro llamado “ContPuntaje” el cual nos dice si hubieron o no líneas
horizontales llenas y cuántas, si no hubieron, es decir el registro “ContPuntaje” está en ceros
se salta a la posición de memoria donde se crea otra figura aleatoria y se repite el proceso, si
hubo una o más líneas horizontales, se le suma a un registro llamado “ContPuntFinal” los
respectivos puntos dependiendo de cuántas líneas horizontales hubieron; por último se
pregunta por el valor del registro “ContPuntFinal” para así cambiar, si es necesario o no, el
nivel y el contador el cual hace más rápido el descenso y se salta a la posición de memoria
donde se crea otra figura aleatoria y se repite de nuevo todo el proceso.
Por último y no menos importante a tener en cuenta en el diseño de esta práctica, son las
interrupciones usando el módulo de teclado (KBI) las cuales permiten hacer los diferentes
movimientos posibles con la figura, en el diagrama de flujo 3 se puede observar el proceso
que se tuvo en cuenta para estos movimientos, como se puede ver en el diagrama, primero se
transfiere la figura a la figura auxiliar con la cual se hará todo el proceso del movimiento
escogido.
Para el desplazamiento a la derecha o izquierda, solo se desplaza una vez los 4 registros de
la figura auxiliar hacia la derecha o izquierda respectivamente y para evitar que la figura se
desborde, se pregunta si luego de desplazar un registro la bandera de carrier es 1, si es así,
quiere decir que no se puede desplazar más la figura y se salta a la posición de memoria
SALIR, en donde se termina el proceso de retornar la rutina de interrupción, si los cuatro
registros se pueden desplazar se procede a poner en 1 el bit 1 o 3 del registro “Movimiento”
para identificar que se está desplazando o girando la figura y luego se llama la subrutina de
revisar explicada ya anteriormente, por último se salta a la posición de memoria SALIR, para
terminar el proceso de retornar la rutina de interrupción.
Para el descenso más rápido, solo se llama una subrutina de tiempo, la cual tiene un contador
más pequeño, luego de esto, se hace 1 el bit 4 del registro “Movimiento” para identificar que
se está bajando, después se llama la subrutina de revisar explicada anteriormente, se pregunta
si hubo un choque, si fue así salta a la posición de memoria SALIR para terminar el proceso
de retornar la rutina de interrupción, si no hubo choque, se vuelve a leer el puerto G para
saber si sigue oprimiendo el pulsador de bajar, si es así se salta a repetir el proceso de bajar,
si no, salta a la posición de memoria SALIR.

Diagrama de flujo 3. Interrupción módulo KBI

Por último, para la rotación, se hacen 3 casos diferentes, cuando la figura es un cuadro que
no se hace nada, cuando la figura es un palo ya que es la única figura que ocupa 4 registros,
y el resto de figuras es el último caso, en donde la figura se desplaza totalmente a la derecha
con el propósito de saber que la figura está en los 3 bits menos significativos de cada uno de
los tres registros de figura auxiliar, al saber que la figura está ahí, se rotan estos 9 bits hacía
la derecha y luego se vuelve a figura en donde estaba, al tener la figura ya rotada se procede
a poner en ‘1’ el bit 3 o 1 del registro “Movimiento” para identificar que se está rotando,
después se llama la subrutina de revisar, se pregunta si hubo un choque, es decir, si se puede
rotar o no y por último se salta a la posición de memoria SALIR.
Diagrama del circuito

Conclusiones
 Con esta práctica de laboratorio se logró conocer el correcto manejo de las interrupción
por medio del pin IRQ y las interrupciones del módulo de teclado(KBI) del
microcontrolador, también, puesto que las interrupciones se daban por medio de
pulsadores, se tuvo que crear un tiempo de retardo de aproximadamente 50us dentro de
la interrupción la cual se comportaba como un anti rebote.
 Esta práctica también requería un cierto nivel de lógica para el proceso que se tenía que
seguir para todo movimiento de la figura, por lo que se reforzó aún más los temas vistos
anteriormente.