Universidad de Guadalajara Centro Universitario de Ciencias Exactas e Ingenierías
1
INDICE Introducción
Antecedentes Alcance Descripcion Microcontrolador Microcontrolador AT89S52 AT89S52 P ush butt buttons Planeacion Diagrama Diseño/Implementacion Conclusiones Manual de usuario Manual de captacion Apendices
2
PAGINA 3 3 4 4 4 5 6 8 9 11 12 14 17
INTRODUCCIÓN El juego de la serpiente es un proyecto previamente realizado, lo que se pretende con esto es documentarlo para futuras referencias y así facilitar que en determinado caso o momento que alguien quiera retomar nuevamente este proyecto tenga todo lo necesario para entender desde el funcionamiento del juego a nivel de programador, que conozca sus partes y componentes mas básicos y su funcionamiento, que se familiarice con el código y en caso de que así se requiera de su modificación pero todo de una manera mucho mas sencilla, facilitando mucho esta tarea que de otro modo seria tediosa y habría de requerir de mucho tiempo y dedicación tanto para lograr “descifrar” el código como el funcionamiento de cada parte de los componentes que se utilizaron para este proyecto.
ANTECEDENTES Se decidió realizar este videojuego como una manera de demostrar lo que se puede desarrollar a partir de un microcontrolador (en este este caso el ATME ATMELL 89S52), ser una referencia para futuros estudiantes o personas con interés en los microcontroladores vean algunas de las alternativas que tienen para trabajar con sus micros. El lenguaje de programación que decidimos utilizar para este videojuego es ‘C’, optamos por él porque es un lenguaje de programación muy reconocido y popular para la programación de sistemas al igual que para aplicaciones, además de que es un lenguaje que se nos facilita su entendimiento y con el que se pueden lograr grandes cosas sabiéndole sacar provecho. En cuanto al medio físico o interfaz gráfica que se utilizo fue una matriz de diodos leds, también conocidas como “cartel de leds” o “publik” ya que son muy utilizadas para anuncios publicitarios y por lo mismo que son un algo llamativas decidimos darle un toque diferente al juego de la culebrita, dejando un poco de lado la típica forma de jugarlo generalmente a partir de display LCD, que además de ser una nueva forma de mostrar el juego se implementación de la cual hablaremos más adelante es si no fácil, bastante sencilla.
3
ALCANCE Básicamente es poder jugar el clásico juego de la “serpiente” usando una interfaz gráfica (matriz de LEDs) por medio de botones (push-buttons). Con este videojuego pretendemos mostrar a través de esta aplicación (videojuego) una de tantas posibilidades que tienen los estudiantes, amateurs y personas interesadas en los microcontroladores para desarrollar distintos usos que pueden hacer con la programación en C para estos microcontroladores.
DESCRIPCIÓN Se trata de imitar el funcionamiento del popular juego de la culebrita (snake) donde simularemos una serpiente que tiene que ir recolectando comida y devorándola para hacerse más grande, es decir cada que vaya devorando algo su tamaño ira incrementando y a la vez que va comiendo se deberá evitar que se estrelle contra las paredes o incluso con su propio cuerpo ya que esto daría por finalizado el juego y habría que empezar de cero nuevamente, el nivel de dificultad dependerá de loa grande que llegue a crecer la culebrita, entre más grande sea, más difícil será manipularla y darle dirección ya que la comida aparecerá en un determinado punto aleatorio dentro de la matriz de leds. En cuanto a la manipulación de los movimientos será algo sencillo ya que solo podrá hacer movimientos en forma vertical u horizontal dentro de la matriz de leds y dichos movimientos estarán controlados por los botones de dirección es decir, al presionar uno de los botones esta cambiara de dirección dependiendo el botón que se haya presionado. En cuanto a los demás componentes físicos (Hardware) lo describiremos a continuación:
MICROCONTROLADOR AT89S52 El microcontrolador AT89S52 es desarrollado y manufacturado por Atmel y es un microcontrolador de alto rendimiento CMOS 8-bits de bajo consumo con 8 Kbytes de memoria flash, está fabricado con alta densidad de memoria no volátil y de tecnología basada en la arquitectura estándar 8051, el cual esta programado con las funciones necesarias para poder almacenar los datos obtenidos por interrupciones que el usuario manipula de acuerdo a las reglas del juego simulado. 4
Las instrucciones aritméticas de estos microcontroladores son básicas, permite sumar, restar, incrementar, decrementar y excepcionalmente se ha integrado el producto y la división de números enteros
Estas son las instrucciones Aritmeticas:
PUSH BUTTONS Los push buttons como su nombre lo refiere son botones de pulso que bloquean o abren el paso de la corriente que en este caso funciona como una señal enviada a la matriz de leds provocando que se apaguen o enciendan los leds simulando que la serpiente va avanzando, moviéndose e incluso aumentando su tamaño.
5
Decidimos utilizar push buttons porque es la manera más práctica de jugar un video juego mediante el envió se señales o impulsos eléctricos que contralan en este caso la dirección o el movimiento de la culebrita, que además es la forma más común de hacerlo, todos los mandos de los videojuegos funcionan bajo este mecanismo, por lo que es algo muy familiar para el usuario.
PLANEACIÓN Mes Mes Etapas Recopilación de información del microcontrolador AT89S52 Presentación de la propuesta Construcción del ”sistem sis tema a mí mínimo” nimo” Programación del videojuego en lenguaje C Pruebas para el videojuego en simulador asistido por computadora Programación en el microcontrolador Integración de las interfaces interfaces al ””sis sistem tema a mínimo” Pruebas finales Documentación
I
II
III
IV
V
Para lograr esto primero tuvimos que simularlo antes de llevarlo acabo, para esto utilizamos ISIS (Intelligent Schematic Input System) Professional P roteus un programa programa m muy uy útil útil para el diseño diseño y simulación de circuitos en el que se creó el diagrama de las conexiones de todos los componentes para así corregir errores que se fueron presentando durante el desarrollo. Otro detalle que nos ayudó mucho de ISIS Professional Proteus es que el programa nos permites simular el sentido de las corrientes además de el de disponer de varios niveles de luz para sus indicadores, es decir ofrece varios tipos de iluminaciones distintas para leds, con esto se puede comprobar la intensidad del voltaje que se iba a requerir para el juego, se pueden agregar resistencias en la simulación para ver la intensidad de
6
iluminación de los leds mismas que después quitamos al conseguir el nivel de voltaje adecuado. Dentro del diagrama conectamos conforme a la hoja de datos del AT89S52 (la cual se incluye al final del documento), también se utilizaron dos circuitos 74LS373 que es un buffer tri-estados que además funciona como un latch octal. El latch y el buffer son controlados independientemente por el Latch Enable (LE) y el Output Enable (OE), la ventaja de usar un latch octal es que contiene 8 latches en el paquete. Se decidió por este tipo de buffers por su buen funcionamiento y ya que es muy eficiente para el propósito de nuestro juego, cuando el buffer no es habilitado permanece en alta impedancia, por lo tanto disminuye la carga en el bus. Para el nuestro juego utilizamos los pines del 21 al 39 del microcontrolador AT89S52 para las conexiones que van de la matriz de leds a los buffers y de los buffers al micro y utilizamos los pines del 10 al 15 para los push buttons que como se explica anteriormente serán nuestro mando o control del videojuego, en este cuatro necesitamos seis push buttons dos de los cuales se utilizan como start y pause y los otros cuatro para dirección (arriba, abajo, izquierda y derecha). A continuación se muestra el diagrama esquemático con todas las conexiones que utilizamos para el juego para que se pueda asi entender mejor la explicación anterior sobre la configuración de los pines del microcontrolador y los buffers.
7
DIAGRAMA RP1 RESPACK-8
1
2 3 4 5 6 7 8 9
VCC
U2 C1
C2
33p
33p 33p GND
X1
U1 19
12 mhz
18
VCC
9
29 30 31
XTAL1
XTAL2
RST
PSEN ALE EA
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
C3 1u
R1
P1.0/T2 P1.1/T2EX P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
10k
GND
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
89S52 PACKAGE=DIL40
39 38 37 36 35 34 33 32
3 4 7 8 13 14 17 18 1 11
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
2 5 6 9 12 15 16 19
OE LE 74LS373
U3
21 22 23 24 25 26 27 28
3 4 7 8 13 14 17 18
10 11 12 13 14 15 16 17
1 11
1 2 3 4 5 6 7 8
D0 D1 D2 D3 D4 D5 D6 D7
D0 D1 D2 D3 D4 D5 D6 D7
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
2 5 6 9 12 15 16 19
OE LE 74LS373
Arriva
Start
Pause GND
El código del AT89S52 y la hojas de datos de los buffers 74LS373 se anexan al final del documento.
8
DISEÑO/IMPLEMENTACIÓN La herramienta utilizada para la implementación de la interfaz para este proyecto fue Keil μVision3. Donde básicamente la metodología que se usó en el código fue la declaración de constantes y funciones dedicadas a fines independientes de control siendo organizadas y llamadas desde el “main”, dando como resultado el código que mas adelante se describe en los comentarios. En la implementación del hardware requerido para la realización éste proyecto fueron necesarios la utilización de los siguientes componentes que conforman el sistema completo del juego.
9
•
1 Microcontrolador AT89S52
•
1 Matriz de leds de 8x8
•
6 Push button
•
2 Buffers Buffers 74LS645 74LS645E E
•
1 Cristal de 12 Mhz
•
1 Capacitor de 10 microfaradios
•
2 Capacitares de 33 picofaradios
•
2 Resistencias de 10 kOhms
•
1 Fuente de voltaje de 5 Volts
•
Arreglo de resistencias a 470 Ohms
•
Cables para las debidas conexiones
Se adjuntan las imágenes para la visualización de los componentes.
10
CONCLUSIONES La realización de éste proyecto requirió de la investigación acerca de la distribución de terminales de una matriz de leds de 8x8, lo cual de inicio representó un problema para la correcta implementación, sin embargo, como se detalló a manera de diagrama anteriormente fueron definidas, lo cual permitió el control de las conexiones para la funcionalidad del juego. Cabe señalar que la programación que implicó el presente proyecto requirió la lectura del puerto 3 para la entrada de la información o interacción con el jueg juego o pr proveni eniente de del usu usua ario, pa para lo lo cu cual se tuvieron que de definir a man mane era de constantes cada uno de los bits de ese puerto para establecer la correspondencia con los movimientos que representaría en el plano de la matriz de leds. Además del uso de los puertos P0 y P2 para la visualización de la interfaz física (matriz de leds). Básicamente los algoritmos utilizados se basaron en las sentencias for, while, switch case e if anidados. Dando como resultado un código eficiente que cumple con el objetivo del proyecto además de permitir de manera sumamente digerible y visual las ventajas que representa una interfaz robusta como lo es la herramienta usada (Keil μVision 3) y un dispositivo con la practicidad y sencillez que caracterizan al
AT89S52.
INTERFACES INTERFACES DE USUARIO USUARIO Para este proyecto se utiliza una matriz de LED´s de 8 x 8 a modo de interfaz grafica, así como push-buttons (direccionales y control) para manipular la “serpiente”.
Matriz de LED’s de 8 x 8
Botones direccionales: ↑, ↓, ←, →
11
Botones de control: Start, Pause
MANUAL DE DE USUARIO US UARIO Este videojuego es de dirigir la serpiente para ir comiendo alimento (representado con un LED encendido) que aparecerá aleatoriamente por la matriz de LED’s evitando chocar con los bordes de la matriz o con el mismo cuerpo de la serpiente. Antes de usar el videojuego Asegúrese de que esta en un lugar seco para prevenir cualquier corto circuito pues este es un dispositivo eléctrico Conectando el dispositivo Conecte el dispositivo a la toma de corriente eléctrica que deberá ser de 110V c. a. a 60Htz. Distribución de botones y matriz de LED’s
Matriz de LED’s de 8 x 8
Botones direccionales: ↑, ↓, ←, →
12
Botones de control: Start, Pause
Comenzar a jugar Para comenzar a jugar presione el botón “S” Pausar el juego Para pausar el juego presione el botón “P” Usando los botones para direccionar la “serpiente” Para mover la “serpiente” en dirección derecha presione el botón → Para mover la “serpiente” en dirección izquierda presione el botón ← Para mover la “serpiente” en dirección arriba presione el botón ↑ Para mover la “serpiente” en dirección abajo presione el botón ↓ Para comenzar nuevamente Una vez comenzado o terminado el juego puede volver a comenzar el juego presionando el botón “S”
13
Manual de Captación Matri Matri z de LED´ LED´s s v ideojuego si n co nectar
Matr Matriz iz de LEDs con LEDs apagados
Matriz Matriz de LED´s LED´s v ideojuego c onectado La serpiente esta esta en su posic ión in icial en la parte superio r izquierda en en un a posic ión horizontal y un cuerpo con una longitud de dos LEDs LEDs La primer comida (LED) aparece en el centro d e la matriz
Matriz Matriz de LED´s LED´s Dirig iendo la serp iente a la comida
La serpiente serpiente ya a sido dirig ida usando los boto nes para acercarse acercarse a su comi da.
14
Matriz Matriz de LED´s LED´s Dirig iendo la serp iente a la comida
La serpiente ha comi do
Matriz Matriz de LED´s LED´s Dirig iendo la serp iente a la comida
La serpiente ha comi do, ahora ahora la longit ud de su cuerpo de dos paso a ser de tres LEDs
Matri Matri z de LED´s LED´s Chocando con tra un bo rde
La serpiente a choc ado contr a el el bord e inf erior, la serpiente parpadeara para para indicar que colisiono y se tendrá tendrá que comenzar el juego nu evamente evamente
15
Matri Matri z de LED´s LED´s Chocando Chocando c ontr a su pr opio c uerpo
La serpiente serpiente a chocado contra su propio cuerpo , la serpiente parpadeara parpadeara para indicar que colision o y s e tendrá tendrá que comenzar el juego nu evamente evamente
16
APÉNDICES MICROCONTROLADOR Es un circuito integrado programable, capaz de llevar acabo procesos lógicos y ejecutar las órdenes grabadas en su memoria. Estos procesos o acciones son son program programados ados en lenguaje lenguaje ensamblador ensamblador por el usuario, usuario, y son introducidos en este a través de un programador.
Está compuesto de varios bloques funcionales, los cuales cumplen una tarea específica. •
•
•
•
Memoria ROM (Memoria de sólo lectura). Memoria RAM (Memoria de acceso aleatorio). Líneas de entrada/salida (I/O) También llamados puertos. Lógica de control Coordina la interacción entre los demás bloques.
Estas son las funciones especiales de las cuales disponen algunos micros •
•
•
•
•
•
17
Conversores análogo a digital en caso de que se requiera medir señales analógicas como temperatura, voltaje, luminosidad, etc. Temporizad Tem zadores pr program amab ablles (Tim (Time er's) Si se requier ere e medi edir períod íodos de tiempo tiempo entre eventos, eventos, generar tem temporizaciones, porizaciones, salidas con frecuencia específica, etc. Interfaz serial para cuando se necesita establecer comunicación con otro microcontrolador o con un computador. Memoria EEPROM Para desarrollar una aplicación donde los datos no se alteren a pesar de quitar la alimentación, que es un tipo de memoria ROM que se puede programar o borrar eléctricamente sin necesidad de circuitos especiales. salidas PWM (modulación por ancho de pulso) Para quienes requieren el control de motores DC o cargas resistivas, existen microcontroladores que pueden ofrecer varias de ellas. Técniica llam Técn amad ada a de "Int Interrupcion ciones es"" par ara a cuan cuand do una se señ ñal ext exter ern na activa una línea de interrupción, el microcontrolador deja de lado la
tarea que está ejecutando, atiende dicha interrupción, y luego continúa con lo que estaba haciendo.
BUFFER Es un dispositivo que evita el efecto de carga en un circuito. En su forma más sencilla es un amplificador operacional funcionando como seguidor. Por consiguiente el voltaje y la corriente no disminuye en el circuito, ya que éste toma el voltaje de la fuente de alimentación del operacional y no de la señal que se está introduciendo, por lo que si una señal llegara con poca corriente, el circuito seguidor compensaría esa pérdida con la fuente de alimentación del amplificador operacional. LATCH Es un circuito electrónico usado para almacenar información en sistemas lógicos, puede almacenar un bit de información. Los latches son dispositivos biestables asíncronos que no tienen entrada de reloj y cambian el estado de salida solo en respuesta a datos de entrada, mientras que los biestables síncronos, cuando tienen datos de entrada, cambian el estado de salida en respuesta a una entrada de reloj. Los latches a diferencia de los conectores no necesitan una señal de reloj para su funcionamiento. El latch lógico más simple es el RS, donde R y S permanecen en estado 'reset' y 'set'. IMPEDANCIA La impedancia es la propiedad que tiene un componente para limitar el paso de corriente a través de un circuito. Establece la relación entre los valores máximos o los valores eficaces de la tensión y de la corriente. La parte real de la impedancia es la resistencia y su parte imaginaria es la reactancia. El concepto de impedancia generaliza la ley de Ohm en el estudio estudio de circuitos circuitos en corriente corriente alterna alterna (AC). (AC). El término fue acuñado por Oliver Heaviside en 1886.
18
Buffer 74LS373 (Datasheet)
19
20
MICROCONTROLADOR MICROC ONTROLADOR AT89 AT89S52 Configuración
21
de
Pines.
Código (Lenguaje C) #include #define uchar unsigned char
//Definiendo tipos de datos "UNSIGNED CHAR" como "UCHAR"
#define SNAKE 40
//Constante para Longitud máxima de la serpiente
#define TIME 50
//Constante para Tiempo de retardo
#define SPEED 62
//Constante para Velocidad de la viborita
sbit arriva=P3^0;
//Definimos el bit 0 del puerto 3 para direccionar el comando "Arriba"
sbit abajo=P3^3;
//Definimos el bit 3 del puerto 3 para direccionar el comando "Abajo"
sbit derecha=P3^2;
//Definimos el bit 2 del puerto 3 para direccionar el comando "Derecha"
sbit izquierda=P3^1;
//Definimos el bit 1 del puerto 3 para direccionar el comando "Izquierda"
sbit start=P3^4;
//Definimos el bit 4 del puerto 3 para direccionar el comando "Comenzar"
sbit pause=P3^5;
//Definimos el bit 5 del puerto 3 para direccionar el comando "Pausa"
/******************************************* Declaracion de variables globales *******************************************/ uchar x[SNAKE+1];
//Variable para controlar longitud el eje X un arreglo "x" de tamaño 41
uchar y[SNAKE+1];
//Variable para controlar longitud el eje Y, un arreglo "y" de tamaño 41
uchar time,n,i,e;
//Variables usadas como CONTADORES
char addx,addy;
//Variables usadas para controlar el desplazamiento sobre los ejes X e Y
/******************************************* Retardo *******************************************/ void delay(char MS) { while(MS!=0) MS--; } void delay10ms() { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--) ; }
22
//Retardo corto aprox. 10 us
/******************************************* Funcion para checar cuando haya colisiones *******************************************/ bit colision() { bit k; k=0; if(x[1]>8||y[1]>8) k=1;
//Colision contra el "marco"
for(i=2;i
23
//Colision contra su propio cuerpo
/************************** Funcion para checar botones ***************************/ void checaTecla() { if(izquierda==0)
//Cuando se preciona el boton izquierdo
{ delay10ms();
// espera 10us
if(izquierda==0) { addy=0;
// que no se desplace nada en el eje Y if(addx!=1) addx=-1;
else
// si la posision en el eje X es diferene de 1 // entonces mover en "uno" a la izqierda (eje X hacia "menos infinito") // si no
addx=1;
// entonces mover en "uno" a la derecha (eje X hacia "mas infinito")
} } if(derecha==0)
// Cuando se preciona el boton derecho
{ delay10ms();
// espera 10us
if(derecha==0) { addy=0;
// que no se desplace nada en el eje Y if(addx!=-1) addx=1; else addx=-1;
// si la posision en el eje X es diferene de -1 // entonces mover en "uno" a la derecha (eje X hacia "mas infinito") // si no // entonces mover en "uno" a la izquierda (eje X hacia "menos infinito")
} } if(abajo==0)
// Cuando se preciona el boton abajo
{ delay10ms();
// espera 10us
if(abajo==0) { addx=0;
// que no se desplace nada en el eje X if(addy!=-1) addy=1; else addy=-1;
// si la posision en el eje Y es diferene de -1 // entonces mover en "uno" hacia arriva (eje Y hacia "mas infinito") // si no // entonces mover en "uno" a la abajo (eje Y hacia "menos infinito")
} } if(arriva==0)
// Cuando se preciona el boton arriba
{ delay10ms();
// espera 10us
if(arriva==0) { addx=0;
//que no se desplace nada en el eje X if(addy!=1) addy=-1; else addy=1;
} } }
24
// si la posision en el eje Y es diferene de 1 // entonces mover en "uno" hacia abajo (eje Y hacia "menos infinito") // si no // entonces mover en "uno" hacia arriva (eje Y hacia "mas infinito")
/******************************* Muestra la posicion en la matriz *******************************/ uchar mux(uchar temp) { switch(temp) { case 8: return 128;break; case 7: return 64; break; case 6: return 32; break; case 5: return 16; break; case 4: return return 8; break; case 3: return return 4; break; case 2: return return 2; break; case 1: return return 1; break; default: return 0; break; } } /***************** Funcion muestra *****************/ void display(uchar v) { while(v--) { for(i=0;i
} } }
25
P0=255-mux(y[i]);
//Muestra renglón
P2=mux(x[i]);
//Muestra columna
checaTecla();
//Checar teclas
delay(TIME);
//Retardo
/***************** PRINCIPAL *****************/ void main(void) { e=SPEED;
//Inicializacion de la variable e con 62
P0=0xff; P2=0xff;
//Los puertos 0,2 y 3 son puestos a 1's
P3=0xff; while(1) { for(i=3;i
//Inicializacion x[0]=4;y[0]=4;
//Posision del LED que debe comer al principio
n=2;
//Comienza la serpiente
x[1]=1;y[1]=2;
//Genera la serpiente
x[2]=1;y[2]=1;
//Cola
addx=0;addy=1;
while(1) {
//Checa cuando se presiono el booton start (comenzar) if(start==0) { delay10ms(); if(start==0) break; } display(1); }
while(1) { display(e); if(colision())
//Checa si hay colisiones { e=SPEED; break; }
//Checa cuando esta comiendo if((x[0]==x[1]+addx)&&(y[0]==y[1]+addy))
{
n++; if(n==SNAKE) { n=2; e=e-10; for(i=3;i
26
if(pause==0)
//Checa cuando se preciona "Pause"
{ delay10ms(); if(pause==0) { // Esperar hasta que se vuelva a presionar el boton pause while(pause==0) ; while(1) { display(1); if(pause==0) { delay10ms(); if(pause==0) break; } } } } for(i=n;i>1;i--) { x[i]=x[i-1]; y[i]=y[i-1]; } x[1]=x[2]+addx; y[1]=y[2]+addy; } } }
27
Apendice B Ayuda en línea en el enlace:
http://jgonzalez.cz.cc/mas_at89s52.html
28