Proyecto Final de Carrera
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
MEMORIA
Titulación: Enginyeria Tècnica Industrial en Electrònica Industrial AUTOR: Carlos Vidal García. DIRECTOR: José Luís Ramírez Falo. Septiembre / 2005.
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Índice
Índice 1.
Memoria Descriptiva.
4
1.1.
Objeto del Proyecto.
5
1.2.
Antecedentes.
5
1.3.
Posibles Soluciones y Solución Adoptada.
6
1.4.
1.5.
1.3.1.
Elección del Microcontrolador.
6
1.3.2.
Reproducción de Mensajes de Voz.
7
1.3.3. Dispositivo Visualizador
8
1.3.4. Detección de las Piezas.
8
1.3.5. Comunicación con PC.
10
1.3.6. Alimentación.
11
Descripción General del Equipo
11
1.4.1. Diagrama de Bloques
12
1.4.2. Características Básicas.
13
1.4.3. Aspecto General.
13
Descripción General de la Solución Adoptada.
14
1.5.1. Microcontrolador PIC16F877 de Microchip.
14
1.5.1.1. Control de Tiempos con el Microcontrolador.
15
1.5.1.2. Conexión de los Botones al Puerto B
16
1.5.1.3. Etapa de Comunicaciones: Módulo USART
17 18
1.5.2. Tablero Adaptado. 1.5.3. Dispositivos
ISD2560
(Grabación/Reproducción
de
20
Audio). 1.5.4. Módulo LCD de Caracteres de 16x1.
1
24
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Índice
1.5.5. Circuito MAX232 (Comunicación Serie).
25
1.5.6. Alimentación.
26
1.5.6.1. Circuito Detector de Batería Baja.
2.
3.
26
1.6.
Resultados.
28
1.7.
Conclusiones.
29
Memoria de Cálculo.
31
2.1.
Inicialización.
32
2.2.
Programa Principal.
34
2.3.
Rutina de Atención a la Interrupción TMR0.
39
2.4.
Reproducción de Mensajes de Audio.
42
2.5.
Control del Tablero Adaptado.
48
2.6.
Rutinas Auxiliares.
58
Planos.
62
3.1.
Aspecto del Prototipo
L1
3.2.
Conexionado Sensores.
L2
3.3.
Esquema Eléctrico Placa 1.
L3
3.4.
Esquema Eléctrico Placa 2.
L4
3.5.
Aspecto de las Máscaras de C.I.
63
3.5.1. Situación de Componentes Placa 1.
63
3.5.2. Máscara de Cara Componentes Placa 1.
63
3.5.3. Máscara de Cara Soldadura Placa 1.
64
3.5.4. Situación de Componentes Placa 2.
64
3.5.5. Máscara de Cara Componentes Placa 2.
65
3.5.6. Máscara de Cara Soldadura Placa 2.
65
2
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
4.
5.
6.
Índice
Presupuesto.
66
4.1.
Mediciones.
67
4.2.
Cuadro de Precios.
74
4.3.
Aplicación de Precios.
81
4.4.
Resumen del Presupuesto del Prototipo.
88
4.5.
Presupuesto de Puesta en Fabricación.
89
Bibliografía.
95
5.1.
Libros Consultados.
96
5.2.
Páginas Web Consultadas.
96
Anexos.
97
6.1.
Manual de Usuario.
6.2.
Código Fuente para PIC16F877.
6.3.
Código Fuente del Programa Terminal.
98
3
104 190
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
1. MEMORIA DESCRIPTIVA
4
Memoria Descriptiva
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
1. Memoria Descriptiva. 1.1.
Objeto del Proyecto.
El objeto del presente proyecto es diseñar y montar un prototipo de tablero y reloj digital de ajedrez para ciegos. Éste se basará en un sistema digital, controlado por un microcontrolador de ocho bits, que será capaz de gestionar el tiempo en los relojes, así como de controlar las jugadas realizadas en un tablero adaptado. Este prototipo realizará las funciones básicas de un reloj de ajedrez convencional como son la selección de los diferentes modos de funcionamiento y la presentación por pantalla del tiempo restante. Asímismo también podrá controlar la legalidad de las jugadas realizadas en el tablero de juego. A parte de estas funciones, también tendrá que reproducir el tiempo restante para cada jugador y la última jugada realizada en forma de voz por dos auriculares. Para el caso en que se encuentren dos jugadores invidentes la reproducción de mensajes deberá de poder ser simultánea y de distinto contenido por cada uno de los dos auriculares.
1.2.
Antecedentes.
En el ajedrez de competición es esencial el uso de un reloj especial, el llamado reloj de ajedrez. Este reloj sirve para controlar el tiempo de reflexión de los jugadores, limitándolo para impedir una excesiva duración de la partida. Consta de una doble esfera que indica el tiempo de juego que le queda a cada jugador. Todas las jugadas deben realizarse en un periodo de tiempo determinado que no puede sobrepasarse sopena de perder la partida. La competición ajedrecística supone un serio handicap para el jugador invidente que, además de no poder ver las jugadas realizadas sobre el tablero tampoco puede hacer lo propio con el reloj que controla los tiempos de reflexión, para lo cual necesita de la ayuda de instrumentos adaptados a sus necesidades. Existen ya en las competiciones relojes adaptados que comunican el tiempo restante de forma oral. Sin embargo, este avance aún no se ha hecho extensivo al tablero físico para facilitar también la comunicación de las jugadas realizadas y, de paso, controlar la legalidad de las mismas. Normalmente las jugadas deben comunicarse de forma oral, siendo el jugador invidente quien las reproduce en su tablero. Queda claro, pues, el carácter innovador de esta propuesta. En enero del 2002 se presentó en la misma Escola Técnica Superior d’Enginyeria (ETSE) el proyecto Reloj de ajedrez para ciegos, cuyo objetivo era diseñar y construir un prototipo de reloj adaptado para invidentes, superior en prestaciones a los ya existentes y con un menor coste económico. El presente proyecto supone un paso más añadiendo el prototipo del tablero adaptado, el control de las jugadas realizadas, el almacenamiento en memoria de las mismas y la mejora de algunas de las prestaciones del reloj de ajedrez ya mencionado. Del mismo modo, el diseño se ha realizado procurando reducir al mínimo los costes económicos.
5
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
1.3.
Memoria Descriptiva
Posibles Soluciones y Solución Adoptada.
La solución adoptada está basada en un sistema digital con microcontrolador. Los mensajes de audio se almacenan en dos dispositivos ISD. El microcontrolador gestiona la reproducción de estos mensajes a petición del usuario, así como el control de los tiempos de juego que se visualizarán mediante un display. A la vez también controlará las jugadas realizadas en un tablero de juego, dotado expresamente de sensores ópticos para la detección de las piezas. 1.3.1. Elección del Microcontrolador. De entre el extenso listado de fabricantes de microcontroladores podemos destacar: Intel, Motorola, Toshiba, Atmel y Microchip. Existen, por supuesto, otros fabricantes pero estos son los más utilizados. La elección del microcontrolador viene fijada por una serie de condicionantes. De entrada necesitamos un bus de datos de 8 bits por sus prestaciones en cuanto a velocidad de ejecución y tamaño de datos, suficientes para nuestro proyecto. Se trata, además, de un bus extensamente utilizado, por lo que se garantiza su compatibilidad con otros periféricos y una gran variedad de fabricantes de microcontroladores. Un bus más grande implicaría un aumento de precio innecesario, mientras que un bus más pequeño nos reduce los puertos de E/S, las fuentes de interrupción y capacidad de memoria. También necesitamos garantizar una elevada velocidad de ejecución, necesaria para el correcto funcionamiento del reloj, las encuestas al tablero y la gestión de mensajes orales. Por otro lado, la manipulación de diversos periféricos hace necesario disponer de un gran número de puertos de E/S. Por todo ello, de las marcas anteriormente mencionadas, nos decantamos por Microchip. Los llamados microcontroladores PIC ofrecen un gran número de ventajas tecnológicas, son fáciles de utilizar y disponen de una gran documentación técnica. También se ha tenido en cuenta la gran disponibilidad en el mercado de estos dispositivos, así como la posibilidad de utilización en la escuela de un programador para grabar el dispositivo y del software necesario para la generación y depuración del código del programa. Las características generales y comunes de las familias µC de 8 bits de Microchip son: • CPU con núcleo RISC. • Arquitectura Harvard. • 35 instrucciones. • Ejecución de instrucciones en un ciclo (salvo las de salto de programa que son dos ciclos). • Frecuencias máximas de trabajo de hasta 20 MHz (en función de la familia elegida). • 14 bits de tamaño de instrucción. • 8 bits de tamaño de datos.
6
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
• 15 registros de función especial. • Stack de 8 niveles de profundidad. • Modos de direccionamiento directo, indirecto y relativo. • Address Pipeline. • Varias fuentes de interrupción. (en función de la familia escogida). • 1 millón de ciclos de borrado/escritura en EEPROM. • Retención de datos en EEPROM >40 años. • Amplia disponibilidad de pins de I/O (nº en función de la familia). • Power On Reset (POR). • Power por temporización (PWRT). • Temporizador de comienzo por Oscilador (OST). • Temporizador de “perro guardián” o Watchdog (WDT). • Protección de código. • Modo SLEEP para ahorro de energía. • Programación del sistema por puerto serie de dos pines. De las características anteriores se deduce que el sistema gozará de una alta velocidad de ejecución. La arquitectura RISC (juego de instrucciones reducido) nos garantiza una rápida ejecución de las instrucciones. Como necesitamos un elevado número de puertas de E/S escogemos finalmente el PIC16F877. A pesar de que el modelo PIC16F874 es un poco más económico, se diferencia por tener una menor memoria, tanto de código como de datos: 4k y 192 bytes respectivamente, frente a los 8k y 368 bytes de nuestra elección. Como no podemos asegurar, a priori, el tamaño que ocupará el código nos quedamos con el 16F877, sin perjuicio de poder cambiarlo en una posterior puesta en fabricación, si realmente fuera posible. 1.3.2
Reproducción de Mensajes de Voz.
En el presente proyecto se ha optado por utilizar dos dispositivos de grabación y reproducción de voz ISD (Information Storage Device). Estos dispositivos integran toda la electrónica necesaria para la correcta reproducción de los mensajes de audio en un solo chip, siendo necesarios solamente algunos componentes pasivos (resistencias y condensadores) para su correcto funcionamiento. La alternativa al uso de estos circuitos integrados (C.I.) pasa por implementar una circuitería basada en una memoria EEPROM, que almacena los mensajes de forma digital. Son necesarios un amplio número de componentes auxiliares para la reproducción: conversores D/A, filtros, amplificadores, reloj, FPGA, etc. En el proyecto anterior, Reloj de Ajedrez para Ciegos, se optó por esta última opción. El motivo básico es que nuestro sistema debe ser capaz de reproducir dos mensajes de voz de forma simultánea, sin que estos tengan que ser iguales. Las características de las ISD no permiten realizar esto directamente, siendo necesario el uso de dos de estos dispositivos. Esto duplica el coste, de manera que la elección se basó en criterios económicos. Sin embargo, con el paso de los años, el precio de las ISD se ha reducido. Actualmente, una implementación con memoria EEPROM y demás
7
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
componentes viene a costar unos 35,50 €, mientras que el coste de una sola ISD es de unos 18 €. Si usamos dos de estos dispositivos nos situamos en unos 36 €, prácticamente igual, por lo que el criterio de selección pasa ser cualitativo. Los circuitos ISD presentan un fácil uso, grabado y reproducción en un mismo C.I., alta calidad de reproducción, totalmente direccionable para grabar múltiples mensajes y posibilidad de concatenación de mensajes con 100 ms de precisión. Además, su capacidad de integración se transforma en un considerable ahorro de espacio en placa. 1.3.3. Dispositivo Visualizador Aunque las características fundamentales de nuestro prototipo están orientadas al uso por parte de usuarios invidentes, también se prevé su utilización por usuarios sin discapacidad visual. Para mostrar los tiempos de juego se utilizará un visualizador (display) LCD de caracteres. Existen otras opciones a tener en cuenta para esta elección, como son: • •
Display tipo LED de siete segmentos. Display LCD de siete segmentos.
Los display basados en diodos emisores de luz (LED) presentan un consumo mayor que el de los display de cristal líquido (LCD), del orden de 100 veces. Para una posible alimentación mediante pilas sus características de consumo no suponen, pues, una buena elección. Los display LCD de siete segmentos se ajustán mejor a nuestras necesidades de consumo. Sin embargo, es difícil encontrar en el mercado un modelo que presente 16 dígitos a pequeña escala y a un precio razonable. Su uso sería más adecuado para una puesta en fabricación a gran escala, y no para la construcción de un prototipo. Además, para el correcto funcionamiento de estos visualizadores se necesita cierta lógica adicional (decodificadores, puertas de paso, etc.). Las necesidades económicas y de consumo, así como el ahorro de espacio en placa hacen que la elección más adecuada para nuestro prototipo sea un display LCD de caracteres. 1.3.4. Detección de las Piezas. Los tableros de ajedrez adaptados para invidentes tienen algunas características que los diferencian de los tableros normales. Al no poder ver el tablero, los jugadores necesitan palparlo para localizar las piezas. En un tablero normal esto no sería posible por dos motivos: • •
Al no estar las piezas sujetas al tablero, éstas podrían ser derribadas o movidas involuntariamente al intentar tocarlas. No habría forma de distinguir el color de las piezas ni el de las casillas.
8
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
Esto último se soluciona con un ligero relieve de las casillas negras sobre las blancas, que lo hacen inconfundible al tacto. Asimismo, las piezas negras están dotadas de una pequeña cabeza de alfiler metálico en su parte superior para distinguirlas de las blancas. La sujeción de las piezas viene solventada por una pequeña espiga que se situa en la peana (ver figura 1). Si se práctica un agujero en el centro de cada casilla, esta espiga puede introducirse, de manera que la pieza queda fijada al tablero y no puede moverse o ser derribada, si no es expresamente.
PIEZA TABLERO
ESPIGA
Figura 1. Sujeción de las piezas al tablero.
Esta última característica nos permitirá realizar el sensado del tablero. Para poder determinar la situación de las piezas será necesario situar un sensor en cada casilla del tablero. Un tablero de ajedrez contiene 64 casillas, de modo que hay que buscar un sensor económico, fiable y de dimensiones reducidas. La solución adoptada en el presente proyecto pasa por utilizar un sensor óptico (ver figura 2), modelo OPB620. Estos pequeños sensores están dotados de un diodo emisor de luz y un fototransistor NPN, situados en oposición. Cuando alimentamos el diodo, este realiza una emisión que capta el transistor, situándose en zona de conducción. El transistor no podrá captar la emisión si esta no existe o hay un obstáculo en medio que lo impida.
Figura 2. Sensores ópticos.
9
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
Si situamos cada sensor en un agujero del tablero, de forma que se detecte la situación de la espiga (ver figura 3) podremos saber si tenemos una pieza en esa casilla o no. Sencillamente, al alimentar el diodo el transistor entrará en conducción produciéndose un ‘1’ lógico ( no hay pieza ). En caso contrario, la misma espiga interrumpe el paso de luz produciéndose un ‘0’ ( sí hay pieza ).
PIEZA TABLERO
SENSOR
ESPIGA
Figura 3. Situación del sensor en el tablero.
Otra solución podría ser utilizar dos contactos flexibles y esmalte conductor en la base de la peana, situando los cables de forma que se haga contacto al introducirse la pieza en el ajujero. Esta solución, muy económica, es extremadamente poco fiable ya que los cables pueden sufrir desgaste debido a un uso continuado. Los sensores ópticos tienen la ventaja de no sufrir desgaste, ya que no se necesita un contacto físico con la pieza para su detección. Otros sensores como los de contacto o los magnéticos son más costosos y se hace difícil integrarlos en la estructura del tablero. 1.3.5. Comunicación con PC. Mediante sucesivos muestreos del tablero, el microcontrolador será capaz de detectar los cambios en la posición de juego y la legalidad de los mismos. Cuando las jugadas realizadas sean correctas, éstas se almacenarán en memoria, obteniendo, a la postre, el desarrollo completo de la partida. Para que dichas jugadas almacenadas puedan ser consultadas se ha optado por dotar al equipo de un sistema de comunicación con un PC externo. Llegado el momento, el microcontrolador podrá transmitir a un ordenador las jugadas realizadas vía puerto serie (RS232). Para dicha transmisión se utilizará un C.I. MAX232. Este integrado ha sido especialmente creado para este tipo de comunicaciones. Su función básica es la de adapatar los niveles de tensión de nuestro sistema (0...5 V) a los utilizados por un puerto serie estándar (-15...-3 V, 3..15 V). La inclusión de esta función está plenamente justificada. En las partidas de competición, a menudo, surgen discrepancias entre los jugadores por errores en la anotación de las jugadas o similares. En estos casos es necesaria la intervención de un árbitro. Para facilitar esta tarea se podrán volcar las jugadas almacenadas en un ordenador para su consulta. Así se podrá comprobar el curso correcto de la partida.
10
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
1.3.6. Alimentación. Teniendo en cuenta que nuestro sistema necesitará una alimentación continua (DC), de 0 a 5 V podemos optar entre las siguientes soluciones: • • •
Conexión a la red eléctrica via transformador, rectificador, filtros, estabilizador, etc. Uso de baterías recargables. Uso de pilas.
La primera solución es del todo incompatible con las características de portabilidad que necesita nuestro sistema. No en todos los sitios se dispondrá de una conexión eléctrica fácilmente accesible. Las baterías suponen un coste económico imortante y cargarían excesivamente el prototipo por su peso. Por todo esto se opta por la solución más sencilla: alimentación mediante pilas. Teniendo en cuenta que el valor del voltaje de la mayoría de pilas convencionales es múltiplo de 1,5 V, y que nuestro sistema se tiene que alimentar a 5 V, se optará por utilizar una única pila de 9 V con un estabilizador del tipo LM7805 a su salida para asegurar los 5 V requeridos.
1.4. Descripción General del Equipo El equipo está formado por cinco grandes bloques. Algunos uno de estos bloques contienen una serie de etapas o subcircuitos, formando un total siete de etapas: Módulo de control: • •
Interfase con los usuarios: pulsadores y conmutador de partida. Microcontrolador: PIC 16F877.
Módulo de audio: •
Almacenamiento y reproducción de los mensajes de audio: 2 x C.I. ISD2560.
Módulo de visualización: •
Display LCD 16x1 caracteres.
Módulo de tablero: • •
Decodificación de direcciones del microcontrolador: 74HC4514N. Sensado de las casillas: sensores ópticos OPB620.
decodificador
Módulo de comunicación serie: •
Comunicación con PC via puerto serie (RS-232): C.I. MAX232.
11
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
1.4.1. Diagrama de Bloques
PULSADORES
DISPLAY LCD 16X1
MICRO
PIC16F877
DECODIFICADOR ISD2560
SENSORES TABLERO
COMUNICACIÓN SERIE
PC
12
ISD2560
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
1.4.2. Características Básicas. El aparato está diseñado para ser utilizado por dos usuarios en partidas de competición de ajedrez. Estos dos usuarios podrán ajustar las opciones del tipo y tiempo de partida y preparar el reloj para jugar. Asímismo, se podrá conectar el tablero adaptado al reloj, realizándose así el control de las jugadas realizadas. Durante la partida el reloj tendrá que mostrar por un display el tiempo restante y, mientras hace esto, tendrá que reproducir, a petición de cualquiera de los dos usuarios o de los dos a la vez, el tiempo restante de uno u otro jugador o la última jugada realizada en el tablero por el auricular del usuario que ha hecho dicha petición. Aunque no es necesario que el aparato cuente con una gran calidad de sonido los mensajes se oirán de una manera clara e inteligible. Si el tablero está conectado las jugadas realizadas se almacenarán en la memoria del microcontrolador, siendo posible su posterior volcado en un PC externo. Basándonos en esto el prototipo dispone de: • • •
• • • •
Un display LCD 16x1 (16 caracteres, 1 fila). Dos auriculares. Seis pulsadores para los usuarios, con funciones de ajuste de los parámetros de la partida , petición de mensaje de audio o envío de la partida almacenada en memoria a PC externo, dependiendo de si la partida ha empezado o no. Dos pulsadores para poner en marcha un temporizador o el otro. Un interruptor de encendido/apagado. Un tablero especialmente adaptado para poder desarrollar la partida. Dos LED’s: uno para avisar que se ha cometido algun error en las jugadas realizadas y otro para alertar que la batería está baja.
1.4.3. Aspecto General. El prototipo presenta el siguiente aspecto:
CONECTOR AURICULAR
INTERRUPTOR
LED ERROR
LED BATERIA BAJA
PETICION AUDIO JUGADAS
CONECTOR TABLERO
NEXT
SET
UP
MODE
CONECTOR TABLERO
CONECTOR PC (a)
CONMUTADOR PARTIDA
13
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
BOTONES
DISPLAY (b)
Figura 4. Aspecto del reloj de ajedrez para ciegos. (a) Vista superior. (b)Vista frontal.
CONECTOR RELOJ
Figura 5. Aspecto del tablero adaptado.
1.5. Descripción General de la Solución Adoptada. 1.5.1. Microcontrolador PIC16F877 de Microchip. El elemento que controla todo el sistema es un microcontrolador PIC16F877. Este integrado de la familia microchip es un µC de ocho bits que cuenta con una memoria de programa tipo FLASH (8 k x 14 word, word de 14 bits) y una de datos RAM de 368 bytes, ambas internas, así como también una memoria EEPROM de datos interna de 256 bytes. Puede tener hasta 14 fuentes de interrupción, de las cuáles sólo vamos a utilizar una: la que acontece cuando se desborda uno de sus tres timers. También cuenta con cinco puertos de entrada/salida: el puerto A, de 6 bits, los puertos B, C y D, de 8 bits y el puerto E, de sólo 3 bits.
14
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
Los pines de los cinco puertos pueden ser configurados como pines de entrada o de salida, cada uno independientemente de los demás. La configuración de los pines que hemos utilizado para nuestra aplicación es la siguiente: Puerto A (RA [5..0]): •
RA [5] : Salida. Señal de Error. Enciende un led cuando se detecta un movimiento erróneo durante la partida.
•
RA [4,3] : No utilizado
•
RA [2..0] : Salidas. Corresponden a las señales Ent (2), habilitación del tablero adaptado; R/W (1) y RS (0), que sirven para controlar el display.
Puerto B (RB [7..0]): •
RB [7..0] : Entradas. Utilizaremos estas líneas para los 8 pulsadores del reloj.
Puerto C (RC [7..0]): •
RC [6..4,1,0] : Salidas. Por estos pines mandamos la señal Tx (6), que es la encargada de realizar la transmisión de datos hacia el PC externo. Tambien se mandan las señales PD (5,4) y P/R! (1,0) de control de los dos ISD.
•
RC [7,3..2] : Entradas. Por aquí nos llegan las señales EOM! de fin de mensaje de los dos ISD (3,2) y la señal de recepción Rx (7), que forma parte del módulo de comunicaciones.
Puerto D (RD [7..0]): •
RD [7..0] : Salidas. Estos 8 pines se utilizan como bus de datos de 8 bits para el display, los ISD y el tablero. Para el caso del tablero los 4 bits de más peso serán entradas, y salidas los 4 restantes.
Puerto E (RE [2..0]): •
1.5.1.1.
RE [2..0] : Salidas. Corresponden a las señales de habilitación del los dos ISD (2,1) y del display (0). Control de Tiempos con el Mmicrocontrolador.
Como ya hemos apuntado sólo utilizaremos una fuente de interrupción: la que acontece cuando se desborda el Timer0, que nos servirá para controlar el tiempo de juego. El Timer es un contador de 8 bits (0-255) que disminuye su cuenta en 1 unidad cada 8 ciclos de instrucción. Cada instrucción tarda en ejecutarse 4 ciclos de reloj. De
15
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
este modo, si cargamos el Timer 0 con el valor máximo (255) y conectamos al microcontrolador un reloj de 4 MHz: 4 µs = 1µs ⋅ 256 = 256 µs (1) 4 ciclos reloj Por otro lado, los registros del microcontrolador nos permiten seleccionar distintos preescalados para el Timer0. El preescalado mínimo es 1:2. Nos queda:
256µs ⋅ 2 = 512 µs (2) Nuestro Timer tardará 512 microsegundos en desbordarse e interrumpir al microcontrolador. En el ajedrez de competición el tiempo de reflexión se muestra segundo a segundo. Para un correcto control del tiempo de juego será suficiente con mostrar segundo a segundo. De este modo, cada vez que salte una interrupción ejecutaremos un código que se encargue de decrementar un contador. Cuando este contador se desborde habrá pasado 1 segundo de tiempo. El valor a cargar en nuestro contador será: x ⋅ 512µs = 1000000 µs ⇒ x = 1953.13 (3) Los registros de memoria del microcontrolador almacenan datos de 8 bits. Como sólo podemos almacenar un valor máximo de 255, tendremos que dividir el valor anterior en dos registros. Esos dos valores pueden ser 217·9 = 1953. Este valor no es exactamente el que hemos calculado anteriormente. Aún así, la precisión de nuestro reloj prácticamente no se verá afectada: 1953 ⋅ 512 µs = 0.999936s (4) Esto nos da una precisión de: Precisión = (1 − 0.999936) ⋅ 100 = 0.0064% (5) En una partida de 2 horas, el error cometido sería de: Error = 7200s ⋅ 0.0064% = 0.46 s (6)
Se trata de un error perfectamente admisible para nuestra aplicación. 1.5.1.2.
Conexión de los Botones al Puerto B
Los seis botones de usuario, así como el conmutador de partida, van conectados a los patas [0..7] del puerto B. Este puerto cuenta con una resistencia de pull-up en cada una de sus patas. Así que para distinguir si un botón está o no pulsado basta con conectarlo tal y como se puede ver en la siguiente figura.
16
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
Figura 6. Conexión de un botón al puerto B del PIC.
De este modo, podremos saber si un botón está pulsado al detectar un 0 en la correspondiente pata del puerto B del PIC. 1.5.1.3.
Etapa de Comunicaciones: Módulo USART
Los microcontroladores PIC16F87x contienen un módulo de comunicaciones serie de tipo síncrono y asíncrono: éste es el módulo USART (Universal Synchronous Asynchronous Receiver Transmitter). El USART puede funcionar como un sistema de comunicación bidireccional asíncrono, adáptandose a multitud de periféricos y dispositivos que transfieren información de esta forma. Dadas nuestras necesidades de comunicar el microcontrolador con un PC externo, éste módulo nos será útil para realizar esta labor. La transferencia se realiza mediante las señales: Tx (transmisión) y Rx (recepción). Dichas señales se encuentran en las líneas RC6 y RC7 del microcontrolador, respectivamente. En el protocolo de comunicación serie cada palabra de información o dato se envía independientemente de los demás. Las palabras suelen constar de 8 ó 9 bits y van precedidas por un bit de START y se finalizan con un bit de STOP (ver figura ). Los bits se transfieren a una frecuencia fija y normalizada.
17
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
Figura 7. Palabra de 8 bits.
La velocidad de transmisión en baudios (bits por segundo) a la que se realiza la transferencia debe ser un valor normalizado. En nuestro caso utilizaremos una velocidad de 9600 baudios. Para generarla, el USART dispone de un generador de frecuencia en baudios, el BRG. Su valor es controlado por el contenido grabado en el registro SPBRG. Para transmitir un dato tenemos que depositarlo por software en el registro TXREG. A continuación se traspasa al registro TSR, que va sacando los bits secuencialmentea y a la frecuencia establecida. Él mismo también se encarga de poner los bits de START y STOP al inicio y al final del byte a transferir. El primer bit que sale es el de menos peso. La transferencia empieza en cuanto se haya transmitido el bit de STOP del dato anterior. 1.5.2. Tablero Adaptado.
Como hemos comentado anteriormente utilizaremos sensores ópticos OPB620 para la detección de las piezas. Estos sensores están formados por un diodo emisor de luz y un fototransistor tipo NPN (ver figura 9). Cuando se alimenta el diodo, éste emite luz directamente hacia el transistor. Si el transistor recibe correctamente la emisión, entrará en conducción, abriendo el camino hacia masa.
Figura 8. polarizacion del sensor OPB620
18
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
Para determinar si existe o no una pieza situada en la casilla sólo nos interesan dos estados de trabajo del transistor: no conducción (casilla ocupada, Vout = 5 V) y conducción (casilla libre, Vout = 0 V). La elección de las resistencias de polarización debe permitirnos, por un lado, la emisión de suficiente luz en el diodo para que el transistor entre en conducción, y por otro, limitar la corriente en R2 para evitar un consumo excesivo. Con los ensayos en laboratorio hemos podido determinar que los valores que más se ajustan a estas condiciones son R1 = 2.2kΩ y R2 = 220kΩ (conducción Vout = 5 V , I = 6 mA ; no conduccción Vout = 0, I = 0 mA). El siguiente paso es ver como interconectar el conjunto de 64 sensores y como conectarlos al microcontrolador. La forma más fácil de solventar el problema es tratar el tablero como lo haríamos con una matriz 8x8 (ver figura ). DECODIFICADOR 3:8
TABLERO (matriz 8x8)
SELECCIÓN
O0 O1 A0
O2
A1
O3
A2
O4 O5
E
O6 O7
8 LINEAS DE INFORMACIÓN
Figura 9. tratamiento del tablero, solución 1.
El microcontrolador envía al decodificador sucesivamente las direcciones de acceso. Esto supone alimentar una fila de 8 sensores cada vez. Cuando esto sucede se obtiene la respuesta de los fototransistores en forma de 1 byte. De esta forma bastaría con realizar 8 encuestas, una por cada fila, y almacenar los 8 bytes de respuesta leidos por el microcontrolador. El inconveniente de esta solución es el elevado número de líneas necesarias para su implementación. Se tendría que utilizar 3 lineas para la decodificación, 8 para la lectura y una para el ‘enable’ del decodificador, haciendo un total de 12. Esto son demasiadas lineas, sobretodo si tenemos en cuenta que nuestro microcontrolador tiene un número de puertos E/S limitado y también hay que controlar otros dispositivos. Por todo ello se ha optado por reordenar la matriz de sensores 8x8 por una 16x4 y utilizar un decodificador de 4 bits (ver figura 11).
19
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos DECODIFICADOR 4:16
Memoria Descriptiva
TABLERO (matriz 16x4)
O0 O1 O2 O3 SELECCIÓN
O4 A0
O5
A1
O6
A2
O7
A3
O8 O9
E
O 10 O 11 O 12 O 13 O 14 O 15
4 LINEAS DE INFORMACIÓN
Figura 10. tratamiento del tablero, solución 2.
Así sólo son necesarias 9 líneas: 4 de decodificación, 4 de lectura y 1 enable. Las 8 lineas de decodificación y lectura se pueden compartir con otros dispositivos (ver apartado 1.5.1.). Los inconvenientes de esta solución no son muy grandes. Existen en el mercado decodificadores como el que necesitamos y el incremento de coste es mínimo. Habrá que realizar 16 encuestas para poder muestrear todo el tablero (el doble que antes), pero la velocidad de trabajo del microcontrolacor hace que esto no sea un problema. El formato de la respuesta del tablero (4 bits de lectura cada vez) nos obligará a complicar un poco el software, pero se puede realizar perfectamente. Por todo esto hemos optado por la segunda solución, como más adecuada a nuestros propósitos de economía. 1.5.3. Dispositivos ISD2560 (Grabación/Reproducción de Audio).
Se trata de una memoria ISD de la marca Winbond. En la figura podemos ver el diagrama bloques del ISD2560; en el mismo se aprecia que contiene toda la electrónica requerida para grabar y reproducir sonido.
Figura 11. Diagrama de bloques del ISD2560.
20
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
El dispositivo CMOS incluye oscilador interno, preamplificador de micrófono, control automático de ganancia, filtros para el mejoramiento de la señal (antialiasing,..etc), amplificador para altavoz y una matriz de alta densidad para el almacenamiento multinivel. Así mismo, también resulta idóneo para su funcionamiento gobernado bajo microcontrolador, permitiendo alcanzar complejos direccionamientos y mensajes. Las muestras se almacenan en una memoria no volátil de 480 Kb multinivel, la cual permite una grabación máxima, haciendo un muestreo a 8KHz, de 60 segundos. Es interesante señalar que los datos no se almacenan en sistema digital binario, sino con uno de 256 niveles diferentes en cada célula de memoria. Esto nos da una densidad de almacenamiento considerablemente mayor que la que es posible alcanzar con tecnología digital binaria y una alta calidad de grabación. Las entradas A0-A9 se utilizan para direccionar la memoria y determinar que mensaje vamos a reproducir. Tambien podemos determinar si vamos a reproducir o a grabar un mensaje (P/R), habilitar el dispositivo (CE!), detectar el fin de la reproducción de un mensaje (EOM!) y poner el dispositivo en modo de bajo consumo (PD). El conexionado del dispositivo que utilizamos es el recomendado por el fabricante y se puede consultar en su manual (ver apartado 5). Para poder reproducir los mensajes de tiempo restante se han grabado todos los números del 1 al 20 y los números 30, 40 y 50. Para poder enlazar varios mensajes y formar la hora completa también se han grabado los mensajes “veinti”, “treinta y”, “cuarenta y”, “cincuenta y”, así como las unidades temporales horas, minutos y segundos. De esta manera podemos formar todos las horas posibles por composición de varios mensajes. Por ejemplo, para reproducir oralmente 52 minutos se enlazan los mensajes “cincuenta y”, “dos”, “minutos”. Para la reproducción oral de las jugadas se ha utilizado el sistema algebraico extendido. Dicho sistema se basa en la definición de un sistema de coordenadas que podemos ver en la figura 14. Su principal ventaja radica en que, además de ser fácil de aprender, es uno de los más utilizados.
Figura 12. Sistema de coordenadas algebraico.
21
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
La jugada completa se define reproduciendo la pieza a mover, la coordenada de origen (letra y número) y la coordenada de destino. Por ejemplo, en la posición de la figura , si las blancas movieran su caballo g1 a la casilla f3 la jugada reproducida sería “caballo g1-f3”. El avance del peón e2 dos casillas correspondería a “peón e2-e4”. Para poder realizar la reproducción oral sólo será necesario grabar los mensajes correspondientes a las letras (de la “a” a la “h”), ya que los números los tenemos de antes, y las piezas “peón”, “torre”, “caballo”, “ alfil”, “dama” y “rey”. También se ha considerado conveniente grabar el mensaje “jugada ilegal”, para aquellas situaciones en las que un jugador realice un movimiento no permitido.
DIRECCIONAMIENTO ISD2560 MENSAJE Un Dos Tres Cuatro Cinco Seis Siete Ocho Nueve Diez Once Doce Trece Catorce Quince Dieciseis Diecisiete Dieciocho Diecinueve Veinte Treinta Cuarenta Cincuenta Veinti Treinta y Cuarenta y Cincuenta y Una Hora Horas Minuto Minutos Segundos
A9-A0 0000000000 0000001010 0000010100 0000011110 0000101000 0000110010 0000111100 0001000110 0001010000 0001011010 0001100100 0001101110 0001111000 0010000010 0010001100 0010010110 0010100000 0010101010 0010110100 0010111110 0011001000 0011010010 0011011100 0011100110 0011110000 0011111010 0100000100 0100001110 0100011000 0100100010 0100101100 0100110110 0101000000 22
DIRECCION DECIMAL 0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
A B C D E F G H Torre Caballo Alfil Dama Rey Jugada Ilegal Uno Enroque
0101001010 0101010000 0101010110 0101011100 0101100010 0101101000 0101101110 0101110100 0101111010 0110000110 0110010010 0110011110 0110101010 0110110110 0111001010 0111010100
Memoria Descriptiva
330 336 342 348 354 360 366 372 378 390 402 414 426 438 458 468
Tabla 1. Direcciones de los mensajes almacenados en las ISD2560.
Se observará que los bits A9 y A0 están siempre a nivel 0. Esto es debido a que para direccionar todos los mensajes sólo son necesarias ocho líneas. El direccionamiento completo (utilizando las diez líneas) de los dispositivos ISD nos da una resolución de 0.1 segundos. Sin embargo, para nuestra aplicación no es necesaria tal resolución; nos basta con una de 0.2 segundos (como puede observarse en la tabla, todas las direcciones de inicio son números pares). Podemos obtener dicha resolución utilizando las líneas A1-A9, y dejando A0 conectada a masa. Por otro lado, el bit A9 sólo se utiliza para direccionamientos a partir de los 52.1 segundos de grabación. Puesto que no hemos alcanzado dicho valor, también conectamos esta línea a masa, quedando conectadas al microcontrolador A1-A8. Una vez hecho esto, sólo se tendrá que respetar la secuencia de comandos para realizar la reproducción de los mensajes. En la siguiente figura podemos ver el diagrama temporal de dicha secuencia.
Figura 13. Secuencia de comandos para reproducción en un ISD2560.
23
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
Siguiendo esta secuencia y teniendo en cuenta los tiempos mínimos se consigue enlazar y reproducir correctamente los mensajes orales grabados en las ISD. 1.5.4. Módulo LCD de Caracteres de 16x1.
Se trata de un módulo LCD (cristal líquido) de 16 caracteres por 1 línea compatible con la familia Hitachi LM016L. A continuación podemos ver el diagrama de bloques del display y la función de cada uno de sus pines.
Figura 14. Diagrama de bloques del display.
Tabla 2. Significado de los pines del display.
Si nos fijamos en el pin 6 podemos observar que se trata de una señal de habilitación del módulo. Dicha señal no desconecta el display de la alimentación; simplemente hace caso omiso de todo lo que hay en el bus de datos. De esta forma se pueden compartir las lineas del bus de datos del display con las de otros módulos. En nuestro caso dichas líneas se comparten con los dispositivos ISD y el tablero adaptado (ver apartado 1.5.1.). Otros pines de interés son los que corresponden a las señales RS y R/W. La primera se refiere al contenido de lo que pasamos por el bus de datos. Si su valor es 1 se trata de un dato, mientras que si su valor es 0 se trata de una instrucción. La señal R/W identifica si la operación a realizar es de lectura (1) o de escritura (0). Para nuestra aplicación esta señal estará siempre a 0.
24
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
Por todo esto lo que se hará es mantener la señal de habilitación a 0 mientras no se quiera operar con el display. Cuando sea necesario hacerlo se pondrá el correspondiente valor en el puerto D (bus de datos del LCD), se seleccionará el valor de la señal RS (según sean datos o instrucciones) y seguidamente se pondrá la señal de enable a 1. Si se trata de instrucciones habrá que respetar un tiempo de ejecución antes de quitar la señal de habilitación. En nuestro diseño las características utilizadas son: • • •
Bus de datos de ocho bits. Matriz para el carácter de 5x10 puntos. Autoincremento de la posición del cursor.
Cada vez que tengamos que actualizar un dígito del reloj se borrará la pantalla y a continuación se volverán a escribir todos los caracteres necesarios. Debido a la velocidad de ejecución del programa en el microcontrolador apenas se apreciarán parpadeos. 1.5.5. Circuito MAX232 (Comunicación Serie).
Para podernos comunicar con el PC externo utilizaremos la norma RS-232, que es una de las más extendidas. Una de sus características es la de los rangos de tensión que utiliza para representar los niveles lógicos. El nivel alto se representa con una tensión comprendida entre –3 y –15 V, mientras que el nivel bajo utiliza el rango de +3 a +15 V. Dado que nuestro sistema, y en particular el microcontrolador, trabaja a niveles de tensión comprendidos entre 0 y 5 V se hace necesaria la inclusión de una etapa para adaptarse a la norma. Ésto se consigue mediante la utilización de un circuito integrado MAX232. En la siguiente figura podemos ver cómo conectarlo para conseguir nuestros propósitos.
Figura 15. Conexión del C. I. MAX232 a un conector DB25 estándar.
Como podemos observar, el MAX232 dispone de dos canales de entrada para niveles TTL, que son el T1IN y el T2IN, con sus correspondientes salidas: T1OUT y T2OUT. También posee dos canales de entrada para niveles RS-232 R1IN y R2IN y sus correspondientes salidas, R1OUT y R2OUT. Se alimenta con +5 V.
25
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
Para nuestra aplicación sólo será necesario el uso de un canal. El microcontrolador transmite información a través de la linea T1IN, a nivel TTL, y T1OUT, a nivel RS-232. Del mismo modo, el PC puede comunicarse con el microcontrolador por las lineas R1IN y R1OUT. 1.5.6. Alimentación.
El sistema de alimentación de nuestro circuito está formado por un conjunto de pila de 9 V y un regulador de tensión del tipo LM7805. La utilización de este tipo de regulador supone una serie de ventajas, como son: • • • • • •
Protección contra cortocircuitos Protección contra sobrecargas Regulación de linea del orden de 3 mV. Regulación de carga del orden de 10 mV. Corriente de reposo máxima de 8 mA. Resistencia de salida de 8mA.
Como se puede apreciar en la figura se trata de un dispositivo de tres terminales. Uno es el de entrada de la tensión no regulada, otro es el de salida y el tercero es un terminal común a la entrada y a la salida que suele estar conectado a tierra. Nuestro regulador se encargará de estabilizar la tensión a su salida a un valor de 5 V. Para ello la tensión de entrada debe estar comprendida entre los 7 y los 20 V. Asímismo requerirá una tensión de entrada mínima de 7.5 V para asegurar una regulación de línea de 3 mV. Al utilizar una pila de 9 V en la entrada se asegura la alimentación de 5 V a la salida del regulador. El fabricante recomienda situar a la entrada y a la salida del regulador un condensador para eliminar posibles rizados y ruidos de alta frecuencia. De este modo la etapa de alimentación nos queda de esta forma:
Figura 16. Fuente de alimentación.
1.5.6.1. Circuito Detector de Batería Baja.
En el diseño de nuestro prototipo se ha considerado conveniente implementar este pequeño circuito detector de batería baja, que nos permitirá detectar cuándo la pila se está agotando. 26
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
Figura 17. Circuito detector de batería baja.
Se trata de un comparador con histéresis, que compara una tensión de referencia (Vref) de 4.7 V, mantenida mediante un diodo Zener polarizado inversamente, con la tensión de salida del regulador de tensión (LM7805). Como hemos mencionado anteriormente, este regulador permite una tensión de entrada comprendida entre los 7 y los 20 V. Cuando esta situación se cumple, la tensión teórica en su pata de salida es de 5 V (puede oscilar entre los 4.75 V y los 5.25 V : Regulación de línea). Cuando la tensión a la salida del integrado LM7805 es inferior a 4.7 V, es que la tensión de la pila de 9 V es inferior a 7 V. En esta situación, el amplificador operacional se saturará, poniendo su salida a estado lógico 1 (aprox. 5V). La función de transferencia del circuito es la que se muestra en la Figura
Figura 18. Función de transferencia del circuito detector de batería baja.
Analizando el circuito se deducen las siguientes ecuaciones: VL = Vref
R2 R1 + R 2
VH = Vref
R1 R2 + Vref R1 + R 2 R1 + R 2
27
(7)
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
De donde se obtienen los valores para nuestro circuito: 19 = 4.465 V 1 + 19 (8) 1 19 VH = 4.7 + 4.7 = 4.7 V 1 + 19 1 + 19 VL = 4.7
Situaremos un LED a la salida del circuito que se encenderá cuando se la tensión suministrada disminuya por debajo del límite. El objetivo es dar aviso al árbitro de la competición de esta incidencia.
1.6. Resultados. Una vez montado el prototipo y puesto totalmente en marcha los resultados obtenidos son los siguientes: Reloj de ajedrez completamente funcional con conmutación de tiempos y posibilidad de parada en cualquier momento de la partida. Selección de siete modos de funcionamiento que incluyen modos de tiempo usados en competición oficial. Resolución de 0.5 ms (512 µs). Se muestra por pantalla información con los tiempos de cada jugador (horas.minutos o minutos.segundos) así como el reloj que corre en cada momento. El módulo de audio es capaz de reproducir todos los tiempos posibles del reloj. Los mensajes orales son claramente inteligibles. Posibilidad de reproducción simultánea por dos auriculares con mensajes de distinto contenido. Modo automático cuando queda menos de 1 minuto para alguno de los jugadores: se reproducen mensajes temporales sin necesidad de pulsar el botón correspondiente. Reproducción de todas las jugadas legales realizadas en el tablero en el formato pieza.coordenada origen.coordenada destino. Control del volumen por medio de potenciómetro. Reproduce el mensaje “jugada ilegal” cuando la jugada realizada en el tablero es incorrecta. El tablero sensorial reconoce todas las jugadas legales posibles excepto la captura al paso y la coronación a pieza distinta de la dama. Se realizan dos encuestas cada segundo. La jugadas correctas se almacenan en memoria RAM del microcontrolador. El espacio reservado para ello es de 192 bytes. Cada jugada completa ocupa 4 bytes (2 bytes semijugada), por lo que la memoria es capaz de almacenar 48 jugadas (96 semijugadas). Cuando se deteca un error en el tablero se enciende un LED de aviso en el reloj, apagándose el mismo al salir del error. Las jugadas almacenadas en memoria se pueden transmitir a PC externo via conexión a puerto serie COM1 utilizando un cable con conectores DB9. Se realiza a una velocidad de 9600 baud/s. Para la transmisión es necesario instalar en el PC el programa Terminal, creado expresamente para esta aplicación. La transferencia se ha probado en ordenador con sistema operativo Windows 98. El mismo programa, una vez recibida la información, genera un archivo PGN con el listado de las jugadas que se han realizado durante la partida. La anotación de las mismas se realiza en sistema algebraico extendido.
28
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
1.7.
Memoria Descriptiva
Conclusiones.
A la vista de los resultados podemos concluir que, en general, se han alcanzado los objetivos propuestos. El prototipo realiza correctamente las funciones de reloj de ajedrez para ciegos y gestión de un tablero adaptado, así como algunas tareas adicionales como el almacenamiento de jugadas en memoria y su transferencia a PC. No obstante, todo se puede mejorar. El reloj de ajedrez cuenta con una resolución más que suficiente para el uso al que está destinado. No sufre retrasos importantes (ver apartado 1.5.1.1.). La información que muestra por pantalla cubre las necesidades del jugador durante la partida. Los modos de tiempo que tiene implementados son los más utilizados en competición oficial e incluso en partidas amistosas a nivel de club. Por todo ello consideramos que el reloj de ajedrez implementado es apto para los usos antes mencionados. Aún así, podrían introducirsele algunas mejoras interesantes, como aumentar el número de modos de funcionamiento, implementar configuración manual del tiempo, aumentar la información mostrada por pantalla o contar las jugadas realizadas por cada jugador (esto último muy interesante en las partidas con caída de bandera). De cara a una posible puesta en venta habría que plantearse seriamente la posibilidad de cambiar el display LCD por uno de siete segmentos. Para un prototipo el display LCD es lo ideal, pero tal vez (esto ya dependería además de los proveedores) podría salir más a cuenta rediseñar el sistema para un display menos práctico pero posiblemente más económico para grandes tiradas. Los mensajes orales reproducidos tienen una calidad aceptable puesto que son claramente inteligibles y eso es suficiente para su uso. Se aprecia en la reproducción una pequeña pausa entre mensajes. Esto es debido a que las encuestas del tablero introducen un pequeño retardo, de unos 160ms cada encuesta. Esta pausa no supone un grave problema, aunque podría mejorarse en futuras versiones. Una opción interesante sería implementar una reproducción multilingüe. Se trataría de aumentar (prácticamente doblar) la capacidad de almacenamiento de los ISD y programar el dispositivo para poder escoger el idioma de locución deseado. Otro aspecto mejorable es la regulación de volumen, implementada en este proyecto con un simple potenciómetro. La gestión del tablero es correcta, se identifican todos los cambios y la mayoría de las jugadas legales. Los sensores empleados se adaptan perfectamente a las características del tablero. El número de encuestas es, en principio, suficiente. Dadas las características físicas del tablero (piezas ensambladas con una espiga en la base) se hace difícil que en algun caso puedan realizarse más de dos jugadas por segundo. Podría mejorarse, lógicamente, el código examinando las únicas jugadas que no se han implementado: captura al paso del peón y coronación a pieza distinta de dama. No obstante, se trata de jugadas más bien extrañas en la práctica y el sistema es capaz de controlar un gran número de partidas sin contradecir el reglamento. Otra posibilidad interesante es ampliar el programa para que sea capaz de controlar dos tableros adaptados. El prototipo está preparado para ello, pues cuenta con dos conectores a tablero, uno a cada lado del reloj. En cuanto a la transmisión a PC podemos decir, básicamente, que cumple su cometido. La generación de un archivo PGN tiene una motivación evidente. Existen en 29
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
el mercado varios programas que gestionan bases de datos de partidas de ajedrez. El formato de archivo más usado para almacenar partidas es el PGN (Portable Game Notation). Todos los gestores de partidas y bases de datos entienden y trabajan con este formato que, además, es gratuito. La elección está, pues, justificada. La notación que utilizamos es la algebraica extendida. No obstante, el tipo más utilizado en las competiciones, así como en publicaciones especializadas, es el algebraico, un poco distinto al que usamos aquí. Por simplicidad no se ha optado por implementar este último en los archivos generados en PC. Los gestores de partidas a los que aludíamos pueden traducir de uno formato a otro fácilmente. Aún así, sería interesante tener esto en cuenta en versiones posteriores. Otro aspecto importante es el uso del puerto serie para realizar la transferencia. Aunque aún hoy es un puerto utilizado por módems y otros dispositivos, y es perfectamente útil a nuestros propósitos, está siendo rápidamente desplazado por el USB. Por esto la transferencia implementada aquí corre peligro de quedarse obsoleta en pocos años. Sería éste, pues, otro dato interesante para modificaciones futuras. Existen en la actualidad tableros sensoriales para jugadores sin discapacidad (es decir, tableros no adaptados para ciegos) con conexión a PC. Se utilizan fundamentalmente para la retransmisión en directo de partidas de torneo por internet. Son muy prácticos y permiten, según el modelo, conexión via puerto serie o USB. Su gran inconveniente es el precio: en torno a los 425 €. Siguiendo con la ya apuntado en la transferencia a PC la retransmisión por internet es, quizá, una de las funciones más potentes de las que se podría dotar al sistema en futuras versiones. Lo sorprendente es que a nivel de circuito no harían falta muchos retoques (si no es con puerto USB). Se trataría más bien de un problema a nivel de soft.
Tarragona, Septiembre 2005
Firmado: Carlos Vidal García Ingeniero Técnico Industrial
30
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
2. MEMORIA DE CÁLCULO
31
Memoria de Cáculo
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
2. Memoria de Cálculo. En este apartado se explica el funcionamiento general del programa y la estrategia de resolución adoptada. Para ello se incorporan una serie de diagramas de flujo que facilitarán la comprensión del mismo. El código completo en lenguaje ensamblador puede consultarse en el anexo de esta memoria. Podemos dividir el programa en 3 partes fundamentales: control del tiempo restante, control de las jugadas realizadas en el tablero y reproducción de los mensajes de audio. Estas 3 partes están compuestas por una serie de subrutinas que iremos mostrando a continuación. Para controlar eficazmente el tiempo transcurrido utilizaremos la interrupción que genera el TMR0 del microcontrolador. Este temporizador nos permitirá controlar exactamente 1 segundo de tiempo para mantener los relojes actualizados. Asímismo, también utilizaremos esta fuente de interrupción para determinar cuando hay que encuestar el tablero adaptado en caso de que esté conectado al reloj. La reproducción de los mensajes de audio no precisa de control temporal, ya que los propios dispositivos ISD se encargan por sí mismos de realizar dicha reproducción. Cuando se solicite la reproducción de un mensaje sólo será necesario determinar la orden concreta y mandarla al dispositivo ISD. Éste realizará todo el proceso y advertirá al microcontrolador de la finalización del mismo. Además de las tareas comentadas el programa también permitirá al microcontrolador almacenar las jugadas realizadas en memoria y transmitirlas a un PC externo cuando se solicite. No se han puesto todas las subrutinas para evitar redundancia de explicación, debido a la analogía entre las del jugador A y las del jugador B.
2.1.
Inicialización.
Una vez encendido el dispositivo el programa empezará a ejecutarse desde la dirección 0x00 de la memoria de código. Lo primero que hacemos es llamar a una subrutina encargada de inicializar convenientemente los puertos E/S del microcontrolador, poner el preescaler del TMR0, incializar algunas variables y habilitar las interrupciones. Los dispositivos ISD y el display LCD son incializados en este punto. También será necesario habilitar las resistencias del pull-up del puerto B para poder detectar correctamente las señales producidas al pulsar un botón.
32
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos INICIALIZAR
PRINCIPAL
CO NFIG URAR PUERTO S E/S
INICIALIZAR
INICIO INICIALIZAR ISD'S
INICIALIZAR DISPLAY
PREESCALER DEL TMR0 A 1:2
HABILITA PULL-UPS PO RTB
HABILITA INTERRUPCIO NES
INICIALIZAR VARIABLES
INICIALIZAR OFFSET DE LA EEPRO M
RETURN
33
Memoria de Cáculo
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
2.2.
Memoria de Cáculo
Programa Principal.
Después de inicializar el dispositivo saltamos a la rutina de Inicio. Esta rutina se ejecutará cada vez que se inicie una partida nueva. El primer paso es cargar el modo de tiempo de la última partida jugada almacenado en la EEPROM del microcontrolador. Esto se realiza con la rutina cogeree. Posteriormente comprobamos si tenemos el tablero conectado al reloj o no. Esto lo realizaremos con la función comp_tablero. Después se inicializan las variables de control de la partida, así como las de auido y los contadores que se utilizarán en la rutina de atención a la interrupción. Posteriormente el programa queda en espera de que se pulse algún botón de jugador (A o B) para dar comienzo a la partida, o bien el botón set para configurar un modo de tiempo diferente, o el botón next para solicitar transferencia al PC. Las variables juegaA y juegaB se encargan de diferenciar de quién es el turno de juego. Una vez se ha iniciado la partida el programa ejecuta alternativamente las rutinas partida y cmp_set. La primera se encarga de comprobar los botones de jugador A y B y, en caso de detectar una pulsación, actualizar las variables de juego o parar los relojes según proceda. En caso de que nos hallemos en algun modo con incrementos de tiempo (modo “Fischer”) se realiza una llamada a la función incrementoA o incrementoB para actualizar los relojes con el tiempo correcto. La rutina cmp_set comprueba los distintos botones de petición de audio. En caso de que se pulse uno de ellos se llama a una función asociada encargada de determinar el mensaje a reproducir y empezar el proceso de reproducción. Esta rutina también se encarga de detectar si ya estamos reproduciendo un mensaje por una o las dos ISD, ya sea en modo normal o automático. En ese caso se llama a las funciones asociadas reproduceA, reproduceB o repsecA_A, repsecB_B. Tambien controlaremos si ya ha transcurrido el tiempo suficiente para encuestar el tablero, caso de que esté conectado, y empezar al proceso de detección de jugadas (ver apartado 2.5.). Es interesante comentar que la detección del accionamiento de los distintos pulsadores se ha hecho por flanco descendente. Esto se debe a que el sistema debe controlar numerosos eventos, entre ellos la acción de dichos pulsadores. Sería un inconveniente detectar los botones por nivel implementando un bucle para saber cuando se suelta un botón previamente pulsado, pues correríamos es riesgo de no atender otras acciones importantes como la reproducción de mensajes o el control del tablero.
34
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
INICIO
CO G E RE E
CO M P _ TA B L E RO
INICIA LIZA R V A RIA B L E S DE P A RTIDA Y A UDIO
INICIA LIZA R CO NTA DO RE S
TA B LE RO CO NE CTA DO ?
SI
INICIA L IZA R V A RIA B L E S CO NTRO L TA B LE RO
NO
B O TO N A P UL S A DO ?
SI
NO
B O TO N B P UL S A DO ?
NO
B O TO N S E T P ULS A DO ?
SI
juegaB =1
juegaA =1
INICIA LIZA TM R0
INICIA LIZA TM R0
SI
S E TCUE NTA
P A RTIDA
35
NO
B O TO N NE X T P ULS A DO ?
SI
TX _RS232
NO
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
P A RTIDA
B O TO N A P ULS A DO ?
NO
B O TO N B P ULS A DO ?
SI
SI
SI
V A RIA B LE A CTUA LIZA DA ?
V A RIA B LE A CTUA LIZA DA ?
NO
NO
TA B LE RO CO NE CTA DO ?
SI
NO
TURNO DE LA S NE G RA S ?
TURNO DE LA S B LA NCA S ?
SI
SI
A CTUA LIZA R V A RIA B LE S
A CTUA LIZA R V A RIA B LE S
SI
M O DO FIS CHE R?
INCRE M E NTO A
NO
SI
NO
A CTUA LIZA R DIS P LA Y
B O TO N B P ULS A DO ?
NO
TA B LE RO CO NE CTA DO ?
SI
M O DO FIS CHE R?
CM P _ S E T
SI
NO
NO
NO
A CTUA LIZA R DIS P LA Y
NO
B O TO N A P ULS A DO ?
SI
SI
P A RA R RE LO JE S
P A RA R RE LO JE S
A CTUA LIZA R DIS P LA Y
A CTUA LIZA R DIS P LA Y
CM P _S E T
36
NO
INCRE M E NTO B
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos CM P _ S E T
M O DO R E P R O D. A U TO M A TIC A P A RA A ?
SI RE P S E C A _A
NO
M O DO R E P R O D. A U TO M A TIC A P A RA B ?
SI RE P S E C B _B
NO
SI
RE P RO DU CIE NDO P A RA A ?
RE P RO D UCE A
NO
SI
RE P RO DU CIE NDO P A RA B ?
RE P RO D UCE B
NO
B O TO N S E T P UL S A D O ?
SI
RE LO JE S P A RA DO S ?
NO TIE M P O B _ B
SI
NO
INICIO
B O TO N M O D E P UL S A D O ?
SI TIE M P O A _B
NO
B O TO N UP P UL S A D O ?
SI TIE M P O B _A
NO
B O TO N NE X T P UL S A D O ?
SI
RE LO JE S P A RA DO S ? SI
TX _ RS 23 2
(C O NTINUA ) P A RTIDA
37
NO TIE M P O A _ A
Memoria de Cáculo
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
B O TO N JU G A D A A PULSADO?
SI R E P R O _ JU G A D A _ A
NO
B O TO N JU G A D A B PULSADO?
SI R E P R O _ JU G A D A _ B
NO
NO
TA B L E R O C O N E C TA D O ?
SI
TIE M P O D E E N C U E S TA ?
SI
NO
P A R TID A
38
IN IC IO _ E N C U E S TA
Memoria de Cáculo
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
2.3.
Memoria de Cáculo
Rutina de Atención a la Interrupción TMR0.
Esta rutina se encarga de mantener el control del tiempo de la partida. Se ejecuta cuando se desborda el timer, o sea, cada 512 s. (ver apartado 1.5.1.1.). Cada vez que entramos en la rutina de atención a la interrupción se comprueba si alguno de los jugadores tiene el reloj en marcha (variables juegaA y juegaB). En caso de que así sea se procede a decrementar el contador asociado a ese jugador. Cuando el contador llega a 0 sabemos que ya ha pasado 1 segundo, por lo que se llama a la subrutina cadasecA o cadasecB para actualizar las variables de tiempo de juego del jugador afectado. En estas subrutinas se detecta si ha finalizado el tiempo de juego o bien si se ha superado el control de tiempo. La rutina de atención a la interrupción también nos permite controlar el intérvalo temporal entre encuestas del tablero adaptado. En caso de que el tablero se encuentre conectado lo encuestaremos cada 0.5 segundos, tiempo suficiente para derectar las jugadas realizadas. Igual que con el control de tiempo decrementaremos un contador para saber cuando han pasado los 0.5 segundos. En ese caso actualizaremos una variable que nos indicará, una vez fuera de la interrupción, que ha llegado el momento de encuestar el tablero. Como hemos podido ver en el apartado anterior la rutina cmp_set detectará la activación de esta variable y procederá a iniciar la encuesta del tablero.
39
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
IS R
SALVAR LOS RE G IS TR O S W , S TA TUS Y P C L A TH
M IRA S I S E ÑA L E S E O M A S E RTA DA S
NO
IG UA L P A RA E L JUG A DO R B
JUE G A A =1 ? SI
DE CRE M E NTA R CO NTA DO R A
SI CO N TA DO R A =0?
C A D A S E CA
NO
RE INICIA R CO N TA D O R A
NO
TA B L E RO CO NE CTA DO ?
SI DE CRE M E NTA R C O NTA DO R TA B L E RO
C O NTA DO R TA B L E RO =0 ?
SI
A CTUA L IZA R V A RIA B L E A S O CIA DA
NO
RE INICIA R CO NTA DO R TA B L E R O RE S TA U RA R W , S TA TU S Y P CL A TH
L IM P IA R E L FL A G D E INTE RRUP CIO N DE L TM R 0 INTCO N(T0 IF)
P E RM ITIR INTE RRUP CIO N DE L TM R0 INTC O N(T0IE )
RE TFIE
40
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
CADASECA
DESHABILITAR TABLERO
SI
RETURN
FINA=1?
NO
DECREMENTAR 1 SEGUNDO EL RELOJ DE A
CAMBIAR CO NFIG PO RTD Y ACTUALIZAR DISPLAY
RELO J DE A=0?
NO
SI
SI
HA PASADO YA EL CO NTRO L? (FLAG A=1?)
FINA=1
NO
XTRTMPA=1?
NO
SI
FLAG A=1
PO NER MO DO DE REPRO DUCCIO N AUTO MATICA
XTRTMPA=0
SI VO LCAR VARIABLES DE FINISH EN VARIABLES RELO J A
Q UEDA MENO S DE UN MINUTO ?
CAMBIAR CO NFIG PO RTD Y ACTUALIZAR DISPLAY
41
NO RETURN
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
2.4.
Memoria de Cáculo
Reproducción de Mensajes de Audio.
Como ya hemos visto las peticiones de reproducción de mensajes orales vienen dadas por la acción de uno de los pulsadores. La rutina cmp_set se encarga de detectar dicha acción y llamar a la función correspondiente: tiempoA_A, tiempoA_B, tiempoB_A, tiempoB_B, repro_jugadaA, repro_jugadaB. Cada una se encarga de determinar que tipo de mensaje hay que reproducir y mandarlo por el auricular adecuado. Dependiendo del tiempo restante para cada jugador, el mensaje oral reproducido puede constar de horas y minutos, minutos y segundos o segundos solamente. A ese efecto se han creado las subrutinas rephoraAA, repminAA, repsecAA y sus análogas para las distintas combinaciones de A y B. La reproducción puede constar de distintos submensajes para componer el mensaje entero. Las subrutinas reproduceA y reproduceB se encargan de determinar cuando se ha finalizado la reproducción de un submensaje y si procede a enviarse otro. Dicha finalización nos la indican los dispositivos ISD asertando la linea EOM! (End Of Message). Puede darse el caso que en el momento de lanzar un mensaje para reproducción el display esté muy próximo a actualizar el tiempo de un jugador. Dado que display e ISD’s comparten el puerto D podríamos encontrarnos con un valor erroneo en el mismo mientras lanzamos la reproducción. Para evitar esto se implementa un bucle de espera antes de iniciar el proceso.
REPRODUCEA
NO E O M =0 ?
SI
C O N T2 A -@ M S G 2 A +1 = C O N TA ?
SI
SI R E P R O A =0
D IS P L A Y P R O X IM O A A C TU A L IZ A R S E ?
NO CARGAR EL S IG U IE N TE M E N S A JE P A R A R E P R O D U C C IO N
R E TU R N
42
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
TIE M P O A _ A
E S TA M O S E N R E P R O D U C C IO N A U TO M Á TIC A ?
SI
NO
E S TA M O S R E P R O D U C IE N D O POR A?
SI
NO
H O R A S D E A =0 ?
NO
REPHORAAA
SI
NO M IN U TO S D E A =0 ?
R E P M IN A A
SI
NO S E G U N D O S D E A =0 ?
REPSECAA
SI
R E TU R N
43
Memoria de Cáculo
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
RE P HO R A A A
CO N TA =0
M S G 1A =@ D E L N UM E RO C O RR E S P O ND IE NTE A H O RA A CO N TA ++
M S G 2A =@ P A LA B R A "H O RA S " CO N TA ++
SI M INU TO S D E A =0?
NO
M INU NA =0?O M IND E A =0?
SI
SI M IN UN A =0?
NO
NO M S G 3A =@ P A LA B R A C O RR E S P O ND IE NTE A M IN DE A CO N TA ++
M S G 3 A =@ P A LA B R A C O RR E S P O ND IE N TE A M IN DE A CO N TA ++
M S G 3A =@ P A LA B RA CO R RE S P O N DIE NTE A M INU NA C O NTA ++
M S G 4A =@ P A LA B R A C O RR E S P O ND IE NTE A M IN UN A CO N TA ++
M S G 5A =@ P A LA B R A "M IN UTO S " CO N TA ++
L A N ZA M O S M S G 1 A A R E P RO DUC CIO N
C O N T2 A =M S G 2 A RE P R O A =1
R E TUR N
44
M S G 4 A =@ P A LA B R A "M IN UTO S " CO N TA ++
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
REPMINAA
CO NTA=0
MINUNA=0?O MINDEA=0?
SI
SI MINUNA=0?
MSG1A=@ PALABRA CO RRESPONDIENTE A MINDEA CO NTA++
NO
NO MSG1A=@ PALABRA CO RRESPONDIENTE A MINDEA CO NTA++
MSG1A=@ PALABRA CO RRESPONDIENTE A MINUNA CO NTA++
MSG2A=@ PALABRA CO RRESPONDIENTE A MINUNA CO NTA++
MSG2A=@ PALABRA "MINUTO S" CO NTA++
SECUNA=0?O SECDEA=0?
NO
MSG3A=@ PALABRA "MINUTO S" CO NTA++
MSG3A=@ PALABRA CO RRESPONDIENTE A SECDEA CO NTA++
SI
SI SECUNA=0?
NO MSG3A=@ PALABRA CO RRESPONDIENTE A SECUNA CO NTA++
MSG4A=@ PALABRA CO RRESPONDIENTE A SECUNA CO NTA++
SECUNA=0?O SECDEA=0?
NO MSG4A=@ PALABRA CO RRESPONDIENTE A SECDEA CO NTA++
SI
SI SECUNA=0?
MSG4A=@ PALABRA CO RRESPONDIENTE A SECDEA CO NTA++
MSG5A=@ PALABRA "SEG UNDO S" CO NTA++
NO MSG4A=@ PALABRA CO RRESPONDIENTE A SECUNA CO NTA++
MSG5A=@ PALABRA "SEG UNDO S" CO NTA++
MSG5A=@ PALABRA CO RRESPONDIENTE A SECUNA CO NTA++
MSG6A=@ PALABRA "SEGUNDO S" CO NTA++ LANZAMOS MSG1A A REPRODUCCIO N
CO NT2A=MSG 2A REPRO A=1
RETURN
45
MSG 3A=@ PALABRA CO RRESPONDIENTE A SECDEA CO NTA++
MSG 4A=@ PALABRA "SEG UNDO S" CO NTA++
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
RE PS ECAA
CO NTA=0
S ECUNA =0?O S ECDE A=0?
NO MS G 1A =@ P ALAB RA CO RRES PO NDIE NTE A S ECDE A CO NTA++
SI
SI S ECUNA =0?
MSG 1A=@ PALABRA CO RRE SP O NDIE NTE A S ECDEA CO NTA ++
NO MS G 1A=@ PA LAB RA CO RRE S PO NDIE NTE A S E CUNA CO NTA++
MSG 2A=@ PALABRA "S EG UNDO S" CO NTA ++
MS G 2A =@ P ALAB RA CO RRES PO NDIE NTE A SE CUNA CO NTA++
MS G 3A =@ P ALAB RA "SE G UNDO S " CO NTA++
LA NZA MO S MSG 1A A RE P RO DUCCION
CO NT2A =MSG 2A RE PROA =1
RE TURN
46
Memoria de Cáculo
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
REPRO _JUG ADAA
BASE_RAM= 0X110?
SI RETURN
NO
CO NTA=0
CARG AMO S MENSAJE "PIEZA" EN MSG1A
BASE_RAM> 0X190?
BASE_RAM= 0X190?
NO S SITUAMO S EN BASE_RAM-2 (BANCO 2)
NOS SITUAMO S EN BASE_RAM-2 (BANCO3)
CARG AMOS "FILA" Y "CO LUMNA" ORIG EN EN MSG 2A Y MSG3A
CARGAMO S "FILA" Y "CO LUMNA" O RIGEN EN MSG2A Y MSG 3A
CARG AMOS "FILA" Y "CO LUMNA" DESTINOEN MSG 4A Y MSG5A
CARGAMO S "FILA" Y "CO LUMNA" DESTINO EN MSG4A Y MSG 5A
LANZAMOS MSG 1A A REPRO DUCCIÓN
RETURN
47
NO S SITUAMO S EN BASE_RAM= 0X16E
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
2.5.
Memoria de Cáculo
Control del tablero adaptado.
Para controlar las jugadas realizadas en el tablero adaptado es necesario en primer lugar realizar una encuesta del mismo. Realizando dicha encuesta almacenamos el estado de cada casilla (ocupada o libre) en una tabla que llamamos actual. Posteriormente, comparando los datos de esta tabla con una similar llamada anterior (que contiene el estado de las casillas antes de realizar la encuesta) podemos deducir si ha habido algun cambio en la posición del tablero. Las funciones que realizan esto son encuesta y compara, respectivamente. Una vez se ha detectado un cambio en el tablero es necesario determinar si se trata de una jugada completa o no. Esto se debe a que para realizar una jugada físicamente se traslada una pieza de una casilla a otra. El microcontrolador realiza las encuestas rápidamente (dos veces por segundo), de modo que detectaríamos primero un cambio de casilla ocupada a libre. Este cambio no implica una jugada completa y habrá que esperar otro cambio distinto, casilla libre a ocupada, para poder comprobar si se trata de una jugada correcta o no. La rutina compara también se encarga de detectar cuando se ha realizado una jugada completa. En ese caso se almacenan las coordenadas de origen y destino del cambio (coord_or1x, coord_or1y, coord_desx y coord_desy). La rutina examina se encarga de comprobar si nos hallamos ante una jugada correcta o una jugada ilegal. Para ello necesitamos conocer las coordenadas de origen y destino del movimiento y una tabla generada previamente que llamamos pieza. En esta tabla se almacenan todas las piezas que intervienen en el juego, su color (blanca o negra), su estado (viva o muerta), y su posición (coordenadas fila y columna, x e y). Sencillamente buscamos en esta tabla una pieza cuyas coordenadas de posición coincidan con las coordenadas de origen del movimiento (sólo puede haber una). Posteriormente comprobamos si su color coincide con el turno de juego y si existe sobre el tablero (si está viva). Después se determina que tipo de pieza es y se comprueba si su movimiento es acorde. Como las distintas piezas del juego se mueven de forma diferente es necesario tratar cada caso por separado. Cuando se mueve una pieza pueden darse varios casos especiales, como la captura de una pieza enemiga o la jugada de enroque. Para ello la función examina llamará, en determinados casos, a otras subrutinas que se encagarán de comprobar estos casos especiales. La subrutina mira_captura comprueba si la casilla destino del movimiento ya está ocupada por otra pieza. De ser así determina si esa pieza es del bando enemigo, en cuyo caso es una captura, o del mismo bando, lo que daría lugar a un error. Si es una captura se procede a eliminar la pieza capturada de la tabla pieza mediante la función kill_pieza. Excepto el caballo, las demás piezas no pueden atravesar una casilla que ya está ocupada, es decir, interceptando la trayectoria de su movimiento. La subrutina mira_casilla se encarga de esto. Puede ocurrir que con la jugada realizada uno de los reyes, ya sea el del propio bando o el enemigo, quede atacado. El primer caso se trata de una jugada ilegal, para lo que hemos creado la subrutina jaque. Puesto que la labor de determinar si un rey u otro están en jaque se reduce a comprobar si una pieza del bando enemigo ataca la casilla en la que se ubica dicho rey, la subrutina jaque llama con frecuencia a otra subrutina, ataque. Esta última recibe como parámetros de entrada las coordenadas de la casilla afectada y el bando al que corresponde el turno de juego. A continuación se recorre la tabla pieza, comprobando si alguna de las piezas de color contrario y viva puede atacar la casilla en cuestión. Esta subrutina también es utilizada 48
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
por otra función, mira_enroque, que determinará si el movimiento de enrocar es acorde con las reglas que le corresponden. Cuando el sistema detecta una jugada ilegal se ejecuta la rutina pon_error. El objetivo de esta rutina es, primeramente, advertir de la situación encendiendo un LED de aviso. Si se solicita reproducción de la última jugada el mensaje que se escucha es “jugada ilegal”. Durante un error no se puede conmutar el reloj de juego, es decir, sigue contando el tiempo para el jugador infractor. Tampoco se prosigue con la comprobación de más jugadas. Sólo es posible salir de esta situación volviendo a poner las piezas como estaban antes del error y siguiendo la partida a partir de este punto.
IN IC IO _ E N C U E S TA
E N C U E S TA
COMPARA
JU G A D A C O M P L E TA ? SI
E X A M IN A
P A R TID A
49
NO
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
E N C U E S TA
C O N T_ FIL A =0
C O N FIG U R A R P O R TD 4 B ITS A L TO S IN 4 B ITS B A JO S O U T
SI
C O N T_ FIL A ->P O R TD E N A B L E =0
C O N T_ FIL A ->P O R TD E N A B L E =0
TE M P O R IZA C IO N 1 0 m s
TE M P O R IZA C IO N 1 0 m s
S E H A A C TU A L IZA D O E L D IS P L A Y?
S E H A A C TU A L IZA D O E L D IS P L A Y?
NO
SI
NO
E N A B L E =1
E N A B L E =1
S A L V A R B YTE A L TO P O R TD E N B YTE B A JO M E M O R IA
S A L V A R B YTE A L TO P O R TD E N B YTE A L TO M E M O R IA
C O N T_ FIL A ++
C O N T_ FIL A ++
NO C O N T_ FIL A =1 6 ? SI
C O N FIG U R A P O R TD TO D O S A L ID A S
R E TU R N
50
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
COMPARA
A U X _ A C TU A L =A C TU A L A U X _ A N TE R IO R =A N TE R IO R B =0
NO
A U X _ A C TU A L (B )= A U X _ A N TE R IO R (B )?
NO
A U X _ A C TU A L (B )=1 ? SI
B IT_ C A M B IO =0 ?
SI
NO
SI NO B ++
B IT_ C A M B IO =0 ?
A U X _ A C TU A L ->C O O R D _ D E S X B ->C O O R D _ D E S Y
SI
SI
A U X _ A C TU A L ->C O O R _ O R 1 X B ->C O O R D _ O R 1 Y
B =8 ?
NO B =0 A U X _ A C TU A L ->C O O R _ O R 2 X B ->C O O R D _ O R 2 Y A U X _ A C TU A L A C TU A L =7 ?
NO
SI
B IT_ C A M B IO =1
A U X _ A C TU A L ++ A U X _ A N TE R IO R ++
R E TU R N
51
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
EXAMINA
BUSCAMOS LA PIEZA Q UE SE ESTÁ MOVIENDO EN LA TABLA 'PIEZA'
CO MPROBAR TURNO DE JUEGO Y SI PIEZA VIVA
DETERMINAR QUE TIPO DE PIEZA SE ESTA MOVIENDO
NO PEO N?
SI
COMPROBAR MOVIMIENTO PEO N
NO TORRE?
SI
CO MPROBAR MO VIMIENTO TORRE
NO CABALLO?
NO ALFIL?
SI
SI
CO MPRO BAR MO VIMIENTO CABALLO
COMPRO BAR MOVIMIENTO ALFIL
NO DAMA?
SI
COMPROBAR MOVIMIENTO TORRE
COMPROBAR MOVIMIENTO ALFIL
DETERMINAR SI SE HA LLEGADO A LA 8ª/1ª FILA
COMPRO BAR MOVIMIENTO REY
NO
SE ENRO CA? SI
MIRA_CAPTURA
MIRA_ENROQ UE
MIRA_JAQUE
GUARDA_RAM
ACTUALIZA VARIABLES DE CONTRO L
RETURN
52
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos M IRA _CA P TURA
M IRA _ CA S ILL A (X ,Y)
M IRA _ CA S ILL A (DE S TINO X,Y)
RECO RRE R TAB L A PIEZA
CA SILLA O CUPA DA ?
SI
CO M P RO B A R CO LO R P IE ZA CAS IL LA O CUPA DA
NO CO O RDE NA DA _ X = X ?
NO
RETURN
Memoria de Cáculo
SI
K IL L_ P IE ZA
NO
FINA L TAB L AP IE ZA ?
CO O RDENA DA _Y = Y?
SI
SI RETURN(0 )
NO P IE ZA V IV A ?
SI RETURN(CO LO R PIEZA)
K ILL _P IE ZA
RE CO RRE R TA BL A P IE ZA
CO O RDE NADA _X = CO O RDE NA _DE STINO X ?
NO
SI
NO CO O RDE NA DA_Y = CO O RDE NA _DE STINO Y?
FINAL TA BL A PIEZA?
SI
SI NO
P IE ZA V IV A ? PO N_E RRO R SI
LIMP IA FLA G PIEZA VIVA
RE TURN
53
NO
NO
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
MIRA_JAQ UE
JUEGAN BLANCAS?
NO
SI
BUSCAMOS LAS COO RDENADAS DEL REY BLANCO
BUSCAMO S LAS CO ORDENADAS DEL REY NEGRO
G UARDAMO S LAS CO O RDENADAS EN 'FILA' Y 'CO LUMNA'
GUARDAMO S LAS CO ORDENADAS EN 'FILA' Y 'COLUMNA'
ATAQ UE(FILA, CO LUMNA,NEG RAS)
ATAQUE(FILA, CO LUMNA,BLANCAS)
ATAQ UE RETORNA 1?
SI
ATAQUE RETO RNA 1?
PON_ERRO R
BUSCAMOS LAS COO RDENADAS DEL REY NEG RO
RETURN
GUARDAMO S LAS CO ORDENADAS EN 'FILA' Y 'COLUMNA'
ATAQ UE(FILA, COLUMNA,BLANCAS)
ATAQUE(FILA, CO LUMNA,NEGRAS)
SI
PON_ERROR
BUSCAMO S LAS CO ORDENADAS DEL REY BLANCO
G UARDAMO S LAS CO O RDENADAS EN 'FILA' Y 'CO LUMNA'
ATAQ UE RETORNA 1?
SI
PON FLAG JAQ UE REY NEG RO
ATAQUE RETO RNA 1?
NO
NO
Q UITA FLAG JAQUE REY NEG RO
Q UITA FLAG JAQ UE REY BLANCO
RETURN
54
RETURN
SI
PO N FLAG JAQUE REY BLANCO
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
MIRA_ENRO Q UE
ENRO Q UE CO RTO ?
NO
IG UALPARA ENRO Q UE LARG O
SI
JUEG AN BLANCAS?
NO
SI
ENRO Q UE CO RTO PERMITIDO ?
NO
NO
SI
BLANCAS EN JAQ UE?
SI
SI
SI
NO
CASILLAS DE PASO OCUPADAS? (F1 Y G 1)
ENRO Q UE CO RTO PERMITIDO ?
NEG RAS EN JAQ UE?
NO
SI SI
NO
CASILLAS DE PASO OCUPADAS? (F8 Y G 8)
NO
ATAQ UE(F1, NEG RAS)
ATAQ UE(F8, BLANCAS)
ATAQ UE(G 1, NEG RAS)
ATAQUE(G 8, BLANCAS)
CASILLAS DE PASO ATACADAS? (F1 Y G 1)
SI SI
NO
CASILLAS DE PASO ATACADAS? (F8 Y G 8)
NO
PO N_ERRO R
RETURN
55
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
ATA Q UE (FILA ,CO LUM NA, CO LO R B ANDO A TACA NTE )
RE CO RRE TA BLA PIE ZA
PIE ZA V IV A?
NO
SI
NO
CO O RDE NA DA _X= FILA?
SI
NO
CO O RDE NA DA_Y= CO LUMNA ?
NO
SI NO
CO LO R P IE ZA = BA NDO ATA CA NTE?
SI
FINA L TA B LA PIE ZA ?
RE TURN(0)
SI
DE TE RMINA R DE Q UE P IE ZA S E TRATA
NO PE O N?
NO TO RRE?
SI
SI
CO M PRO BA R CAS ILLA S A TAQ UE PE O N
CAS ILLA ATA CA DA ?
CO MPRO B AR CAS ILLAS A TA Q UE TO RRE
NO CA BA LLO ?
SI
SI
CO MPRO B AR CA SILLAS ATA Q UE CA BA LLO
NO
SI
RETURN(1)
56
NO
NO A LFIL?
CO MP RO B A R CA SILLAS A TA Q UE A LFIL
DAMA ?
SI
CO MP RO B A R CA S ILLA S A TAQ UE TO RRE
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos P O N_ E R RO R
E N CIE NDE L E D E R RO R
P O S IC IO N TA B L E RO R E E S TA B L E CID A ?
SI
APAGA L E D E RR O R
NO
NO
R E TU RN
P E TICIO N A UDIO JUG A DA ?
SI
RE P R O DU CE M E N S A JE "JUG A DA IL E G A L "
57
Memoria de Cáculo
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
2.6.
Memoria de Cáculo
Rutinas auxiliares.
A continuación incluimos los diagramas de algunas subrutinas que se ejecutan durante la ejecución del código:
setcuenta: Nos permite cambiar la modalidad temporal al inicio de la partida. guarda_ram: Almacena la jugada realizada en la memoria RAM del microcontrolador si dicha jugada es correcta. tx_232: Transmite el contenido de la memoria de jugadas a un PC externo.
58
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos S E TCU E NTA
O FFS E T= O FFS E T + 12
O FFS E T= P O S ICIO N 84 DE LA E E P RO M DE L P IC?
SI
O FFS E T=0
NO
CO G E RE E
SI
B O TO N S E T P ULS A DO ?
NO
B O TO N JUG A DO R A P ULS A DO ?
SI
NO
B O TO N JUG A DO R B P ULS A DO ?
SI
G UA RDA M O S E L O FFS E T E N LA P O S ICIO N 0 DE LA E E P RO M DE L P IC
NO RE TURN
59
Memoria de Cáculo
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
GUARDA_RAM
C O M P O N E M O S B YTE C O O R D E N A DA O R IG E N (HIG H: C O O R D Y, L O W C O O RD X )
BASE_RAM> 0X 1 90?
SI
B A S E _R A M = 0X 1 E F?
NO
SI
NO
G U A R D A B YTE O RIG E N E N RA M
G U A R DA B YTE O R IG E N E N R A M
B A S E _R A M ++
B A S E _ R A M ++
C O M P O N E M O S B YTE C O O R D E N A D A D E S TIN O
CO M P O NE M O S B YTE C O O R DE N A D A DE S TINO
G U A R D A B YTE D E S TIN O E N R A M
G U A R DA B YTE D E S TINO E N R A M
BASE_RAM= 0X 1 6F?
NO
SI
B A S E _R A M =0X 1 90
B A S E _ R A M ++
RE TU R N
60
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
TX_RS232
B ASE_RAM= 0X120?
SI
FALLO MEMO RIA VACIA
NO
ACTIVA R USART (RCSTA(SP EN)=1)
RETURN
CO NFIG URAR USART PARA TRA NSIMIS IO N (TXSTA=0x24)
V ELOCIDA D=9600 BA UDIO S (SPBRG=25)
ACTIVA R USART (RCSTA(SP EN)=1)
NO
INCREMENTAR P UNTERO HAB ILITAR TRANSMISIO N (TXS TA (TXEN)=1)
PUNTERO = BAS E_RAM? SI
TRA NSMITIR BYTE 0X FF (FIN TRANSMISIO N)
INICIALIZAR P UNTERO A ME MO RIA
FIN DE TRA NSMISIO N? (TXSTA(TRMT)=1?) LEER CO NTENIDO ME MO RIA RA M SI
RETURN TRANSMITIR B YTE (TXREG )
FIN DE TRANSMISIO N? (TXS TA (TRMT)=1?)
NO
61
SI
NO
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
3. PLANOS
62
Planos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
3.5.
Aspecto de las Máscaras de C.I.
3.5.1. Situación de Componentes Placa 1.
3.5.2. Máscara de Cara Componentes Placa 1.
63
Planos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
3.5.3. Máscara de Cara Soldadura Placa 1.
3.5.4. Situación de Componentes Placa 2.
64
Planos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
3.5.5. Máscara de Cara Componentes Placa 2.
3.5.6. Máscara de Cara Soldadura Placa 2.
65
Planos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
4. PRESUPUESTO
66
Presupuesto
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
4. Presupuesto. 4.1.
Mediciones.
Capítulo 1: Horas de Diseño. Nº 1.1
Ud. H
Descripción
Nº Partes
Subtotal
TOTAL
HORAS DISEÑO PROTOTIPO HORAS DE DISEÑO Y DESARROLLO DEL PROTOTIPO
67
350
350 350
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 2: Componentes Electrónicos. Nº 2.1
Ud. U
Descripción
Nº Partes
Subtotal
TOTAL
MICROCONTROLADOR PIC16F877 MICROCONTROLADOR MODELO PIC16F877 DE MICROCHIP DE 8 K. DE MEMORIA DE PROGRAMA, 33 PINES DE E/S
1
1 1
2.2
U
ISD 2560 DISPOSITIVO GRABADOR/REPRODUCTOR DE VOZ ISD2560, CON 60 SEGUNDOS DE CAPACIDAD GRABACIÓN
2
2 2
2.3
U
LCD 16X1 MODULO VISUALIZADOR DE CRISTAL LÍQUIDO DE 16 CARACTERES, 1 FILA
1
1 1
2.4
U
OPB620 SENSOR ÓPTICO MODELO OPB620
64
64 64
2.5
U
74HC4514N DECODIFICADOR 1:16 MODELO 74HC4514N CON 4 ENTRADAS DE SELECCIÓN, SALIDA A NIVEL ALTO
1
1 1
2.6
U
MAX232 C. I. MAX232 TRANSMISIÓN/RECEPCIÓN DE SEÑALES TTL/232.
1
1 1
2.7
U
OSCILADOR 4 MHz CRISTAL DE CUARZO DE 4 MHz.
1
1 1
2.8
U
LM7805 REGULADOR DE TENSIÓN MODELO LM7805
1
1 1
2.9
U
PILA 9V PILA ALCALINA DE 9V
1
1 1
2.10 U
CONECTOR PILA 9V PORTAPILAS PILA 9V
1
1 1
68
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Nº
Ud.
2.11 U
Descripción
Nº Partes
Presupuesto
Subtotal
TOTAL
PULSADOR COLOR ROJO PULSADOR MINIATURA COLOR ROJO
4
4 4
2.12 U
PULSADOR COLOR AMARILLO PULSADOR MINIATURA COLOR AMARILLO
2
2 2
2.13 U
PULSADOR COLOR NEGRO PULSADOR MINIATURA COLOR NEGRO
2
2 2
2.14 U
AURICULAR MONO AURICULAR MODELO UNI TONE
2
2 2
2.15 U
INTERRUPTOR INTERRUPTOR DE PALANCA DE CONTACTO SIMPLE
1
1 1
2.16 U
LED ROJO DIODO EMISOR DE LUZ 3 MM COLOR ROJO
1
1 1
2.17 U
LED AMARILLO DIODO EMISOR DE LUZ 3 MM COLOR AMARILLO
1
1 1
2.18 U
DIODO ZENER DIODO ZENER MODELO 1N750 4,7 V
1
1 1
2.19 U
LM741 AMPLIFICADOR OPERACIONAL MODELO LM741
1
1 1
2.20 U
RESISTENCIA 1 kΩ 4
RESISTENCIA DE 1 kΩ1/4 W 2.21 U
4
RESISTENCIA 10 kΩ 1
RESISTENCIA DE 10 kΩ1/4 W 2.22 U
1 1
RESISTENCIA 100 Ω 1
RESISTENCIA DE 1 kΩ1/4 W 2.23 U
4
1 1
RESISTENCIA 2,2 kΩ 4
RESISTENCIA DE 2,2 kΩ1/4 W
4 4
69
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Nº
Ud.
2.24 U
Descripción
Nº Partes
4
4
RESISTENCIA 18 kΩ 1
1 1
POTENCIÓMETRO 4,7 kΩ 3
POTENCIÓMETRO DE 4,7 kΩ1/4 W 2.27 U
TOTAL
4
RESISTENCIA DE 18 kΩ1/4 W 2.26 U
Subtotal
RESISTENCIA 220 kΩ RESISTENCIA DE 220 kΩ1/4 W
2.25 U
Presupuesto
3 3
CONDENSADOR 100 nF CONDENSADOR CERÁMICO 100 Nf
1
1 1
2.28 U
CONDENSADOR 330 nF CONDENSADOR CERÁMICO 330 Nf
1
1 1
2.29 U
CONDENSADOR 22 pF CONDENSADOR CERÁMICO 22 pF
2
2 2
2.30 U
CONDENSADOR 22 µF CONDENSADOR ELECTROLÍTICO 22 µF
2.31 U
4
4 4
ZÓCALO 40 PINES ZÓCALO 40 PINES TORNEADO
1
1 1
2.32 U
ZÓCALO 28 PINES ZÓCALO 28 PINES TORNEADO
2
2 2
70
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 3: Placas de Circuito Impreso. Nº 3.1
Ud. U
Descripción
Nº Partes
U
TOTAL
CIRCUITO IMPRESO PLACA CIRCUITO IMPRESO DOBLE CARA 180 x 100 mm.
3.2
Subtotal
1
1 1
CIRCUITO IMPRESO PLACA CIRCUITO IMPRESO DOBLE CARA 70 x 40 mm.
71
1
1 1
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 4: Conectores y Cables. Nº 4.1
Ud. U
Descripción
Nº Partes
Subtotal
TOTAL
CONECTOR CABLE PLANO CONECTOR CABLE PLANO MACHO DE 14 CONTACTOS
4
4 4
4.2
U
CONECTOR CABLE PLANO CONECTOR CABLE PLANO MACHO DE 16 CONTACTOS
4.3
U
1
1 1
CONECTOR DB9 CONECTOR DB9 HEMBRA ACODADO
1
1 1
4.4
U
CONECTOR AURICULAR CONECTOR AURICULAR TIPO JACK 3,5 ESTEREO
2
2 2
4.5
U
CABLE PLANO CABLE PLANO
1
1 1
72
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 5: Varios. Nº 5.1
Ud. U
Descripción
Nº Partes
Subtotal
TOTAL
CAJA PLÁSTICO CAJA DE PLÁSTICO COLOR NEGRO 200 x 140 x 90 mm
1
1 1
5.2
U
TABLERO AJEDREZ TABLERO DE AJEDREZ, LÁMINA DE PLÁSTICO SERIGRAFIADA 400 x 410 mm
1
1 1
5.3
U
PIEZAS AJEDREZ PIEZAS DE AJEDREZ PARA INVIDENTES MODELO STAUNTON Nº 4
1
1 1
73
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
4.2.
Presupuesto
Cuadro de precios.
Capítulo 1: Horas De Diseño. Nº 1.1
Ud. H
Descripción
Precio (€)
HORAS DISEÑO PROTOTIPO HORAS DE DISEÑO Y DESARROLLO DEL PROTOTIPO
74
38,84 TREINTA Y OCHO EUROS CON OCHENTA Y CUATRO CÉNTIMOS
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 2: Componentes Electrónicos. Nº 2.1
Ud. U
Descripción
Precio (€)
MICROCONTROLADOR PIC16F877 MICROCONTROLADOR MODELO PIC16F877 DE MICROCHIP DE 8 K. DE MEMORIA DE PROGRAMA, 33 PINES DE E/S
2.2
U
ISD 2560 DISPOSITIVO GRABADOR/REPRODUCTOR DE VOZ ISD2560, CON 60 SEGUNDOS DE CAPACIDAD GRABACIÓN
2.3
U
LCD 16X1 MODULO VISUALIZADOR DE CRISTAL LÍQUIDO DE 16 CARACTERES, 1 FILA
2.4
U
OPB620 SENSOR ÓPTICO MODELO OPB620
2.5
U
74HC4514N DECODIFICADOR 1:16 MODELO 74HC4514N CON 4 ENTRADAS DE SELECCIÓN, SALIDA A NIVEL ALTO
2.6
U
MAX232 C. I. MAX232 TRANSMISIÓN/RECEPCIÓN DE SEÑALES TTL/232.
2.7
U
U
18,32 DIECIOCHO EUROS CON TREINTA Y DOS CÉNTIMOS 12,15 DOCE EUROS CON QUINCE CÉNTIMOS 0,82 OCHENTA Y DOS CÉNTIMOS 1,21 UN EURO CON VEINTIUN CÉNTIMOS
1,23 UN EURO CON VEINTITRÉS CÉNTIMOS 0,84 OCHENTA Y CUATRO CÉNTIMOS
OSCILADOR 4 MHz CRISTAL DE CUARZO DE 4 MHz.
2.8
9,70 NUEVE EUROS CON SETENTA CÉNTIMOS
0,28 VEINTIOCHO CÉNTIMOS
LM7805 REGULADOR DE TENSIÓN MODELO LM7805
2.9
U
1,70 UN EURO CON SETENTA CÉNTIMOS
PILA 9V PILA ALCALINA DE 9V
2.10 U
0,20 VEINTE CÉNTIMOS
CONECTOR PILA 9V PORTAPILAS PILA 9V
75
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Nº
Ud.
2.11 U
Descripción
Precio (€)
PULSADOR COLOR ROJO PULSADOR MINIATURA COLOR ROJO
2.12 U
PULSADOR COLOR AMARILLO PULSADOR MINIATURA COLOR AMARILLO
2.13 U
PULSADOR COLOR NEGRO PULSADOR MINIATURA COLOR NEGRO
2.14 U
AURICULAR MONO AURICULAR MODELO UNI TONE
2.15 U
INTERRUPTOR INTERRUPTOR DE PALANCA DE CONTACTO SIMPLE
2.16 U
0,57 CINCUENTA Y SIETE CÉNTIMOS 0,57 CINCUENTA Y SIETE CÉNTIMOS 0,57 CINCUENTA Y SIETE CÉNTIMOS 1,38 UN EURO CON TREINTA Y OCHO CÉNTIMOS 0,83 OCHENTA Y TRES CÉNTIMOS 0,09 NUEVE CÉNTIMOS
LED ROJO DIODO EMISOR DE LUZ 3 MM COLOR ROJO
2.17 U
0,09 NUEVE CÉNTIMOS
LED AMARILLO DIODO EMISOR DE LUZ 3 MM COLOR AMARILLO
2.18 U
0,08 OCHO CÉNTIMOS
DIODO ZENER DIODO ZENER MODELO 1N750 4,7 V
2.19 U
LM741 AMPLIFICADOR OPERACIONAL MODELO LM741
2.20 U
0,36 TREINTA Y SEIS CÉNTIMOS 0,02 DOS CÉNTIMOS
RESISTENCIA 1 kΩ RESISTENCIA DE 1 kΩ1/4 W
2.21 U
0,02 DOS CÉNTIMOS
RESISTENCIA 10 kΩ RESISTENCIA DE 10 kΩ1/4 W
2.22 U
RESISTENCIA 100 Ω
0,02 DOS CÉNTIMOS
RESISTENCIA DE 1 kΩ1/4 W 2.23 U
Presupuesto
0,02 DOS CÉNTIMOS
RESISTENCIA 2,2 kΩ RESISTENCIA DE 2,2 kΩ1/4 W
76
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Nº
Ud.
2.24 U
Descripción
Presupuesto
Precio (€) 0,02 DOS CÉNTIMOS
RESISTENCIA 220 kΩ RESISTENCIA DE 220 kΩ1/4 W
2.25 U
0,02 DOS CÉNTIMOS
RESISTENCIA 18 kΩ RESISTENCIA DE 18 kΩ1/4 W
2.26 U
0,12 DOCE CÉNTIMOS
POTENCIÓMETRO 4,7 kΩ POTENCIÓMETRO DE 4,7 kΩ1/4 W
2.27 U
0,11 ONCE CÉNTIMOS
CONDENSADOR 100 nF CONDENSADOR CERÁMICO 100 nF
2.28 U
0,11 ONCE CÉNTIMOS
CONDENSADOR 330 nF CONDENSADOR CERÁMICO 330 nF
2.29 U
0,08 OCHO CÉNTIMOS
CONDENSADOR 22 pF CONDENSADOR CERÁMICO 22 pF
2.30 U
CONDENSADOR 22 µF
0,13 TRECE CÉNTIMOS
CONDENSADOR ELECTROLÍTICO 22 µF 2.31 U
0,63 SESENTA Y TRES CÉNTIMOS
ZÓCALO 40 PINES ZÓCALO 40 PINES TORNEADO
2.32 U
0,57 CINCUENTA Y SIETE CÉNTIMOS
ZÓCALO 28 PINES ZÓCALO 28 PINES TORNEADO
77
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 3: Placas de Circuito Impreso. Nº 3.1
Ud. U
Descripción
Precio (€)
CIRCUITO IMPRESO PLACA CIRCUITO IMPRESO DOBLE CARA 180 x 100 mm.
3.2
U
CIRCUITO IMPRESO PLACA CIRCUITO IMPRESO DOBLE CARA 70 x 40 mm.
78
4,60 CUATRO EUROS CON SESENTA CÉNTIMOS 1,54 UN EURO CON CINCUENTA Y CUATRO CÉNTIMOS
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 4: Conectores y Cables. Nº 4.1
Ud. U
Descripción
Precio (€) 0,28 VEINTIOCHO CÉNTIMOS
CONECTOR CABLE PLANO CONECTOR CABLE PLANO MACHO DE 14 CONTACTOS
4.2
U
0,28 VEINTIOCHO CÉNTIMOS
CONECTOR CABLE PLANO CONECTOR CABLE PLANO MACHO DE 16 CONTACTOS
4.3
U
CONECTOR DB9 CONECTOR DB9 HEMBRA ACODADO
4.4
U
0,66 SESENTA Y SEIS CÉNTIMOS 0,22 VEINTIDOS CÉNTIMOS
CONECTOR AURICULAR CONECTOR AURICULAR TIPO JACK 3,5 ESTEREO
4.5
U
0,63 SESENTA Y TRES CÉNTIMOS
CABLE PLANO CABLE PLANO
79
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 5: Varios. Nº 5.1
Ud. U
Descripción
Precio (€)
CAJA PLÁSTICO CAJA DE PLÁSTICO COLOR NEGRO 200 x 140 x 90 mm
5.2
U
TABLERO AJEDREZ TABLERO DE AJEDREZ, LÁMINA DE PLÁSTICO SERIGRAFIADA 400 x 410 mm
5.3
U
3,16 TRES EUROS CON DIECISEIS CÉNTIMOS 3,50 TRES EUROS CON CINCUENTA CÉNTIMOS 12,00 DOCE EUROS
PIEZAS AJEDREZ PIEZAS DE AJEDREZ PARA INVIDENTES MODELO STAUNTON Nº 4
80
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
4.3.
Presupuesto
Aplicación de precios.
Capítulo 1: Horas de Diseño. Nº 1.1
Ud. H
Descripción
Cantidad 350
HORAS DISEÑO PROTOTIPO
Precio (€) 38,84
TOTAL (€) 13594,00
HORAS DE DISEÑO Y DESARROLLO DEL PROTOTIPO
TOTAL CAPÍTULO 1
13594,00 €
81
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 2: Componentes Electrónicos. Nº 2.1
Ud. U
Descripción
Cantidad
MICROCONTROLADOR PIC16F877
Precio (€)
TOTAL (€)
1
9,70
9,70
2
18,32
36,64
1
12,15
12,15
64
0,82
52,48
1
1,21
1,21
1
1,23
1,23
1
0,84
0,84
1
0,28
0,28
1
1,70
1,70
1
0,20
0,20
MICROCONTROLADOR MODELO PIC16F877 DE MICROCHIP DE 8 K. DE MEMORIA DE PROGRAMA, 33 PINES DE E/S 2.2
U
ISD 2560 DISPOSITIVO GRABADOR/REPRODUCTOR DE VOZ ISD2560, CON 60 SEGUNDOS DE CAPACIDAD GRABACIÓN
2.3
U
LCD 16X1 MODULO VISUALIZADOR DE CRISTAL LÍQUIDO DE 16 CARACTERES, 1 FILA
2.4
U
OPB620 SENSOR ÓPTICO MODELO OPB620
2.5
U
74HC4514N DECODIFICADOR 1:16 MODELO 74HC4514N CON 4 ENTRADAS DE SELECCIÓN, SALIDA A NIVEL ALTO
2.6
U
MAX232 C. I. MAX232 TRANSMISIÓN/RECEPCIÓN DE SEÑALES TTL/232.
2.7
U
OSCILADOR 4 MHz CRISTAL DE CUARZO DE 4 MHz.
2.8
U
LM7805 REGULADOR DE TENSIÓN MODELO LM7805
2.9
U
PILA 9V PILA ALCALINA DE 9V
2.10 U
CONECTOR PILA 9V PORTAPILAS PILA 9V
82
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Nº
Ud.
2.11 U
Descripción
Cantidad
PULSADOR COLOR ROJO
Presupuesto
Precio (€)
TOTAL (€)
4
0,57
2,28
2
0,57
1,14
2
0,57
1,14
2
1,38
2,76
1
0,83
0,83
1
0,09
0,09
1
0,09
0,09
1
0,08
0,08
1
0,36
0,36
4
0,02
0,08
1
0,02
0,02
1
0,02
0,02
4
0,02
0,08
PULSADOR MINIATURA COLOR ROJO 2.12 U
PULSADOR COLOR AMARILLO PULSADOR MINIATURA COLOR AMARILLO
2.13 U
PULSADOR COLOR NEGRO PULSADOR MINIATURA COLOR NEGRO
2.14 U
AURICULAR MONO AURICULAR MODELO UNI TONE
2.15 U
INTERRUPTOR INTERRUPTOR DE PALANCA DE CONTACTO SIMPLE
2.16 U
LED ROJO DIODO EMISOR DE LUZ 3 MM COLOR ROJO
2.17 U
LED AMARILLO DIODO EMISOR DE LUZ 3 MM COLOR AMARILLO
2.18 U
DIODO ZENER DIODO ZENER MODELO 1N750 4,7 V
2.19 U
LM741 AMPLIFICADOR OPERACIONAL MODELO LM741
2.20 U
RESISTENCIA 1 kΩ RESISTENCIA DE 1 kΩ1/4 W
2.21 U
RESISTENCIA 10 kΩ RESISTENCIA DE 10 kΩ1/4 W
2.22 U
RESISTENCIA 100 Ω RESISTENCIA DE 1 kΩ1/4 W
2.23 U
RESISTENCIA 2,2 kΩ RESISTENCIA DE 2,2 kΩ1/4 W
83
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Nº
Ud.
2.24 U
Descripción
Cantidad
RESISTENCIA 220 kΩ
Presupuesto
Precio (€)
TOTAL (€)
4
0,02
0,08
1
0,02
0,02
3
0,12
0,36
1
0,11
0,11
1
0,11
0,11
2
0,08
0,16
4
0,13
0,52
1
0,63
0,63
2
0,57
1,14
RESISTENCIA DE 220 kΩ1/4 W 2.25 U
RESISTENCIA 18 kΩ RESISTENCIA DE 18 kΩ1/4 W
2.26 U
POTENCIÓMETRO 4,7 kΩ POTENCIÓMETRO DE 4,7 kΩ1/4 W
2.27 U
CONDENSADOR 100 nF CONDENSADOR CERÁMICO 100 nF
2.28 U
CONDENSADOR 330 nF CONDENSADOR CERÁMICO 330 nF
2.29 U
CONDENSADOR 22 pF CONDENSADOR CERÁMICO 22 pF
2.30 U
CONDENSADOR 22 µF CONDENSADOR ELECTROLÍTICO 22 µF
2.31 U
ZÓCALO 40 PINES ZÓCALO 40 PINES TORNEADO
2.32 U
ZÓCALO 28 PINES ZÓCALO 28 PINES TORNEADO
TOTAL CAPÍTULO 2
128,53 €
84
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 3: Placas de Circuito Impreso. Nº 3.1
Ud. U
Descripción
Cantidad
CIRCUITO IMPRESO
Precio (€)
TOTAL (€)
1
4,60
4,60
1
1,54
1,54
PLACA CIRCUITO IMPRESO DOBLE CARA 180 x 100 mm. 3.2
U
CIRCUITO IMPRESO PLACA CIRCUITO IMPRESO DOBLE CARA 70 x 40 mm.
TOTAL CAPÍTULO 3
6,14 €
85
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 4: Conectores y Cables. Nº 4.1
Ud. U
Descripción
Cantidad
CONECTOR CABLE PLANO
Precio (€)
TOTAL (€)
4
0,28
1,12
1
0,28
0,28
1
0,66
0,66
2
0,22
0,44
1
0,63
0,63
CONECTOR CABLE PLANO MACHO DE 14 CONTACTOS 4.2
U
CONECTOR CABLE PLANO CONECTOR CABLE PLANO MACHO DE 16 CONTACTOS
4.3
U
CONECTOR DB9 CONECTOR DB9 HEMBRA ACODADO
4.4
U
CONECTOR AURICULAR CONECTOR AURICULAR TIPO JACK 3,5 ESTEREO
4.5
U
CABLE PLANO CABLE PLANO
TOTAL CAPÍTULO 4
2,57 €
86
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 5: Varios. Nº 5.1
Ud. U
Descripción
Cantidad
CAJA PLÁSTICO
Precio (€)
TOTAL (€)
1
3,16
3,16
1
3,50
3,50
1
12,00
12,00
CAJA DE PLÁSTICO COLOR NEGRO 200 x 140 x 90 mm 5.2
U
TABLERO AJEDREZ TABLERO DE AJEDREZ, LÁMINA DE PLÁSTICO SERIGRAFIADA 400 x 410 mm
5.3
U
PIEZAS AJEDREZ PIEZAS DE AJEDREZ PARA INVIDENTES MODELO STAUNTON Nº 4
TOTAL CAPÍTULO 5
18,66 €
87
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
4.4.
Presupuesto
Resumen del Presupuesto del Prototipo.
Para desarrollar este proyecto se han utilizado los siguientes elementos: • • • •
Fuente de alimentación asimétrica: +5 V, GND. Grabador PIC16F877 PC Software de generación y depuración del código: MPLAB.
La escuela ya disponía de estos elementos, por lo que no se ha tenido que hacer ningún tipo de inversión específica en los mismos. No obstante, teniendo en cuenta una amortización a cinco años de los aparatos utilizados: Aparato
Fuente de alimentación PC
Precio
250 € 1.100 €
Precio por mes amortización 5 años 4,16 € 18,33 €
TOTAL
Meses de utilización
Coste de amortización
6 6
24,96 € 109,98 € 134,94 €
Finalmente, el presupuesto es: Total capítulo 1 Total capítulo 2 Total capítulo 3 Total capítulo 4 Total capítulo 5 Amortización a 5 años
13594,00 128,53 6,14 2,57 18,66 134,94
TOTAL
€ € € € € €
13884,84 €
TRECE MIL OCHOCIENTOS OCHENTA Y CUATRO EUROS CON OCHENTA Y CUATRO CÉNTIMOS.
Tarragona, Septiembre 2005
Firmado: Carlos Vidal García Ingeniero Técnico Industrial
88
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
4.5.
Presupuesto
Presupuesto de Puesta en Fabricación.
Para una posible puesta en fabricación del producto se elabora un nuevo presupuesto. En el mismo tenemos en cuenta una disminución del coste material por la compra de un gran número de unidades. Asímismo, la inversión específica a realizar para la fabricación del producto será mínima debido a la flexibilidad de las líneas de producción de circuito impreso y de conexión de comonentes. Por ello sólo tendremos en cuenta el coste de la línea de producción y el de montaje del circuito por parte de un operario ( carcasa y placas de circuito impreso). Se realiza el nuevo presupuesto para una previsión de vendas de 3.500 unidades. Ud. U
Descripción
Cantidad
MICROCONTROLADOR PIC16F877
Precio (€)
TOTAL (€)
1
7,70
7,70
2
14,65
29,30
1
9,70
9,70
1
0,90
0,90
1
0,64
0,64
1
0,21
0,21
1
1,40
1,40
1
0,18
0,18
MICROCONTROLADOR MODELO PIC16F877 DE MICROCHIP DE 8 K. DE MEMORIA DE PROGRAMA, 33 PINES DE E/S U
ISD 2560 DISPOSITIVO GRABADOR/REPRODUCTOR DE VOZ ISD2560, CON 60 SEGUNDOS DE CAPACIDAD GRABACIÓN
U
LCD 16X1 MODULO VISUALIZADOR DE CRISTAL LÍQUIDO DE 16 CARACTERES, 1 FILA
U
MAX232 C. I. MAX232 TRANSMISIÓN/RECEPCIÓN DE SEÑALES TTL/232.
U
OSCILADOR 4 MHz CRISTAL DE CUARZO DE 4 MHz.
U
LM7805 REGULADOR DE TENSIÓN MODELO LM7805
U
PILA 9V PILA ALCALINA DE 9V
U
CONECTOR PILA 9V PORTAPILAS PILA 9V
89
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Ud. U
Descripción
Cantidad
PULSADOR COLOR ROJO
Presupuesto
Precio (€)
TOTAL (€)
4
0,45
1,80
2
0,45
0,90
2
0,45
0,90
2
1,10
2,20
1
0,65
0,65
1
0,07
0,07
1
0,07
0,07
1
0,06
0,06
1
0,24
0,24
4
0,01
0,04
1
0,01
0,01
1
0,01
0,01
1
0,01
0,01
PULSADOR MINIATURA COLOR ROJO U
PULSADOR COLOR AMARILLO PULSADOR MINIATURA COLOR AMARILLO
U
PULSADOR COLOR NEGRO PULSADOR MINIATURA COLOR NEGRO
U
AURICULAR MONO AURICULAR MODELO UNI TONE
U
INTERRUPTOR INTERRUPTOR DE PALANCA DE CONTACTO SIMPLE
U
LED ROJO DIODO EMISOR DE LUZ 3 MM COLOR ROJO
U
LED AMARILLO DIODO EMISOR DE LUZ 3 MM COLOR AMARILLO
U
DIODO ZENER DIODO ZENER MODELO 1N750 4,7 V
U
LM741 AMPLIFICADOR OPERACIONAL MODELO LM741
U
RESISTENCIA 1 kΩ RESISTENCIA DE 1 kΩ1/4 W
U
RESISTENCIA 10 kΩ RESISTENCIA DE 10 kΩ1/4 W
U
RESISTENCIA 100 Ω RESISTENCIA DE 1 kΩ1/4 W
U
RESISTENCIA 18 kΩ RESISTENCIA DE 18 kΩ1/4 W
90
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Ud. U
Descripción
Cantidad
POTENCIÓMETRO 4,7 kΩ
Presupuesto
Precio (€)
TOTAL (€)
3
0,08
0,24
1
0,08
0,08
1
0,08
0,08
2
0,06
0,12
4
0,09
0,36
1
0,50
0,50
2
0,46
0,92
1
3,60
3,60
3
0,22
0,66
1
0,22
0,22
1
0,50
0,50
2
0,18
0,36
POTENCIÓMETRO DE 4,7 kΩ1/4 W U
CONDENSADOR 100 nF CONDENSADOR CERÁMICO 100 nF
U
CONDENSADOR 330 nF CONDENSADOR CERÁMICO 330 nF
U
CONDENSADOR 22 pF CONDENSADOR CERÁMICO 22 pF
U
CONDENSADOR 22 µF CONDENSADOR ELECTROLÍTICO 22 µF
U
ZÓCALO 40 PINES ZÓCALO 40 PINES TORNEADO
U
ZÓCALO 28 PINES ZÓCALO 28 PINES TORNEADO
U
CIRCUITO IMPRESO PLACA CIRCUITO IMPRESO DOBLE CARA 180 x 100 mm.
U
CONECTOR CABLE PLANO CONECTOR CABLE PLANO MACHO DE 14 CONTACTOS
U
CONECTOR CABLE PLANO CONECTOR CABLE PLANO MACHO DE 16 CONTACTOS
U
CONECTOR DB9 CONECTOR DB9 HEMBRA ACODADO
U
CONECTOR AURICULAR CONECTOR AURICULAR TIPO JACK 3,5 ESTEREO
91
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Ud. U
Descripción
Cantidad 1
CAJA PLÁSTICO
Presupuesto
Precio (€)
TOTAL (€)
2,52
2,52
CAJA DE PLÁSTICO COLOR NEGRO 200 x 140 x 90 mm
67,15 €
COSTE MATERIAL
4,02 €
BENEFICIO INDUSTRIAL (6%)
(13.594 / 3.500) = 3,88 €
AMORTIZACIÓN HORAS DE DISEÑO LINEA DE PRODUCCIÓN C.I. + MANO DE OBRA
10,00 €
TOTAL
85,05 €
El presupuesto de puesta en fabricación para una previsión de vendas de tres mil quinientas unidades asciende a ochenta y cinco euros con cinco céntimos.
Tarragona, Septiembre 2005
Firmado: Carlos Vidal García Ingeniero Técnico Industrial
92
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
A continuación se presupuesta la puesta en fabricación del tablero adaptado únicamente. Esto se hace atendiendo a la posibilidad de poder adquirir un reloj y varios tableros por separado. No se incluye el coste de las piezas de juego, puesto que pueden aprovecharse unas normales. Ud. U
Descripción
Cantidad
OPB620
Precio (€)
TOTAL (€)
64
0,65
41,60
1
0,95
0,95
4
0,01
0,04
4
0,01
0,04
1
1,23
1,23
1
0,22
0,22
1
0,54
0,54
1
2,80
2,80
SENSOR ÓPTICO MODELO OPB620 U
74HC4514N DECODIFICADOR 1:16 MODELO 74HC4514N CON 4 ENTRADAS DE SELECCIÓN, SALIDA A NIVEL ALTO
U
RESISTENCIA 2,2 kΩ RESISTENCIA DE 2,2 kΩ1/4 W
U
RESISTENCIA 220 kΩ RESISTENCIA DE 220 kΩ1/4 W
U
CIRCUITO IMPRESO PLACA CIRCUITO IMPRESO DOBLE CARA 70 x 40 mm.
U
CONECTOR CABLE PLANO CONECTOR CABLE PLANO MACHO DE 14 CONTACTOS
U
CABLE PLANO CABLE PLANO
U
TABLERO AJEDREZ TABLERO DE AJEDREZ, LÁMINA DE PLÁSTICO SERIGRAFIADA 400 x 410 mm
93
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
COSTE MATERIAL
Presupuesto
47,42 €
BENEFICIO INDUSTRIAL (6%)
2,84 €
AMORTIZACIÓN HORAS DE DISEÑO
(13.594 / 3.500) = 3,88 €
LINEA DE PRODUCCIÓN C.I. + MANO DE OBRA
10,00 €
TOTAL
64,14 €
El presupuesto de puesta en fabricación para una previsión de vendas de tres mil quinientas unidades asciende a sesenta y cuatro euros con catorce céntimos.
Tarragona, Septiembre 2005
Firmado: Carlos Vidal García Ingeniero Técnico Industrial
94
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
5. BIBLIOGRAFÍA
95
Bibliografía
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Bibliografía
5. Bibliografía 5.1.
Libros Consultados.
[1]
Ángulo Usategui, J. M. Angulo Martínez, I. “Microcontroladores Pic. Diseño Práctico de Aplicaciones”. Ed: Mc Graw-Hill, 1997. ISBN: 84-481-1238-5.
[2]
Ángulo Usategui, J. M. Angulo Martínez, I. Romero Yesa, S. “Microcontroladores Pic. Diseño Práctico de Aplicaciones. Segunda Parte: Pic 16F87X”. Ed: Mc Graw-Hill, 2000. ISBN: 84-8412858-3.
[3]
Floyd, Thomas. “Fundamentos de Sistemas Digitales”. Ed: Prentice-Hall, 2000. ISBN: 84-2052994-X.
[4]
Buchanan, William. “PC Interfacing, Communications and Windows Programming”. Ed: Addison-Wesley, 1999. ISBN: 0-201-17818-4.
[5]
Martínez Salamero, L. Poveda López, A. García de Vicuña, L. Guinjoan Gispert, F. Sánchez García, A. F. Sánchez Robert, F. J. “Funcions Electròniques”. Ed: UPC, 1993. ISBN: 84-8301012-7.
[6]
PFC: Massa Amado, Carlos. “Reloj de Ajedrez Para Ciegos”. URV, 2002.
[7]
PFC: Trancón Teijeira, Lorenzo N. “Calculadora Parlante”. URV, 2003.
[8]
PIC16F877 Data Sheet. Microchip. 2002.
5.2.
Páginas Web Consultadas.
[9]
http://www.microchip.com. [Software de simulación y depuración de código ensamblamdor para PIC’s (MPLAB), Data Sheet 16F877].
[10]
http://www.isd.com. [Data Sheet dispotivos ISD2560].
[11]
http://www.x-robotics.com. [Información funcionamiento displays alfanuméricos y conexión microcontrolador-PC].
[12]
http://www.micropik.com. [Consulta de precios y compra de componenetes electrónicos].
96
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
6. ANEXOS
97
Anexos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
6. Anexos. 6.1.
Manual de Usuario.
6.1.1. Diagrama del Prototipo.
CONECTOR AURICULAR
INTERRUPTOR
LED ERROR
LED BATERIA BAJA
PETICION AUDIO JUGADAS
CONECTOR TABLERO
NEXT
SET
UP
MODE
CONECTOR TABLERO
CONECTOR PC (a)
CONMUTADOR PARTIDA
BOTONES
DISPLAY (b)
Figura 1. Diagrama del reloj de ajedrez para ciegos. (a) Vista superior. (b) Vista frontal.
98
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
CONECTOR RELOJ
Figura 2. Diagrama del tablero adaptado.
Como se puede observar en la figura 1, el reloj cuenta con los siguientes botones y conectores: •
Dos botones con la función de conmutador de partida: detienen el reloj correspondiente al jugador que los pulsa. Son de color negro.
•
Cuatro botones para pedir el tiempo restante propio y del adversario, así como para configurar el tiempo de la partida e iniciar la transferencia a PC. Son de color rojo.
•
Dos botones para pedir la última jugada realizada en el tablero adaptado. Son de color amarillo.
•
Un interruptor de Encendido / Apagado.
•
Dos conectores para dos auriculares.
•
Dos conectores al tablero adaptado.
•
Un conector a PC externo.
•
Dos LED’s. Uno, de color amarillo, se encenderá cuando la batería esté próxima a agotarse. El otro, de color rojo, se encenderá cuando se realice una jugada ilegal en el tablero adaptado.
•
Un display LCD de 16 caracteres donde se muestra el tiempo restante para cada jugador.
La pantalla está dividida en dos grupos de ocho dígitos cada uno. Los ocho de la izquierda muestran información para el jugador A y los ocho de la derecha para el
99
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
jugador B. Para mostrar el tiempo se usan cuatro dígitos por jugador, dando información en formato horas.minutos o minutos.segundos. Los dos dígitos centrales sirven para indicar que reloj está corriendo. En la figura 2 observamos que el tablero adaptado cuenta con un único conector cuya función es permitir la conexión al reloj. 6.1.2. Uso del Reloj de Ajedrez. 6.1.2.1.
Como Iniciar una Partida.
Para empezar a jugar cambie el interruptor de Encendido / Apagado a la posición de encendido. El display mostrará el tiempo que se configuró para la última partida. Si desea jugar con el tiempo que se muestra en pantalla, pulse uno de los botones de conmutador de partida. El tiempo del jugador contrario empezará a correr. 6.1.2.2.
Como Configurar un Nuevo Modo de Partida.
Después de encender el reloj pulse el botón set para cambiar la configuración de la partida. Observará como los dígitos mostrados en pantalla cambian sucesivamente con cada nueva pulsación. Puede configurarse cualquiera de los siete modos que vienen predefinidos con el reloj. La secuencia de configuraciones que se mostrarán en pantalla es la siguiente: 2 horas + 1 hora finish
90 m inutos + 1 hora finish
30 m inutos finish
5 m inutos finish
4 m inutos + 2 seg/jugada
25 m inutos + 10 seg/jugada
90 m inutos + 30 seg/jugada
Para seleccionar cualquiera de estos modos y empezar una nueva partida pulse el botón set hasta que aparezca en la pantalla. Posteriormente pulse uno de los botones de conmutador de partida. El reloj empezará a correr con el tiempo seleccionado. 6.1.2.3.
Como Parar el Reloj.
Para detener el reloj pulse simultáneamente los dos botones de conmutador de partida. Observará que los dos dígitos centrales se quedan en blanco, señal de que el reloj se ha detenido. Para reanudar la partida vuelva a pulsar uno de los botones de conmutador de partida. Si, por el contrario, desea iniciar una nueva partida pulse el botón set y siga las instrucciones del apartado 2.2. Esta prestación es útil cuando se requiere la intervención del árbitro para solucionar una situación conflictiva durante la partida.
100
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
6.1.3. Uso del Tablero Adaptado. 6.1.3.1.
Como Conectar el Tablero.
Para utilizar el tablero adaptado coloque las piezas en la posición de inicio de partida (ver figura 3). Después conecte el tablero al reloj con el cable suministrado. La conexión puede realizarse en cualquiera de los dos conectores de que dispone el reloj.
Figura 3. Posición de las piezas al inicio de la partida.
Para que el reloj detecte el tablero es necesario conectarlos antes de encender el reloj. 6.1.3.2.
Como Empezar la Partida.
Encienda el reloj y configure el modo de tiempo de desee (ver apartado 2.2). Después pulse el botón de conmutador de partida correspondiente al jugador B (negras) para poner en marcha el reloj del jugador A (blancas). En este momento la partida ha empezado y el sistema está examinando las jugadas realizadas. Cuando el tablero está conectado no se puede conmutar el reloj si el bando que mueve no ha realizado primero su jugada sobre el tablero. 6.1.3.3.
Que Hacer Cuando se Produce un Error.
Si durante la partida se hace una jugada ilegal o se desconecta el tablero del reloj se encenderá el LED rojo, notificando que se ha producido un error en el tablero. Si en este momento se realiza una petición de audio de última jugada el mensaje que se escuchará es “jugada ilegal”. No será posible conmutar el reloj de juego, siguiendo la cuenta del jugador infractor. Para poder reanudar la partida es necesario volver a poner las piezas en la posición anterior al error o bién volver a conectar el tablero. Un vez hecho esto el LED rojo se apagará.
101
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
6.1.3.4.
Anexos
Como Finalizar la Partida.
Cuando la partida finalice pare el reloj (ver apartado 2.3). Con el reloj parado el sistema no examina el tablero. Si quiere reanudar la partida vuelva a pulsar el botón de conmutador de juego correspondiente. Si quiere empezar una nueva partida resitue las piezas en la posición inicial y pulse el botón set para volver a configurar el modo de tiempo del reloj. 6.1.4. Reproducción de Mensajes Orales.
Para poder escuchar mensajes orales conecte un auricular en cada conector. Cada jugador tiene tres botones: uno para escuchar su tiempo restante, otro para escuchar el tiempo de su contrincante y un tercero para escuchar la última jugada realizada en el tablero. Pulsando el botón que se encuentra más cercano al conmutador de partida escuchará el tiempo restante del contrincante en el formato horas.minutos o minutos.segundos. Pulsando el siguiente botón escuchará el tiempo restante propio. El botón más lejano al conmutador de partida sirve para escuchar la última jugada realizada si el tablero está conectado. El formato del mensaje es pieza movida.coordenada origen.coordenada destino. Cuando queda menos de un minuto de tiempo para un jugador, se entra en modo de reproducción automática. En este modo, el auricular de dicho jugador emite la cuenta atrás del minuto restante sin que el usuario tenga la necesidad de pulsar ningún botón. 6.1.5. Comunicación del Reloj con PC Externo. 6.1.5.1.
Como Configurar el PC.
Para poder transmitir la información del reloj se necesita el programa Terminal (ver CD adjunto), un PC con sistema operativo Windows y un cable de conexión para puerto serie DB9. Copie el archivo Terminal.exe en su disco duro. Posteriormente asegúrese de que la configuración de su PC es correcta. Diríjase a Inicio -> Configuración -> Panel de control -> Sistema -> Administrador de dispositivos. Haga click en Puertos COM y LPT -> Puerto de comunicaciones COM1 -> Configuración de puerto. Los datos que deben aparecer son: Bits por segundo : 9600 Bits de datos : 8 Paridad : ninguna Bits de parada : 1 Control de flujo : ninguno 6.1.5.2.
Como Realizar la Transmisión.
Una vez configurado el PC use el cable de conexión para conectar el reloj con el PC en el puerto COM1. Aségurese de que el reloj está parado (ver apartado 2.3), sino no
102
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
podrá realizarse la transmisión. Ejecute el programa Terminal. Aparecerá una ventana con el mensaje “Comunicación 232 con PIC”, “Esperando transmisión”. En este momento pulse el botón next del reloj. Esto dará inicio a la transmisión. No pulse ninguna tecla del ordenador ya que esto finalizaría inmediatemente el programa. Una vez hecha la transmisión podrá leer el mensaje “Fin de transmisión. Generando pgn”. Cuando se ha recibido toda la información del reloj el programa procede a generar un archivo pgn (las siglas PGN corresponden a Portable Game Notation) que contiene todas las jugadas almacenadas en la memoria del reloj. Finalmente aparecerá el mensaje “pgn generado!” y se finalizará el programa. Desconecte el cable que une reloj y PC y cierre la ventana del programa. Observará que en el mismo directorio donde tiene el archivo Terminal.exe ha aparecido un nuevo archivo llamado partida.pgn. Si durante la transmisión aparece el mensaje “Error: memoria vacía” cierre la ventana del programa. Esto significa que no había jugadas almacenadas en el reloj y por lo tanto no se ha generado ningun archivo.
103
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
6.2.
Anexos
Código Fuente para PIC16F877.
;**************************************************************************** ; PROGRAMA: PFC.ASM ; Realiza las tareas propias de un reloj de ajedrez de competición adaptado ; para ciegos. Controla las jugadas realizadas en tablero, almacena jugadas en ; memoria y las transmite a PC via protocolo RS232. ; ; Autor: CARLOS VIDAL GARCIA
[email protected] Septiembre 2005 ; ; Programa para PIC16F877 ; Frecuencia Reloj: 4 MHz Reloj Instrucción: 1 MHz (1us) ; Watch Dog: deshabilitado Tipo Reloj: XT ; Protección de código: deshabilitado ;**************************************************************************** LIST
P=16F877 #include "p16f877.inc"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _BODEN_OFF ;---------------------------------------------------------------------------; ; Definicion de variables ; ;---------------------------------------------------------------------------; horaA mindeA minunA secdeA secunA ehoraA emindeA eminunA esecdeA esecunA juegaA flagA finA ticsA ticsA1 nsecmov xtrtmpA Finish horaB mindeB minunB secdeB secunB ehoraB emindeB eminunB esecdeB esecunB juegaB flagB finB ticsB ticsB1 xtrtmpB pclath_temp auxAA w_temp status_temp offset
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
H'20' H'21' H'22' H'23' H'24' H'25' H'26' H'27' H'28' H'29' H'2A' H'2B' H'2C' H'2D' H'2E' H'2F' H'30'
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
H'31' H'32' H'33' H'34' H'35' H'36' H'37' H'38' H'39' H'3A' H'3B' H'3C' H'3D' H'3E' H'3F' H'40' H'41' H'42' H'7F' H'44' H'45'
; en estas variables guardaremos el tiempo ; que queda para el jugador A
; estas variables son para guardar el tiempo ; de Finish, mientras no ha caído la bandera
; ; ; ; ; ; ;
nos indica si está jugando el jugador A nos indica si ha caído la bandera de A nos indica si ha terminado el tiempo de A contador para calcular el tiempo que pasa y una variable auxiliar para este cálculo para el modo Fischer nos indica si es partida a Finish o Control +
; en estas variables guardaremos el tiempo ; que queda para el jugador B
; estas variables son para guardar el tiempo ; que queda después de la caída de bandera
; ; ; ; ; ; ;
nos indica si está jugando el jugador B nos indica si ha caído la bandera de B nos indica si ha terminado el tiempo de B contador para calcular el tiempo que pasa y una variable auxiliar para este cálculo para el modo Fischer nos indica si es partida a Finish o Control+Finish
104
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos cont_ms cont_us
EQU EQU
H'46' H'47'
; variables relativas a tablero cambio EQU H'48' coord_or1x EQU H'49' ; x fila; y columna coord_or1y EQU H'4A' cont_fila EQU H'4B' auxBB EQU H'4C' aux_actual EQU H'4D' aux_anterior EQU H'4E' aux_piezas EQU H'4F' coord_desx EQU H'50' coord_desy EQU H'51' control EQU H'52' aux_x EQU H'53' aux_y EQU H'54' fila EQU H'55' columna EQU H'56' enroque EQU H'57' bit EQU H'58' auxAA1 EQU H'59' auxCC EQU H'5A' coord_or2x EQU H'5B' coord_or2y EQU H'5C' tics_tab EQU H'5D' tics_tab1 EQU H'5E' ; variables relativas al modulo de audio reproA EQU H'5F' reproB EQU H'60' auto EQU H'61' contA EQU H'62' cont2A EQU H'63' msg1A EQU H'64' msg2A EQU H'65' msg3A EQU H'66' msg4A EQU H'67' msg5A EQU H'68' msg6A EQU H'69' contB EQU H'6A' cont2B EQU H'6B' msg1B EQU H'6C' msg2B EQU H'6D' msg3B EQU H'6E' msg4B EQU H'6F' msg5B EQU H'70' msg6B EQU H'71' ; otras variables base_ram aux_anterior0 offset_piezas offset_captura pieza_jugada estado_botones #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE
EQU EQU EQU EQU EQU EQU
DIS_RW DIS_RS DIS_E b_jugA b_jugB b_set b_up b_mode b_next b_jugadaA b_jugadaB
H'72' 0x73 ; tabla anterior0 77:7E banco 0 0x74 0x75 0x76 0x43 D'1' D'0' D'0' D'6' D'7' D'5' D'4' D'3' D'2' D'1' D'0'
; ; ; ; ; ; ; ; ; ; ;
PORTA PORTA PORTE PORTB PORTB PORTB PORTB PORTB PORTB PORTB PORTB
105
B_B B_A A_B A_A
Anexos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE
eom_isd1 eom_isd2 pr_isd1 pr_isd2 pd_isd1 pd_isd2 ce_isd1 ce_isd2 enable enable2 led_error RETARDO1 RETARDO2 RETARDO3 b_ram anterior0 anterior actual piezas una hora horas minuto minutos segundos jug_ilegal
Anexos
D'2' ; PORTC D'3' ; PORTC D'0' ; PORTC D'1' ; PORTC D'4' ; PORTC D'5' ; PORTC D'2' ; PORTE D'1' ; PORTE D'3' ; PORTA ent1 D'2' ; PORTA ent2 D'5' ; PORTA D'15' D'200' D'100' h'10' ; direccion base ram 0x77 ; tabla anterior0 0x77:0x7E, banco 0 0xE8 ; tabla anterior 0xE8:0xEF 0xE0 ; tabla actual 0xE0:0xE7 0xA0 ; @ inicial array piezas A0:DF banco 1 (64B) B'10000111' ;@ DE UNA B'10001100' ;@ DE HORA B'10010001' ;@ DE HORAS B'10010110' ;@ DE MINUTO B'10011011' ;@ DE MINUTOS B'10100000' ;@ DE SEGUNDOS B'11011011' ;@ de jugada ilegal
;-------------------------------------------------------------------------; ; Definición de macros ; ;-------------------------------------------------------------------------; banco0 bcf bcf endm banco1 bsf bcf endm banco2 bcf bsf endm banco3 bsf bsf endm pagina0 bcf bcf endm pagina1 bcf bsf endm pagina2 bsf bcf endm
macro STATUS,RP0 STATUS,RP1
; salta al banco 0
macro STATUS,RP0 STATUS,RP1
; salta al banco 1
macro STATUS,RP0 STATUS,RP1
; salta al banco 2
macro STATUS,RP0 STATUS,RP1
; salta al banco 3
macro PCLATH,4 PCLATH,3 macro PCLATH,4 PCLATH,3 macro PCLATH,4 PCLATH,3
leer_puntero macro bcf STATUS,IRP
; accede al banco 0
106
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos movwf FSR bcf FSR,7 movf INDF,W endm escribe_puntero bcf movwf bcf movf movwf endm
macro STATUS,IRP FSR FSR,7 auxAA,W INDF
leer_punterob1 bcf movwf bsf movf endm
macro STATUS,IRP FSR FSR,7 INDF,W
escribe_punterob1 macro bcf STATUS,IRP movwf FSR bsf FSR,7 movf auxAA,W movwf INDF endm leer_punterob2 bsf movwf bcf movf endm
macro STATUS,IRP FSR FSR,7 INDF,W
escribe_punterob2 macro bsf STATUS,IRP movwf FSR bcf FSR,7 movf auxAA,W movwf INDF endm leer_punterob3 bsf movwf bsf movf endm
macro STATUS,IRP FSR FSR,7 INDF,W
escribe_punterob3 macro bsf STATUS,IRP movwf FSR bsf FSR,7 movf auxAA,W movwf INDF endm absoluto
macro btfss goto movwf goto movwf comf incf endm
STATUS,C $+3 auxAA $+4 auxAA auxAA,f auxAA,f
; accede al banco 0
; accede al banco 1
; accede al banco 1
; accede al banco 2
; accede al banco 2
; accede al banco 3
; accede al banco 3
; calcula el valor absoluto del numero ; pasado por W. Se devuelve por auxAA.
107
Anexos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos mira_reproduce btfss goto btfss bsf btfss goto btfss bsf endm
macro reproA,0 ; $+3 ; PORTC,eom_isd1 reproA,1 ; reproB,0 ; $+3 ; PORTC,eom_isd2 reproB,1 ;
Anexos
estamos reproduciendo por A? no ; fin de mensaje A? si no, estamos reproduciendo por B? no ; si, fin de mensaje B? si
;-------------------------------------------------------------------------; ; Direccion de inicio del programa principal y la de la rutina de ; atencion a la interrupcion ;-------------------------------------------------------------------------; ORG 0 goto principal ORG 4 movwf swapf banco0 movwf movf movwf clrf goto
w_temp STATUS,W
; salvamos el registro W ; y el registro de estado
status_temp PCLATH,W pclath_temp PCLATH isr
; no hemos cambiado ningún flag ; salva parte alta del contador de programa
;-------------------------------------------------------------------------; ; Rutina de Inicialización ; ;-------------------------------------------------------------------------; inicializar
banco0 clrf clrf clrf clrf banco1 movlw movwf clrf movlw movwf clrf movlw movwf
H'06' ADCON1 TRISA H'FF' TRISB TRISD b'10001100' TRISC
; PORTC [2:3,7] entradas, [0:1]y[4:6] salidas
clrf
TRISE
; PORTE todo salidas
PORTA PORTB PORTD PORTE
banco0
; inicializamos los puertos ; limpiando los latches de salida ; vamos al banco 1 de memoria ; configuramos PORTA como ; I/O digital ; PORTA todo salidas ; PORTB todo entradas ; ; PORTD todo salidas
; vuelve al banco 0
bsf bsf bsf bsf bsf bsf
PORTA,enable ; enable=1 tablero deshabilitado PORTA,enable2 PORTC,pr_isd1 PORTC,pr_isd2 ; pr_isd1=1, pr_isd2=1 por precaucion PORTE,ce_isd1 PORTE,ce_isd2 ; ce_isd1=ce_isd2=1, deshabilitado
bsf bsf
PORTC,pd_isd1 ; duerme ISD1 PORTC,pd_isd2 ; duerme ISD2
call
configura_lcd ; configuracion del lcd
banco1 movlw H'00' movwf OPTION_REG banco0
; ponemos el preescaler del TMR0 ; a 1:2 y habilitamos los pull-ups del PORTB ; volvemos al banco 0
108
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
movlw movwf movwf movwf movwf movwf movwf movwf movwf movwf
Anexos
H'00' ; inicializacion de variables juegaA juegaB xtrtmpA xtrtmpB nsecmov auto reproA reproB pieza_jugada
movlw h'FF' movwf estado_botones clrf control
; inicializa control (bit0=0, juegan
blancas) clrf movlw movwf movlw movwf movlw movwf clrf
cambio h'0F' enroque d'8' tics_tab1 d'122' tics_tab PCLATH
movlw H'A0' movwf INTCON
; encuestas cada 0.5 segundos
; habilitamos interrupciones: ; GIE y T0IE = 1, T0IF = 0
movlw H'00' call leeree
; inicializamos el offset de la EEPROM
movwf offset
; el valor de la dirección de la ultima
con cuenta return ;-------------------------------------------------------------------------; ; isr: interrupciones cada 512us ;-------------------------------------------------------------------------; isr
mira_reproduce btfss juegaA,0 ; Corre el reloj del jugador A? goto quienjuega2 ; no, continúa decfsz ticsA,f ; si, decrementa el contador de tiempo
A goto decfsz goto call movlw movwf movlw movwf goto quienjuega2
si_tablero ticsA1 contaA cadasecA D'217' ticsA D'9' ticsA1 si_tablero
; si no ha llegado a 0 continua ; si es 0 ejecutar cadasecA ; y poner ticsA al valor inicial ; ticsA = 217 ; no
btfss juegaB,0 ; corre el reloj del jugador B? goto si_tablero ; no, volver de la ISR decfsz ticsB,f ; si, decrementa el contador de tiempo
B goto decfsz goto call movlw movwf movlw movwf goto
si_tablero ticsB1 contaB cadasecB D'217' ticsB D'9' ticsB1 si_tablero
; si no ha llegado a 0 continua ; si es 0 ejecutar cadasecB ; y poner ticsB al valor inicial ; ticsB = 217 ; volver de la ISR
109
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos contaA contaB si_tablero
si_tablero1 restaura
movlw D'217' movwf ticsA goto si_tablero movlw D'217' movwf ticsB btfsc goto btfss goto btfsc goto btfss goto decfsz goto decfsz goto bsf movlw movwf movlw movwf
cambio,7 $+3 cambio,4 restaura juegaA,0 $+3 juegaB,0 restaura tics_tab,f restaura tics_tab1,f si_tablero1 cambio,6 d'8' tics_tab1 d'122' tics_tab
Anexos
; y poner ticsA al valor inicial ; y poner ticsB al valor inicial ; ; ; ; ; ; ; ;
tablero conectado? si no, tablero 2 conectado? no si, juega A? no juega B? no
; bit(6) cambio=1 ; encuestas cada 0.5 segundos
banco0 movf pclath_temp,W movwf PCLATH swapf status_temp,W
; restauramos registro de estado
movwf STATUS
; y lo guardamos en el registro de
original estado swapf swapf bcf bsf retfie
w_temp,f w_temp,W INTCON,T0IF INTCON,T0IE
; ; ; ;
restauramos el registro W sin variar los flags limpiamos el flag de interrupción del TMR0 permitimos la interrupción del TMR0 ; y salimos de la ISR
;-------------------------------------------------------------------------; ; Esta rutina se llama desde la ISR cada ; ; segundo que pasa para el jugador A. ; ;-------------------------------------------------------------------------; cadasecA
cadasecA_1
bsf bsf btfsc return decf incfsz goto movlw movwf decf incfsz goto movlw movwf decf incfsz goto movlw movwf decf incfsz goto movlw movwf decf btfss
PORTA,enable ; enable=1 tablero deshabilitado PORTA,enable2 finA,0 ; se ha terminado el tiempo total de A? ; si, volver sin hacer nada. secunA,f ; no, decremento un segundo el contador secunA,W ; eran las unidades de segundo = 0? cadasecA_1 ; no, actualizar variables H'09' ; si, poner las unidades a 9 secunA secdeA,f ; y decrementar las decenas de segundo secdeA,W ; eran las decenas de segundo = 0? cadasecA_1 ; no, actualizar variables H'05' ; si, poner las decenas a 5 secdeA minunA,f ; decrementar las unidades de minuto minunA,W ; eran las unidades de minuto = 0? cadasecA_1 ; no, actualizar variables H'09' ; si, poner las unidades a 9 minunA mindeA,f ; decrementar las decenas de minuto mindeA,W ; eran las decenas de minuto = 0? cadasecA_1 ; no, actualizar variables H'05' ; si, poner las decenas a 5 mindeA horaA,f ; y decrementar la hora PORTE,ce_isd1
110
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos bsf bsf
Anexos
PORTE,ce_isd1 cambio,5 ; se ha cambiado la configuracion del puerto
D banco1 clrf TRISD banco0 clrf PORTD call lcd_tiempoA movf btfss goto movf btfss goto movf btfss goto movf btfss goto movf btfss goto bcf btfss goto Finish fiA extraA
secunA,f STATUS,Z autoA secdeA,f STATUS,Z autoA minunA,f STATUS,Z autoA mindeA,f STATUS,Z autoA horaA,f STATUS,Z autoA auto,0 flagA,0 extraA
; PORTD todo salidas ; si, fin de la encuesta ; actualizamos las variables ; comprobamos si el contador es = 0
; si no lo es volvemos ; si el contador = 0 ; miramos si está bandera puesta ; si no, comprobamos si hay tiempo de
bsf finA,0 return btfss xtrtmpA,0 ; comprobamos si hay tiempo de Finish goto fiA ; no hay bsf flagA,0 ; si hay, ponemos la bandera bcf xtrtmpA,0 ; quitamos el indicador de tiempo de finish movf esecunA,W ; y volcamos las variables de tiempo de
Finish movwf Control, que son movf movwf movf movwf movf movwf movf movwf btfss bsf bsf D banco1 clrf banco0 clrf call return autoA
movf btfss return movf btfss return movf btfss return bsf return
secunA
; en las variables de tiempo de
esecdeA,W ; las que maneja el programa en todo momento secdeA eminunA,W minunA emindeA,W mindeA ehoraA,W horaA PORTE,ce_isd1 PORTE,ce_isd1 cambio,5 ; se ha cambiado la configuracion del puerto TRISD
; PORTD todo salidas
PORTD lcd_tiempoA
; si, fin de la encuesta ; actualizamos las variables
horaA,f STATUS,Z minunA,f STATUS,Z mindeA,f STATUS,Z auto,0
111
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
;-------------------------------------------------------------------------; ; Esta rutina se llama desde la ISR cada ; ; segundo que pasa para el jugador B. ; ;-------------------------------------------------------------------------; ;--------------- Comentarios análogos a la función cadasecA --------------; cadasecB
cadasecB_1
bsf bsf btfsc return decf incfsz goto movlw movwf decf incfsz goto movlw movwf decf incfsz goto movlw movwf decf incfsz goto movlw movwf decf btfss bsf bsf
PORTA,enable ; enable=1 tablero deshabilitado PORTA,enable2 finB,0 secunB,f secunB,W cadasecB_1 H'09' secunB secdeB,f secdeB,W cadasecB_1 H'05' secdeB minunB,f minunB,W cadasecB_1 H'09' minunB mindeB,f mindeB,W cadasecB_1 H'05' mindeB horaB,f PORTE,ce_isd1 PORTE,ce_isd1 cambio,5 ; se ha cambiado la configuracion del puerto
D banco1 clrf TRISD banco0 clrf PORTD call lcd_tiempoB
fiB extraB
movf btfss goto movf btfss goto movf btfss goto movf btfss goto movf btfss goto bcf btfss goto bsf return goto bsf bcf movf
; PORTD todo salidas ; si, fin de la encuesta ; actualizamos las variables
secunB,f STATUS,Z autoB secdeB,f STATUS,Z autoB minunB,f STATUS,Z autoB mindeB,f STATUS,Z autoB horaB,f STATUS,Z autoB auto,1 flagB,0 extraB finB,0 btfss xtrtmpB,0 fiB flagB,0 xtrtmpB,0 esecunB,W
112
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos movwf movf movwf movf movwf movf movwf movf movwf btfss bsf bsf D
autoB
secunB esecdeB,W secdeB eminunB,W minunB emindeB,W mindeB ehoraB,W horaB PORTE,ce_isd1 PORTE,ce_isd1 cambio,5 ; se ha cambiado la configuracion del puerto
banco1 clrf TRISD banco0 clrf PORTD call lcd_tiempoB return movf btfss return movf btfss return movf btfss return bsf return
Anexos
; PORTD todo salidas ; si, fin de la encuesta ; actualizamos las variables
horaB,f STATUS,Z minunB,f STATUS,Z mindeB,f STATUS,Z auto,1
;-------------------------------------------------------------------------; ; principal ; ;-------------------------------------------------------------------------; principal
call
inicializar
; configuramos puertos, TMR0, etc.
inicio
clrf auto call cogeree ; ponemos constantes de la eeprom en las var's de juego pagina1 call comp_tablero ; mira si tablero conectado pagina0 movlw H'00' movwf finA movwf finB movwf flagA movwf flagB
; inicializacion variables de partida y audio
movlw b_ram ; @ base ram 0x110 banco 2 movwf base_ram movlw D'217' ; inicializa contadores movwf ticsA ; ticsA=217, ticsB=217 movwf ticsB movlw D'9' ; ticsA1=ticsB1=9 movwf ticsA1 movwf ticsB1 movlw h'C7' call lcd_i btfsc cambio,7 ; tablero conectado? goto $+3 ; si btfss cambio,4 ; no, tablero 2 conectado? goto botones ; no pagina2 ; si call inicio_anterior ; inicializa la tabla anterior call inicio_piezas ; inicializa la tabla piezas
113
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
pagina0 botones
botones2
btfsc cambio,7 ; tablero conectado? goto botones2 ; si btfsc cambio,4 ; tablero 2 conectado? goto botones2 ; si btfss PORTB,b_jugA ; no, boton A pulsado? goto empiezaB ; si, saltamos a empiezaB btfss PORTB,b_jugB ; boton B pulsado? goto empiezaA ; si, saltamos a empiezaA btfss PORTB,b_set ; boton set pulsado? call setcuenta ; si, ejecutamos setcuenta btfsc PORTB,b_next ; boton next pulsado? goto $+d'10' btfss estado_botones,b_next goto botones bcf estado_botones,b_next pagina1 ; si, se inicia transferencia 232 call tx_rs232 pagina0 goto botones call cont_20ms btfsc PORTB,b_next bsf estado_botones,b_next goto botones
;-------------------------------------------------------------------------; ; empiezaA, empiezaB ;-------------------------------------------------------------------------; empiezaA
empiezaB
bsf clrf call goto
juegaA,0 TMR0 lcd_jugA partida
; indicamos que juega el jugador A ; inicializa TMR0
bsf clrf call goto
juegaB,0 TMR0 lcd_jugB partida
; indicamos que juega el jugador B ; inicializa TMR0
; y entramos en el bucle de partida
; y entramos en el bucle de partida
;-------------------------------------------------------------------------; ; partida, cmpset ;-------------------------------------------------------------------------; partida
jugA
goto btfss goto bcf goto call btfsc bsf
btfsc PORTB,b_jugA ; boton jugador A pulsado? $+5 ; no estado_botones,b_jugA $+6 estado_botones,b_jugA jugB ; si, juega B cont_20ms PORTB,b_jugA estado_botones,b_jugA
btfsc goto btfss goto bcf goto call btfsc bsf goto
PORTB,b_jugB ; boton jugador B pulsado? $+5 ; no estado_botones,b_jugB cmp_set estado_botones,b_jugB jugA ; si, juega A cont_20ms PORTB,b_jugB estado_botones,b_jugB cmp_set
btfsc juegaA,0 goto jugA_1 btfsc cambio,7
; variable actualizada? ; si la var ya esta actualizada saltamos ; tablero conectado?
114
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
jugA_1
jugB
jugB_1
cmp_set cmp_2 cmp_4
cmp_1
cmp_3
Anexos
goto $+3 btfss cambio,4 ; no, tablero2 conectado? goto $+3 btfsc control,0 ; turno de las blancas? goto jugA_1 bsf juegaA,0 ; si no, se actualiza juegaA=1, juegaB=0 bcf juegaB,0 btfss nsecmov,0 ; estamos en algun modo fischer? goto $+4 pagina1 call incrementoB ; si, incrementar var tiempo B call lcd_jugA ; no, actualizar display señal quien juega btfsc estado_botones,b_jugA goto partida bcf juegaA,0 bcf juegaB,0 call lcd_nojug goto partida btfsc juegaB,0 ; variable actualizada? goto jugB_1 ; si la var ya esta actualizada saltamos btfsc cambio,7 ; tablero conectado? goto $+3 btfss cambio,4 ; no, tablero2 conectado? goto $+3 btfss control,0 ; turno de las negras? goto jugB_1 bsf juegaB,0 ; si no, se actualiza juegaA=1, juegaB=0 bcf juegaA,0 btfss nsecmov,0 ; estamos en algun modo fischer? goto $+4 pagina1 call incrementoA ; si, incrementar var tiempo A call lcd_jugB ; no, actualizar display señal quien juega btfsc estado_botones,b_jugB goto partida bcf juegaA,0 bcf juegaB,0 call lcd_nojug goto partida btfsc reproA,0 goto cmp_1 btfsc reproB,0 goto cmp_3 btfss auto,0 goto $+5 btfsc reproA,0 goto $+3 btfsc juegaA,0 call repsecA_A btfss auto,1 goto cmp_set1 btfsc reproB,0 goto cmp_set1 btfss juegaB,0 goto cmp_set1 pagina1 call repsecB_B pagina0 goto cmp_set1 pagina1 call reproduceA pagina0 goto cmp_2 pagina1 call reproduceB pagina0
; ; ; ; ; ;
estamos reproduciendo para el jugador A? si, saltamos estamos reproduciendo para el jugador B? si, saltamos modo autoA? no
; no, modo autoB? ; no
; si
115
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
cmp_set1
goto
cmp_4
btfsc goto btfss goto bcf goto goto call btfsc bsf
PORTB,b_set ; miramos si boton pulsado $+6 estado_botones,b_set $+7 estado_botones,b_set boton_set $+4 cont_20ms PORTB,b_set estado_botones,b_set
btfsc goto btfss goto bcf call goto call btfsc bsf
PORTB,b_mode $+6 estado_botones,b_mode $+7 estado_botones,b_mode tiempoA_B $+4 cont_20ms PORTB,b_mode estado_botones,b_mode
btfsc goto btfss goto bcf call goto call btfsc bsf
PORTB,b_up $+6 estado_botones,b_up $+7 estado_botones,b_up tiempoB_A $+4 cont_20ms PORTB,b_up estado_botones,b_up
btfsc PORTB,b_next goto $+d'17' btfss estado_botones,b_next goto cmp_set4 bcf estado_botones,b_next btfsc juegaA,0 goto $+9 btfsc juegaB,0 goto $+7 pagina1 ; si, se inicia transferencia 232 call tx_rs232 pagina0 goto cmp_set4 call tiempoA_A goto cmp_set4 goto $+4 call cont_20ms btfsc PORTB,b_next bsf estado_botones,b_next cmp_set4
btfsc goto btfss goto bcf goto goto call btfsc bsf
PORTB,b_jugadaA $+6 estado_botones,b_jugadaA $+7 estado_botones,b_jugadaA cmp_set2 $+4 cont_20ms PORTB,b_jugadaA estado_botones,b_jugadaA
btfsc PORTB,b_jugadaB goto $+6
116
Anexos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
boton_set
boton_set1 iniciar
btfss goto bcf goto goto call btfsc bsf goto
estado_botones,b_jugadaB $+7 estado_botones,b_jugadaB cmp_set3 $+4 cont_20ms PORTB,b_jugadaB estado_botones,b_jugadaB tiempo_encuesta
btfsc goto btfsc goto goto call
juegaA,0 boton_set1 juegaB,0 boton_set1 inicio tiempoB_B
goto
partida
; ; ; ; ; ;
juegaA=1? si, se repruduce un mensaje juegaB=1? si, se repruduce un mensaje iniciar nueva partida los relojes han de estar parados para ; una nueva partida
tiempo_encuesta btfsc cambio,7 ; goto $+3 btfss cambio,4 goto partida btfss cambio,6 ; tiempo goto partida pagina2 goto inicio_encuesta ; tiempo_enc1 bcf cambio,6 goto partida ; cmp_set2
cmp_set3
Anexos
tablero conectado?
de encuesta? inicia la encuesta no, repite el bucle
pagina1 call repro_jugadaA pagina0 goto partida pagina1 call repro_jugadaB pagina0 goto partida
;-------------------------------------------------------------------------; ; setcuenta: pone la cuenta inicial de la proxima partida ;-------------------------------------------------------------------------; setcuenta
setcuenta_1
salir
movlw addwf movlw subwf btfsc clrf call call btfss goto btfss goto btfss goto goto
D'12' offset,f D'84' offset,W STATUS,Z offset cogeree espera_set PORTB,b_jugA salir PORTB,b_jugB salir PORTB,b_set setcuenta setcuenta_1
; ; ; ;
aumentamos offset para mostrar el siguiente modo hemos llegado al modo 84? será cero si hemos llegado
movf banco2 movwf movlw movwf call return
offset,W
; guardamos el offset
EEDATA H'00' EEADR escribiree
; para que la próxima vez que ; se encienda el reloj, se empiece ; con la cuenta seleccionada
; si, offset=0 ; esperamos a que se suelte el boton set ; si se pulsa algun boton A o B salimos
; boton set pulsado?
;-------------------------------------------------------------------------
117
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
; espera_set: espera a que se suelte el boton set ;------------------------------------------------------------------------espera_set
btfss goto call btfss goto return
PORTB,b_set $-1 cont_20ms PORTB,b_set $-4
; ; ; ; ;
boton set pulsado? si, salta no, temporiza 20ms por si hay rebotes boton set pulsado? si, salta
;-------------------------------------------------------------------------; ; Rutina para coger de la EEPROM del PIC la cuenta inicial. ; ;-------------------------------------------------------------------------; cogeree
movlw addwf call movwf movlw addwf call movwf movwf movlw addwf call movwf movwf movlw addwf call movwf movwf movlw addwf call movwf movwf movlw addwf call movwf movwf movlw addwf call movwf movwf movlw addwf call movwf movwf movlw addwf call movwf movwf movlw addwf call movwf movwf movlw addwf call movwf movwf
H'01' offset,W leeree nsecmov H'02' offset,W leeree xtrtmpA xtrtmpB H'03' offset,W leeree horaA horaB H'04' offset,W leeree mindeA mindeB H'05' offset,W leeree minunA minunB H'06' offset,W leeree secdeA secdeB H'07' offset,W leeree secunA secunB H'08' offset,W leeree ehoraA ehoraB H'09' offset,W leeree emindeA emindeB H'0A' offset,W leeree eminunA eminunB H'0B' offset,W leeree esecdeA esecdeB
; 1a posición de la eeprom + ; offset desde el principio en W ; leemos un byte de la EEPROM ; y lo ponemos en el registro. ; hacemos lo mismo sucesivamente para ; todos los registros de los dos jugadores
118
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos movlw addwf call movwf movwf call call return
Anexos
H'0C' offset,W leeree esecunA esecunB lcd_tiempoA lcd_tiempoB
;-------------------------------------------------------------------------; ; Rutina para leer un byte de la memoria de datos EEPROM ;-------------------------------------------------------------------------; leeree movwf banco3 bcf bsf banco2 movf banco0 return
banco2 EEADR
; vamos al banco 2 de memoria ; ponemos la dirección a leer en EEADR
EECON1,EEPGD ; apuntamos a la memoria de datos EECON1,RD ; empezamos la operación de lectura ; volvemos al banco 2 EEDATA,W ; ponemos al byte leído en W
;-------------------------------------------------------------------------; ; Rutina para escribir un byte en la memoria de datos EEPROM ;-------------------------------------------------------------------------; escribiree
banco3 bcf bsf bcf movlw movwf movlw movwf bsf bsf bcf btfsc goto banco0 return
EECON1,EEPGD EECON1,WREN INTCON,GIE H'55' EECON2 H'AA' EECON2 EECON1,WR INTCON,GIE EECON1,WREN EECON1,WR $-1
; vamos al banco 3 de memoria apuntamos a la memoria de datos habilitamos la escritura deshabilitamos interrupciones secuencia de instrucciones ; especial requerida por ; Microchip
; ; ; ;
; ; ; ; ;
empezar la operación de escritura habilitamos interrupciones deshabilitamos la escritura esperamos a que termine la operación de escritura
;------------------------------------------------------------------------; configura_lcd: configuracion inicial del display ;------------------------------------------------------------------------configura_lcd bcf call movlw dots call movlw call movlw call movlw del texto call call return
PORTA,DIS_RW ; escribir en el módulo LCD borra_pantalla ; reset inicial b'00110000' ; trabajamos con bus de 8 bits, matriz 5x7 lcd_i b'00111000' lcd_i b'00001100' lcd_i b'00000110'
; activacion de dos lineas ; enciende pantalla, cursor apagado ; incremento del cursor, no desplazamiento
lcd_i borra_pantalla
;------------------------------------------------------------------------; borra_pantalla: borra la pantalla del display ;------------------------------------------------------------------------borra_pantalla call
movlw b'00000001' lcd_i
; Borra la pantalla
119
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos call cont_20ms movlw b'00000010'
Anexos
; Nos situamos en la posicion 0 de la memoria
DDRAM call lcd_i call cont_20ms return ;-------------------------------------------------------------------------; ; lcd_jugA : actualiza indicador de tiempo jugador A ;-------------------------------------------------------------------------; lcd_jugA
movlw call movlw call movlw call movlw call return
h'C0' lcd_i ' ' lcd_c h'87' lcd_i '>' lcd_c
; direccion 40h, instruccion b'11000000'
; direccion 07h
;-------------------------------------------------------------------------; ; lcd_jugB : actualiza indicador de tiempo jugador B ;-------------------------------------------------------------------------; lcd_jugB
movlw call movlw call movlw call movlw call return
h'C0' lcd_i 'coord_or1y ; cambio, bit0=1
; b->coord_or2y ; cambio, bit1=1
; bit0 de cambio =1? ; bit2 de 'cambio' =0? ; no, error guardamos coord_desx
; b->coord_or1y ; cambio, bit2=1 jugada completa
;-------------------------------------------------------------------------
164
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
; actualiza: actualiza anterior con actual ;------------------------------------------------------------------------actualiza
movlw movwf movlw movwf
actual aux_actual anterior aux_anterior
actualiza1
movf aux_actual,W leer_punterob1 movwf auxAA movf aux_anterior,W escribe_punterob1 movlw anterior ; miramos si hemos acabado de recorrer el
array subwf movwf movlw subwf btfsc return incf incf goto
aux_anterior,W auxAA H'07' auxAA,W STATUS,Z ; aux_actual-actual=7? aux_actual aux_anterior actualiza1
;------------------------------------------------------------------------; actualiza_a0: actualiza anterior0 con actual ;------------------------------------------------------------------------actualiza_a0 movlw movwf movlw movwf
actual aux_actual anterior0 aux_anterior0
actualiza_a01 movf aux_actual,W leer_punterob1 movwf auxAA movf aux_anterior0,W escribe_puntero movlw anterior0 ; miramos si hemos acabado de recorrer el array subwf aux_anterior0,W movwf auxAA movlw H'07' subwf auxAA,W btfsc STATUS,Z ; aux_actual-actual=7? return incf aux_actual incf aux_anterior0 goto actualiza_a01 ;------------------------------------------------------------------------; pon_error: enciende led de error y entra en un bucle ;------------------------------------------------------------------------pon_error
bsf
PORTA,led_error
loop1
call encuesta ; esperamos a que se restablezca la posicion pagina2 movlw actual ; en el tablero (actual=anterior0) movwf aux_actual movlw anterior0 movwf aux_anterior0
compara11
movf aux_anterior0,W leer_puntero movwf auxAA ; contenido de la @ aux_anterior0 en auxAA movf aux_actual,W
165
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
leer_punterob1 subwf auxAA,W btfss STATUS,Z ; contenido igual? goto pon_error1 ; no movlw anterior0 subwf aux_anterior0,W movwf auxAA movlw h'07' subwf auxAA,W ; hemos llegado al final del array? btfsc STATUS,Z goto compara12 ; si, reiniciamos el proceso incf aux_actual ; no incf aux_anterior0 goto compara11 pon_error1
btfss goto btfss goto goto
PORTB,b_jugadaA rep_errorA PORTB,b_jugadaB rep_errorB loop1
compara12
btfsc goto call bcf bcf bcf movlw andwf bcf nop return
control,7 ; se ha dado un jaque? compara13 ; si actualiza ; actualiza anterior con actual cambio,0 cambio,1 cambio,2 h'01' control,f PORTA,led_error
compara14
; mira si hay peticion de audio
compara13
movlw piezas ; hay que corregir array piezas addwf offset_piezas,f movf coord_or1y,W movwf auxAA swapf auxAA,f movf coord_or1x,W addwf auxAA,f movf offset_piezas,W escribe_punterob1 btfss control,4 ; ademas se ha producido una captura? goto compara14 ; no movlw piezas addwf offset_captura,f decf offset_captura movf offset_captura,W leer_punterob1 movwf auxAA bcf auxAA,4 movf offset_captura,W escribe_punterob1 goto compara14
rep_errorA
pagina1 call reset_isd1 pagina2 movlw jug_ilegal movwf PORTD pagina0 call cont_20ms bcf PORTE,ce_isd1 ; ce=0, habilitado call cont_20ms call cont_20ms bsf PORTE,ce_isd1 ; ce=1, deshabilitado pagina2 goto loop1
166
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
rep_errorB
Anexos
pagina1 call reset_isd2 pagina2 movlw jug_ilegal movwf PORTD pagina0 call cont_20ms bcf PORTE,ce_isd2 ; ce=0, habilitado call cont_20ms call cont_20ms bsf PORTE,ce_isd2 ; ce=1, deshabilitado pagina2 goto loop1
;------------------------------------------------------------------------; examina: comprueba si la jugada realizada es correcta ;------------------------------------------------------------------------examina goto movf subwf btfss goto movf subwf btfss goto movf movwf movf movwf examina0
examina11
examina1
btfss cambio,1 examina0 ; coord_or1x,W ; coord_desx,W STATUS,Z ; examina0 ; coord_or1y,W ; coord_desy,W STATUS,Z ; examina0 ; coord_or2x,W coord_or1x coord_or2y,W coord_or1y
; bit cambio1=1? no si coord_or1x=coord_desx? no si coord_or1y=coord_desy? no
movf coord_or1x,W subwf coord_desx,W btfss STATUS,Z goto $+5 movf coord_or1y,W subwf coord_desy,W btfsc STATUS,Z return movlw h'F0' andwf enroque,W btfsc STATUS,Z goto $+8 pagina1 goto torre_enroque movlw h'0F' andwf enroque,f call actualiza_array goto turno_juego1 clrf offset_piezas movlw piezas ; buscamos pieza en array 'piezas' movwf aux_piezas incf aux_piezas incf offset_piezas movf aux_piezas,W leer_punterob1 movwf auxAA andlw h'0F' ; aplica mascara para seleccionar coord x subwf coord_or1x,W ; igual a coord_or1x? btfsc STATUS,Z goto examina2 ; si movlw h'DF' ; no subwf aux_piezas,W ; hemos llegado al final del array? btfsc STATUS,Z
167
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos goto incf incf goto
pon_error ; si, es un error aux_piezas ; no offset_piezas examina1
movf andlw movwf swapf subwf btfsc goto incf incf goto
auxAA,W h'F0' ; auxAA auxAA,W coord_or1y,W ; STATUS,Z examina3 ; aux_piezas ; offset_piezas examina1
examina6
incf incf incf incf goto
aux_piezas aux_piezas offset_piezas offset_piezas examina1
examina3
decf aux_piezas movf aux_piezas,W leer_punterob1 movwf auxAA btfsc auxAA,3 goto examina4 btfsc auxAA,4 goto examina6 btfsc control,0 goto pon_error goto examina5 btfsc auxAA,4 goto examina6 btfss control,0 goto pon_error
examina2
examina4
examina5
movlw andwf movwf movwf movlw subwf btfsc goto movlw subwf btfsc goto movlw subwf btfsc goto movlw subwf btfsc goto movlw subwf btfsc goto
Anexos
aplica mascara para seleccionar coord y igual a coord_or1y? si no
; miramos turno juego y pieza viva
; la pieza es blanca (=0)? ; no ; si, miramos si pieza viva (=0) no si, comprobamos turno de juego no coincide si, seguimos el proceso ; pieza viva? ; no ; pieza negra (=1) ; ; ; ;
h'07' ; determina que pieza es auxAA,W auxBB pieza_jugada ; guardamos copia de la pieza jugada (audio) h'05' ; es un rey? auxBB,W STATUS,Z examina_rey h'04' ; es una dama? auxBB,W STATUS,Z examina_dama h'03' ; es un alfil? auxBB,W STATUS,Z examina_alfil h'02' ; es un caballo? auxBB,W STATUS,Z examina_caballo h'01' ; es una torre? auxBB,W STATUS,Z examina_torre
;*********************************************************************** examina_peon movf aux_piezas,W ; miramos el color del peon leer_punterob1
168
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos movwf btfsc goto movf subwf btfss goto movf subwf movwf decf btfsc goto
auxAA auxAA,3 peon_negro coord_desy,W ; coord_or1y,W STATUS,Z ; captura_peonb ; coord_or1x,W coord_desx,W auxAA auxAA STATUS,Z ; examina_peon1 ;
decf btfss goto movlw
auxAA STATUS,Z pon_error h'01'
subwf btfss goto decf movwf movf movwf call movwf btfsc goto goto
coord_or1x,W STATUS,Z pon_error coord_desx,W aux_x coord_or1y,W aux_y mira_casilla ; miramos si casilla de paso ocupada auxAA auxAA,0 ; casilla ocupada? pon_error ; si examina_peon1 ; no, miramos si casilla destino ocupada
peon blanco coordenadas y (columna) iguales? no
avance una posicion? si, miramos si casilla destino ocupada
; no, avance 2 posiciones? ; no ; si, miramos si fila inicial es 1
captura_peonb movf coord_desy,W ; nos movemos a una casilla lateral? subwf coord_or1y,W absoluto decf auxAA btfss STATUS,Z goto pon_error movf coord_or1x,W ; avance una posicion? subwf coord_desx,W movwf auxAA decf auxAA btfss STATUS,Z goto pon_error movf coord_desy,W ; comprobamos captura pieza enemiga movwf aux_y movf coord_desx,W movwf aux_x goto mira_captura_p peon_negro
movf subwf btfss goto movf subwf movwf decf btfsc goto
coord_desy,W ; coord_or1y,W STATUS,Z ; captura_peonn ; coord_desx,W coord_or1x,W auxAA auxAA STATUS,Z ; examina_peon1 ;
decf btfss goto movlw
auxAA STATUS,Z pon_error h'06'
peon negro coordenadas y (columna) iguales? no
avance una posicion? si, miramos si casilla destino ocupada
; no, avance 2 posiciones? ; no ; si, miramos si fila inicial es 6
subwf coord_or1x,W btfss STATUS,Z
169
Anexos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos goto incf movwf movf movwf call movwf btfsc goto goto
pon_error coord_desx,W aux_x coord_or1y,W aux_y mira_casilla ; miramos si casilla de paso ocupada auxAA auxAA,0 ; casilla ocupada? pon_error ; si examina_peon1 ; miramos si casilla destino ocupada
captura_peonn movf coord_or1y,W ; nos movemos a una casilla lateral? subwf coord_desy,W absoluto decf auxAA btfss STATUS,Z goto pon_error movf coord_desx,W ; avance una posicion? subwf coord_or1x,W movwf auxAA decf auxAA btfss STATUS,Z goto pon_error movf coord_desy,W ; comprobamos captura pieza enemiga movwf aux_y movf coord_desx,W movwf aux_x goto mira_captura_p examina_peon1 movf movwf movf movwf call movwf btfsc goto examina_peon2 btfss goto movlw subwf btfss goto bsf goto movlw subwf btfss goto bsf goto
coord_desy,W aux_y coord_desx,W aux_x mira_casilla auxAA auxAA,0 pon_error control,0 $+7 h'00' coord_desx,W STATUS,Z mira_jaque control,6 mira_jaque h'07' coord_desx,W STATUS,Z mira_jaque control,6 mira_jaque
; comprobamos casilla destino ocupada
; miramos si casilla de paso ocupada ; ; ; ; ;
; casilla ocupada? si no, juegan blancas si no fila destino 0? (corona)
; no ; si, lo indicamos en control ; fila destino 7? (corona) ; no ; si, lo indicamos en control
;*********************************************************************** examina_torre movf subwf btfsc goto movf subwf btfsc goto btfss goto goto
coord_or1x,W ; coord_desx,W ; STATUS,Z examina_torre1 coord_or1y,W ; coord_desy,W STATUS,Z examina_torre2 control,5 ; pon_error ; examina_alfil ;
examina_torre1
movf
comprobamos geometria del movimiento coordenadas x iguales? ; si no, coordenadas y iguales? ; si no, mueve una dama? no si
coord_or1y,W ; comprobamos casillas de paso y
170
Anexos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
examina_ty
movwf movf subwf btfss goto incf goto decf movf subwf btfsc goto movf movwf movf movwf call movwf btfsc goto goto
auxBB coord_or1y,W coord_desy,W STATUS,C ; $+3 ; auxBB ; $+2 auxBB auxBB,W coord_desy,W ; STATUS,Z quita_enroquet auxBB,W aux_y coord_or1x,W aux_x mira_casilla ; auxAA auxAA,0 pon_error ; examina_ty
coord_or1y > coord_desy ? si no
coincide con la casilla destino ? ; si
miramos si la casilla esta ocupada ; ocupada ? si
examina_torre2 movwf examina_tx movf subwf btfss goto incf goto decf movf subwf btfsc goto movf movwf movf movwf call movwf btfsc goto goto
movf coord_or1x,W ; comprobamos casillas de paso x auxBB coord_or1x,W coord_desx,W STATUS,C ; coord_or1x > coord_desx ? $+3 ; si auxBB ; no $+2 auxBB auxBB,W coord_desx,W ; coincide con la casilla destino ? STATUS,Z quita_enroquet ; si auxBB,W aux_x coord_or1y,W aux_y mira_casilla ; miramos si la casilla esta ocupada auxAA auxAA,0 ; ocupada ? pon_error ; si examina_tx
quita_enroquet subwf btfss goto movlw subwf btfss goto bcf goto quita_enroquet1 subwf btfss goto bcf goto quita_enroquet2 subwf btfss goto movlw subwf btfss
movlw h'00' coord_or1x,W STATUS,Z quita_enroquet2 h'07' coord_or1y,W STATUS,Z quita_enroquet1 enroque,0 mira_captura movlw h'00' coord_or1y,W STATUS,Z mira_captura enroque,2 mira_captura movlw h'07' coord_or1x,W STATUS,Z quita_enroquet3 h'07' coord_or1y,W STATUS,Z
171
Anexos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos goto bcf goto quita_enroquet3 subwf btfss goto bcf goto
mira_captura enroque,1 mira_captura movlw h'00' coord_or1y,W STATUS,Z mira_captura enroque,3 mira_captura
mira_captura_p movwf btfss goto btfss goto btfsc goto goto btfss goto mira_captura_p1 goto movlw subwf btfss goto bsf goto movlw subwf btfss goto bsf goto
call mira_casilla auxAA auxAA,0 ; casilla ocupada? pon_error ; no auxAA,1 ; si, color captura $+4 control,0 ; captura pieza negra, juegan blancas? pon_error ; no mira_captura_p1 ; si control,0 ; captura pieza blanca, juegan negras? pon_error ; no btfss control,0 ; si, juegan blancas $+7 ; si h'00' ; no coord_desx,W ; fila destino 0? (corona) STATUS,Z mira_captura1 ; no control,6 ; si, lo indicamos en control mira_captura1 h'07' coord_desx,W ; fila destino 7? (corona) STATUS,Z mira_captura1 ; no control,6 ; si, lo indicamos en control mira_captura1
mira_captura movf movwf movf movwf call movwf btfss goto mira_captura2 btfss goto btfsc goto goto btfss goto goto mira_captura1 call goto
coord_desx,W ; aux_x coord_desy,W aux_y mira_casilla auxAA auxAA,0 mira_jaque ; auxAA,1 $+4 control,0 ; pon_error ; mira_captura1 ; control,0 ; pon_error ; mira_captura1 ; kill_pieza ; mira_jaque
Anexos
miramos si casilla destino ocupada.
; casilla ocupada? no, miramos jaques ; si, color captura captura pieza negra, juegan blancas? no si captura pieza blanca, juegan negras? no si eliminamos pieza capturada del array
;*********************************************************************** examina_caballo movf coord_desy,W ; comprobamos geometria del movimiento subwf coord_or1y,W absoluto movlw h'01' subwf auxAA,W ; desplazamiento lateral=1? btfss STATUS,Z goto examina_caba2 ; no movf coord_desx,W subwf coord_or1x,W ; si, desplazamiento horizontal=2?
172
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos absoluto movlw h'02' subwf auxAA,W btfss STATUS,Z goto pon_error ; no, error goto mira_captura ; si examina_caba2 movlw h'02' subwf auxAA,W btfss STATUS,Z goto pon_error movf coord_desx,W subwf coord_or1x,W absoluto movlw h'01' subwf auxAA,W btfss STATUS,Z goto pon_error goto mira_captura
; desplazamiento lateral=2? ; no ; si, desplazamiento horizontal=1?
; no, error ; si
;*********************************************************************** examina_alfil movf
coord_desy,W ; comprobamos geometria del movimiento
subwf coord_or1y,W absoluto movf auxAA,W movwf auxBB movf coord_desx,W subwf coord_or1x,W absoluto movf auxAA,W subwf auxBB,W btfss STATUS,Z ; incrementoX = incrementoY? goto pon_error ; no movf movwf movf movwf examina_alfil1 subwf btfss goto incf goto decf movf subwf btfss goto incf goto decf movf subwf btfsc goto call movwf btfsc goto goto
coord_or1x,W ; comprobamos casillas de paso aux_x coord_or1y,W aux_y movf coord_or1x,W coord_desx,W STATUS,C ; coord_or1x > coord_desx ? $+3 ; si aux_x ; no $+2 aux_x coord_or1y,W coord_desy,W STATUS,C ; coord_or1y > coord_desy ? $+3 ; si aux_y ; no $+2 aux_y aux_x,W coord_desx,W ; coincide con la casilla destino ? STATUS,Z mira_captura ; si mira_casilla ; no, miramos si la casilla esta ocupada auxAA auxAA,0 ; ocupada ? pon_error ; si examina_alfil1
;*********************************************************************** examina_dama bsf goto
control,5 ; indicamos que mueve una dama examina_torre ; se mira el movimiento de torre o alfil
173
Anexos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
;*********************************************************************** examina_rey
movf
coord_desx,W ; comprobamos geometría del movimiento
subwf coord_or1x,W btfss STATUS,Z ; coordenadas x iguales? goto examina_rey1 ; no movf coord_desy,W ; si subwf coord_or1y,W absoluto movlw h'01' subwf auxAA,W btfss STATUS,Z ; desplazamiento y = 1? goto mira_enroque ; no goto quita_enroque ; si examina_rey1 movf coord_desx,W subwf coord_or1x,W absoluto movlw h'01' subwf auxAA,W btfss STATUS,Z ; desplazamiento x = 1? goto pon_error ; no movf coord_desy,W ; si subwf coord_or1y,W btfsc STATUS,Z ; coordenadas y iguales? goto quita_enroque ; si movf coord_desy,W ; no subwf coord_or1y,W absoluto movlw h'01' subwf auxAA,W btfss STATUS,Z ; desplazamiento y=1? goto pon_error ; no quita_enroque btfsc control,0 ; si, juegan blancas? goto quita_enroque1 ; no bcf enroque,0 ; si bcf enroque,2 goto mira_captura quita_enroque1 bcf enroque,1 bcf enroque,3 goto mira_captura ;*********************************************************************** mira_jaque
call goto turno_juego call turno_juego1 bcf bcf bcf bcf bcf call movlw andwf btfss return btfss goto bcf bcf bcf return bsf bcf bcf return
actualiza_array ; actualiza array piezas jaque ; mira si se da algun jaque guarda_ram cambio,0 cambio,1 cambio,2 control,4 control,7 actualiza_a0 ; actualiza array anterior0 h'f0' ; enroque en proceso? enroque,W STATUS,Z ; si control,0 ; no, actualiza turno de juego $+5 control,0 control,5 control,6 control,0 control,5 control,6
174
Anexos
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
;*********************************************************************** mira_enroque btfsc goto movlw subwf btfss goto movlw subwf btfss goto btfss goto btfsc goto movlw movwf movlw movwf call movwf btfsc goto movlw movwf call movwf btfsc goto movlw movwf movlw movwf movlw call movwf btfsc goto movlw movwf movlw call movwf btfsc goto bsf bcf call goto mira_enroque1 movlw subwf btfss goto movlw subwf btfss goto btfss goto btfsc goto movlw movwf movlw movwf call
control,0 ; juegan blancas? mira_enroque2 h'06' ; si, comprobamos casilla destino coord_desy,W STATUS,Z mira_enroque1 h'00' coord_desx,W STATUS,Z pon_error enroque,0 ; enroque corto blancas permitido? pon_error ; no control,2 ; si, esta el rey en jaque? pon_error ; si h'00' ; no, miramos si casillas de paso ocupadas aux_x h'05' aux_y mira_casilla auxAA auxAA,0 pon_error h'06' aux_y mira_casilla auxAA auxAA,0 pon_error h'00' ; miramos si casillas paso atacadas fila h'05' columna h'01' ataque auxAA auxAA,0 pon_error h'06' columna h'01' ataque auxAA auxAA,0 pon_error enroque,4 ; enroque en proceso (falta mover torre) enroque,0 actualiza_array turno_juego h'02' ; comprobamos casilla destino coord_desy,W STATUS,Z pon_error h'00' coord_desx,W STATUS,Z pon_error enroque,2 ; enroque largo blancas permitido? pon_error ; no control,2 ; si, esta el rey en jaque? pon_error ; si h'00' ; no, miramos si casillas de paso ocupadas aux_x h'03' aux_y mira_casilla
175
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos movwf btfsc goto movlw movwf call movwf btfsc goto movlw movwf movlw movwf movlw call movwf btfsc goto movlw movwf movlw call movwf btfsc goto bsf bcf call goto mira_enroque2 movlw subwf btfss goto movlw subwf btfss goto btfss goto btfsc goto movlw movwf movlw movwf call movwf btfsc goto movlw movwf call movwf btfsc goto movlw movwf movlw movwf movlw call movwf btfsc goto movlw movwf movlw
Anexos
auxAA auxAA,0 pon_error h'02' aux_y mira_casilla auxAA auxAA,0 pon_error h'00' ; miramos si casillas paso atacadas fila h'03' columna h'01' ataque auxAA auxAA,0 pon_error h'02' columna h'01' ataque auxAA auxAA,0 pon_error enroque,6 ; enroque en proceso (falta mover torre) enroque,2 actualiza_array turno_juego h'06' ; coord_desy,W STATUS,Z mira_enroque3 h'07' coord_desx,W STATUS,Z pon_error enroque,1 ; pon_error ; control,1 ; pon_error ; h'07' ; aux_x h'05' aux_y mira_casilla auxAA auxAA,0 pon_error h'06' aux_y mira_casilla auxAA auxAA,0 pon_error h'07' ; fila h'05' columna h'00' ataque auxAA auxAA,0 pon_error h'06' columna h'00'
comprobamos casilla destino
enroque corto negras permitido? no si, esta el rey en jaque? si no, miramos si casillas de paso ocupadas
miramos si casillas paso atacadas
176
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos call movwf btfsc goto bsf bcf call goto mira_enroque3 movlw subwf btfss goto movlw subwf btfss goto btfss goto btfsc goto movlw movwf movlw movwf call movwf btfsc goto movlw movwf call movwf btfsc goto movlw movwf movlw movwf movlw call movwf btfsc goto movlw movwf movlw call movwf btfsc goto bsf bcf call goto
Anexos
ataque auxAA auxAA,0 pon_error enroque,5 ; enroque en proceso (falta mover torre) enroque,1 actualiza_array turno_juego h'02' ; comprobamos casilla destino coord_desy,W STATUS,Z pon_error h'07' coord_desx,W STATUS,Z pon_error enroque,3 ; enroque largo negras permitido? pon_error ; no control,1 ; si, esta el rey en jaque? pon_error ; si h'07' ; no, miramos si casillas de paso ocupadas aux_x h'03' aux_y mira_casilla auxAA auxAA,0 pon_error h'02' aux_y mira_casilla auxAA auxAA,0 pon_error h'07' ; miramos si casillas paso atacadas fila h'03' columna h'00' ataque auxAA auxAA,0 pon_error h'02' columna h'00' ataque auxAA auxAA,0 pon_error enroque,7 ; enroque en proceso (falta mover torre) enroque,3 actualiza_array turno_juego
;------------------------------------------------------------------------; mira_casilla: dadas las coordenadas aux_x, aux_y miramos si esa ; casilla esta ocupada. devuelve por W bit0 ocupada, ; bit1 color pieza ;------------------------------------------------------------------------mira_casilla movlw piezas ; buscamos pieza en array 'piezas' movwf auxAA1 mira_casilla1 incf auxAA1 movf auxAA1,W leer_punterob1 movwf auxAA andlw h'0F' ; aplica mascara para seleccionar coord x
177
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
subwf btfsc goto mira_casilla5 movlw subwf btfsc retlw incf goto
aux_x,W STATUS,Z mira_casilla2 ; h'DF' ; auxAA1,W ; STATUS,Z h'00' ; auxAA1 ; no mira_casilla1
mira_casilla2 movf andlw movwf swapf subwf btfsc goto goto
auxAA,W h'F0' ; aplica mascara para seleccionar coord y auxAA auxAA,W aux_y,W ; igual a aux_y? STATUS,Z mira_casilla3 ; si mira_casilla5 ; no
mira_casilla3 decf auxAA1 ; movf auxAA1,W leer_punterob1 movwf auxAA btfsc auxAA,4 goto mira_casilla4 ; btfsc auxAA,3 retlw h'03' ; retlw h'01' ; mira_casilla4 incf goto
; igual a aux_x? si no hemos llegado al final del array? si, casilla vacia
miramos pieza viva y color
; pieza viva (=0)? no
; si, la pieza es blanca (=0)?
no si
auxAA1 ; recorremos todo el array mira_casilla5
;------------------------------------------------------------------------; kill_pieza: elimina pieza capturada del array ;------------------------------------------------------------------------kill_pieza
kill_pieza1
kill_pieza5
kill_pieza2
kill_pieza3
clrf offset_captura bsf control,4 movlw piezas ; buscamos pieza en array 'piezas' movwf aux_piezas incf aux_piezas incf offset_captura movf aux_piezas,W leer_punterob1 movwf auxAA andlw h'0F' ; aplica mascara para seleccionar coord x subwf coord_desx,W ; igual a coord_desx? btfsc STATUS,Z goto kill_pieza2 ; si movlw h'DF' ; no subwf aux_piezas,W ; hemos llegado al final del array? btfsc STATUS,Z goto pon_error ; si incf aux_piezas ; no incf offset_captura goto kill_pieza1 movf andlw movwf swapf subwf btfsc goto goto
auxAA,W h'F0' auxAA auxAA,W coord_desy,W STATUS,Z kill_pieza3 kill_pieza5
decf movf
aux_piezas aux_piezas,W
; aplica mascara para seleccionar coord y ; igual a coord_desy? ; si ; no
178
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos leer_punterob1 movwf auxAA btfsc auxAA,4 goto kill_pieza4 ; si bsf auxAA,4 movf aux_piezas,W escribe_punterob1 return kill_pieza4
incf incf goto
Anexos
; pieza muerta? ; no, bit4=1, pieza muerta
aux_piezas offset_captura kill_pieza5
;------------------------------------------------------------------------; actualiza_array: actualiza el array piezas con la jugada introducida ;------------------------------------------------------------------------actualiza_array movlw piezas ; movwf aux_piezas actualiza_ar1 incf aux_piezas movf aux_piezas,W leer_punterob1 movwf auxAA andlw h'0F' ; subwf coord_or1x,W ; btfsc STATUS,Z goto actualiza_ar2 ; actualiza_ar7 movlw h'DF' ; subwf aux_piezas,W ; btfsc STATUS,Z goto pon_error ; incf aux_piezas ; goto actualiza_ar1 actualiza_ar2 movf andlw movwf swapf subwf btfsc goto goto
auxAA,W h'F0' ; auxAA auxAA,W coord_or1y,W ; STATUS,Z actualiza_ar3 ; actualiza_ar7 ;
actualiza_ar3 decf aux_piezas movf aux_piezas,W leer_punterob1 movwf auxAA btfsc auxAA,4 goto actualiza_ar4 ; btfsc control,6 ; goto actualiza_ar5 ; actualiza_ar6 incf aux_piezas ; movf coord_desx,W ; movwf auxAA swapf coord_desy,W addwf auxAA,f movf aux_piezas,W ; escribe_punterob1 return actualiza_ar4 incf goto
buscamos pieza en array 'piezas'
aplica mascara para seleccionar coord x igual a coord_or1x? si no hemos llegado al final del array? si no
aplica mascara para seleccionar coord y igual a coord_or1y? si no
; pieza muerta? si no, peon corona? si no actualizamos coordenadas pieza movida
direccion a escribir
aux_piezas actualiza_ar7
actualiza_ar5 bsf auxAA,2 bcf auxAA,1 bcf auxAA,0 movf aux_piezas,W ; peon=dama escribe_punterob1
179
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos goto
Anexos
actualiza_ar6
;-------------------------------------------------------------------------; ; jaque: mira si el bando que mueve deja a su rey en jaque al hacerlo. ; si no ocurre, mira si da jaque al rey contrario ;-------------------------------------------------------------------------; jaque jaque1
jaque3
jaque2
jaque4
bsf control,7 movlw piezas ; aux_piezas = @base array piezas movwf aux_piezas movf aux_piezas,W ; buscamos un rey leer_punterob1 andlw h'07' ; seleccionamos tipo pieza movwf auxAA movlw h'05' subwf auxAA,W ; es un rey? btfsc STATUS,Z goto jaque2 ; si movlw h'DE' ; no subwf aux_piezas,W ; hemos llegado al final del array? btfsc STATUS,Z goto pon_error ; si incf aux_piezas ; no incf aux_piezas goto jaque1 movf aux_piezas,W leer_punterob1 movwf auxAA btfss auxAA,3 goto jaque4 btfss control,0 goto jaque3 incf aux_piezas movf aux_piezas,W leer_punterob1 movwf auxAA movlw h'07' andwf auxAA,W movwf fila swapf auxAA,f movlw h'07' andwf auxAA,W movwf columna movlw h'00' call ataque movwf auxAA btfsc auxAA,0 goto pon_error bcf control,1 goto jaque_c
; miramos el color
btfsc control,0 goto jaque3 incf aux_piezas movf aux_piezas,W leer_punterob1 movwf auxAA movlw h'07' andwf auxAA,W movwf fila swapf auxAA,f movlw h'07' andwf auxAA,W movwf columna movlw h'01' call ataque
; rey blanco, juegan blancas? ; no ; si, tomamos las coordenadas
; ; ; ;
; rey negro? no si, juegan negras? no si, tomamos las coordenadas
; selecciona coordenada x (fila)
; selecciona coordenada y (columna) ; bando q ataca blancas ; mira si el rey negro esta atacado ; rey atacado? ; si ; no
; selecciona coordenada x (fila)
; selecciona coordenada y (columna) ; bando q ataca negras ; mira si el rey blanco esta atacado
180
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos movwf btfsc goto bcf ; miramos si con la jaque_c jaque_c1
jaque_c3
jaque_c2
jaque_c4
Anexos
auxAA auxAA,0 ; rey atacado? pon_error ; si control,2 ; no jugada realizada se da jaque al rey contrario
movlw piezas movwf aux_piezas movf aux_piezas,W leer_punterob1 andlw h'07' movwf auxAA movlw h'05' subwf auxAA,W btfsc STATUS,Z goto jaque_c2 movlw h'DE' subwf aux_piezas,W btfsc STATUS,Z goto pon_error incf aux_piezas incf aux_piezas goto jaque_c1
; aux_piezas = @base array piezas ; buscamos un rey ; seleccionamos tipo pieza ; es un rey? ; si ; no ; hemos llegado al final del array? ; si ; no
movf aux_piezas,W leer_punterob1 movwf auxAA btfss auxAA,3 goto jaque_c4 btfsc control,0 goto jaque_c3 incf aux_piezas movf aux_piezas,W leer_punterob1 movwf auxAA movlw h'07' andwf auxAA,W movwf fila swapf auxAA,f movlw h'07' andwf auxAA,W movwf columna movlw h'00' call ataque movwf auxAA btfss auxAA,0 goto $+3 bsf control,1 goto turno_juego bcf control,1 goto turno_juego
; miramos el color
btfss control,0 goto jaque_c3 incf aux_piezas movf aux_piezas,W leer_punterob1 movwf auxAA movlw h'07' andwf auxAA,W movwf fila swapf auxAA,f movlw h'07' andwf auxAA,W movwf columna movlw h'01' call ataque movwf auxAA
; rey blanco, juegan negras? ; no ; si, tomamos las coordenadas
; ; ; ;
; rey negro? no si, juegan blancas? no si, tomamos las coordenadas
; selecciona coordenada x (fila)
; selecciona coordenada y (columna) ; bando q ataca blancas ; mira si el rey negro esta atacado ; rey atacado? ; no ; si
; selecciona coordenada x (fila)
; selecciona coordenada y (columna) ; bando q ataca negras ; mira si el rey blanco esta atacado
181
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos btfss goto bsf goto bcf goto
auxAA,0 $+3 control,2 turno_juego control,2 turno_juego
Anexos
; rey atacado? ; no ; si
;-------------------------------------------------------------------------; ; ataque: mira si alguna pieza del bando 'W' ataca la casilla de ; coordenadas 'fila' y 'columna'. Retorna W=0, no, y W=1, si. ;-------------------------------------------------------------------------; ataque ataque_1
movwf auxCC movlw piezas movwf aux_piezas movf aux_piezas,W leer_punterob1 movwf auxAA btfsc auxAA,4 goto ataque_2 btfsc auxCC,0 goto $+4 btfsc auxAA,3 goto ataque_2 goto $+3
; aux_piezas= @ base de array 'piezas'
; pieza viva (=1)? ; no, saltamos ; si, bando que ataca = blancas? ; no, bando que ataca = negras ; si, pieza blanca? ; no, saltamos ; si, saltamos al switch
btfss auxAA,3 goto ataque_2
; pieza negra? ; no, saltamos
movf aux_piezas,W leer_punterob1 movwf auxAA movlw h'07' andwf auxAA,f movlw h'00' subwf auxAA,W btfsc STATUS,Z goto at_peon movlw h'01' subwf auxAA,W btfsc STATUS,Z goto at_torre movlw h'02' subwf auxAA,W btfsc STATUS,Z goto at_caballo movlw h'03' subwf auxAA,W btfsc STATUS,Z goto at_alfil movlw h'04' subwf auxAA,W btfss STATUS,Z goto ataque_2
; detectamos de que tipo de pieza se trata
goto
at_torre
; si, saltamos primero a torre y despues a
ataque_2
movlw subwf btfsc retlw incf incf goto
h'DE' ; hemos llegado al final del array? aux_piezas,W STATUS,Z h'00' ; si, no hay ataque (W=0) aux_piezas ; no aux_piezas ataque_1
ataque3
movlw h'DF' subwf aux_piezas,W
; es un peon? ; si, saltamos ; no, es una torre? ; si, saltamos ; no, es un caballo? ; si, saltamos ; no, es un alfil? ; si, saltamos ; no, es una dama? ; no, es un rey pero este no puede dar jaque,
saltamos alfil
; hemos llegado al final del array?
182
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos btfsc retlw incf goto
STATUS,Z h'00' aux_piezas ataque_1
Anexos
; si, no hay ataque (W=0) ; no
;************************************************************ at_peon una columna
incf
aux_piezas,W ; miramos si el peon se encuentra en
leer_punterob1 movwf auxAA swapf auxAA,f movlw h'07' andwf auxAA,f btfsc STATUS,Z goto at_peon_c0 movlw h'07' subwf auxAA,W btfsc STATUS,Z goto at_peon_c7 incf auxAA,W
; limite del tablero
; peon en columna 0? ; si, saltamos ; no, peon en columna 7? ; si, saltamos ; no, miramos las casillas que ataca
(columna+1) subwf btfsc goto decf subwf btfsc goto goto at_peon_1
columna,W STATUS,Z at_peon_1 auxAA,W columna,W STATUS,Z at_peon_1 ataque_2
movf aux_piezas,W leer_punterob1 movwf auxAA btfsc auxAA,3 goto at_peon_2 incf aux_piezas,W leer_punterob1 andlw h'0F' movwf auxAA incf auxAA movf auxAA,W subwf fila,W btfsc STATUS,Z retlw h'01'
; coincide con la columna objetivo? ; si, saltamos ; no, miramos columna-1 ; coincide con la columna objetivo? ; si, saltamos ; no, el peon no ataca la casilla objetivo
; es un peon blanco? ; no, saltamos ; si, miramos fila+1
; concide con la fila objetivo? ; si, el peon ataca la casilla objetivo,
retorno con 1 at_peon_2
goto ataque_2 incf aux_piezas,W leer_punterob1 andlw h'0F' movwf auxAA decf auxAA movf auxAA,W subwf fila,W btfsc STATUS,Z retlw h'01'
; no, el peon no ataca la casilla objetivo, ; miramos fila-1
goto
ataque_2
; no, el peon no ataca la casilla objetivo,
incf subwf btfss goto goto
auxAA,W columna,W STATUS,Z ataque_2 at_peon_1
; la columna objetivo es c=1? ; no, pasamos a la siguiente ; si, miramos fila objetivo
decf auxAA,W subwf columna,W btfss STATUS,Z
; la columna objetivo es c=7?
; concide con la fila objetivo? ; si, el peon ataca la casilla objetivo,
retorno con 1 at_peon_c0
at_peon_c7
183
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos goto goto
ataque_2 at_peon_1
Anexos
; no, pasamos a la siguiente ; si, miramos fila objetivo
;************************************************************ at_torre
incf aux_piezas,W ; guardamos fila y columna de la posicion leer_punterob1 ; del caballo en variables auxiliares movwf aux_x swapf aux_x,W andlw h'07' movwf aux_y movlw h'07' andwf aux_x,f movf
aux_x,W
; miramos si torre misma fila casilla
subwf btfss goto movf
fila,W STATUS,Z at_torre_c columna,W
; se encuentra en la misma fila? ; no, saltamos ; si, miramos si hay algun obstaculo en esa
subwf btfsc goto incf
aux_y,W STATUS,C at_torre_2 aux_y,f
; aux_y > columna(torre)? ; si, saltamos ; no, miramos las casillas que barre la
objetivo
columna
at_torre_1 torre
movf aux_y,W subwf columna,W btfsc STATUS,Z
at_torre_2 torre
retlw call movwf btfsc goto goto
h'01' mira_casilla auxAA auxAA,0 at_torre_5 at_torre_1
decf
aux_y,f
movf aux_y,W subwf columna,W btfsc STATUS,Z retlw call movwf btfsc goto goto at_torre_c movf casilla objetivo subwf btfss goto movf columna subwf btfsc goto at_torre_3 incf torre movf subwf btfsc
h'01' mira_casilla auxAA auxAA,0 at_torre_5 at_torre_2 aux_y,W
; hemos llegado a la casilla objetivo? ; si, torre ataca casilla objetivo ; no ; casilla ocupada? ; si ; no, saltamos ; no, miramos las casillas que barre la
; hemos llegado a la casilla objetivo? ; si, torre ataca casilla objetivo ; en esa fila en adelante ; casilla ocupada? ; si ; no, saltamos ; miramos si torre misma columna
columna,W STATUS,Z at_torre_5 fila,W
; se encuentra en la misma columna? ; no, saltamos ; si, miramos si hay algun obstaculo en esa
aux_x,W STATUS,C at_torre_4 aux_x,f
; aux_x > fila(torre)? ; si, saltamos ; no, miramos las casillas que barre la
aux_x,W fila,W STATUS,Z
; hemos llegado a la casilla objetivo?
retlw h'01' ; si, torre ataca casilla objetivo call mira_casilla ; en esa columna en adelante
184
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
at_torre_4 torre
movwf btfsc goto goto
auxAA auxAA,0 at_torre_5 at_torre_3
decf
aux_x,f
movf aux_x,W subwf fila,W btfsc STATUS,Z
at_torre_5 alfil
Anexos
; casilla ocupada? ; si ; no, saltamos ; no, miramos las casillas que barre la
; hemos llegado a la casilla objetivo?
retlw call movwf btfsc goto goto
h'01' mira_casilla auxAA auxAA,0 at_torre_5 at_torre_4
movf
aux_piezas,W ; si la pieza es una dama saltamos ahora a
leer_punterob1 andlw h'07' movwf auxAA movlw h'04' subwf auxAA,W btfsc STATUS,Z goto at_alfil goto ataque_2
; si, torre ataca casilla objetivo ; en esa columna en adelante ; casilla ocupada? ; si ; no, saltamos
; es una dama? ; si, saltamos a alfil ; no, seguimos con otra pieza
;************************************************************ at_caballo
incf aux_piezas,W ; guardamos fila y columna de la posicion leer_punterob1 ; del caballo en variables auxiliares movwf aux_x swapf aux_x,W andlw h'07' movwf aux_y movlw h'07' andwf aux_x,f movlw addwf subwf btfss goto movlw addwf subwf btfsc retlw movlw subwf subwf btfsc retlw goto
h'01' aux_y,W columna,W STATUS,Z at_caballo_1 h'02' aux_x,W fila,W STATUS,Z h'01' h'02' aux_x,W fila,W STATUS,Z h'01' ataque_2
at_caballo_1 movlw addwf subwf btfss goto movlw addwf subwf btfsc retlw movlw
h'02' aux_y,W columna,W STATUS,Z at_caballo_2 h'01' aux_x,W fila,W STATUS,Z h'01' h'01'
; columna+1 = columna? ; no, saltamos
; si, fila+2 = fila? ; si, retorno con 1 ;no ; no, fila-2 = fila? ; si, retorno con 1 ; no, seguimos con otra pieza
; columna+2 = columna? ; no, saltamos
; si, fila+1 = fila? ; si, retorno con 1
185
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos subwf subwf btfsc retlw goto
aux_x,W fila,W STATUS,Z h'01' ataque_2
at_caballo_2 movlw subwf subwf btfss goto movlw addwf subwf btfsc retlw movlw subwf subwf btfsc retlw goto
h'01' aux_y,W columna,W STATUS,Z at_caballo_3 h'02' aux_x,W fila,W STATUS,Z h'01' h'02' aux_x,W fila,W STATUS,Z h'01' ataque_2
at_caballo_3 movlw subwf subwf btfss goto movlw addwf subwf btfsc retlw movlw subwf subwf btfsc retlw goto
h'02' aux_y,W columna,W STATUS,Z ataque_2 h'01' aux_x,W fila,W STATUS,Z h'01' h'01' aux_x,W fila,W STATUS,Z h'01' ataque_2
Anexos
; no, fila-1 = fila? ; si, retorno con 1 ; no, seguimos con otra pieza
; columna-1 = columna? ; no, saltamos
; si, fila+2 = fila? ; si, retorno con 1
; no, fila-2 = fila? ; si, retorno con 1 ; no, seguimos con otra pieza
; columna-2 = columna? ; no, saltamos
; si, fila+1 = fila? ; si, retorno con 1
; no, fila-1 = fila? ; si, retorno con 1 ; no, seguimos con otra pieza
;************************************************************ at_alfil
incf aux_piezas,W ; guardamos fila y columna de la posicion leer_punterob1 ; del alfil en variables auxiliares movwf auxAA movf auxAA,W andlw h'07' movwf aux_x swapf auxAA,W andlw h'07' movwf aux_y movf
aux_x,W
subwf btfss goto movwf movf subwf btfss goto subwf btfss goto incf incf
fila,W STATUS,C at_alfil_d2 auxAA aux_y,W columna,W STATUS,C at_alfil_d2 auxAA,W STATUS,Z at_alfil_d2 aux_x,f aux_y,f
; miramos si la casilla objetivo se
encuentra
at_alfil_1
; ; ; ;
en la misma diagonal superior derecha fila > aux_x? no si
; columna > aux_y? ; no ; si ; (fila - aux_x)=(columna-aux_y) ? ; no, saltamos ; si, recorremos la diagonal mirando si ; hay algun obstaculo entre el alfil y
la
186
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
at_alfil_d2
at_alfil_2 la
at_alfil_d3 izquierda
at_alfil_3 la
at_alfil_d4 encuentra
movf subwf btfsc retlw call movwf btfsc goto goto
aux_x,W fila,W STATUS,Z h'01' mira_casilla auxAA auxAA,0 ataque_2 at_alfil_1
movf subwf btfss goto movwf movf subwf btfss goto subwf btfss goto decf incf
fila,W aux_x,W STATUS,C at_alfil_d3 auxAA aux_y,W columna,W STATUS,C at_alfil_d3 auxAA,W STATUS,Z at_alfil_d3 aux_x,f aux_y,f
movf subwf btfsc retlw call movwf btfsc goto goto
aux_x,W fila,W STATUS,Z h'01' mira_casilla auxAA auxAA,0 ataque_2 at_alfil_2
; ; ; ;
Anexos
; casilla objetivo aux_x++, aux_y++ hemos llegado a la casilla destino? si, retorno con 1 no, miramos si hay obstaculos
; casilla ocupada? ; si, saltamos ; no, seguimos recorriendo la diagonal ; miramos si la casilla objetivo se encuentra ; en la misma diagonal inferior derecha ; aux_x > fila? ; no ; si ; columna > aux_y? ; no ; si ; (aux_x - fila)=(columna-aux_y) ? ; no, saltamos ; si, recorremos la diagonal mirando si ; hay algun obstaculo entre el alfil y ; ; ; ;
; casilla objetivo aux_x++, aux_y++ hemos llegado a la casilla destino? si, retorno con 1 no, miramos si hay obstaculos
; casilla ocupada? ; si, saltamos ; no, seguimos recorriendo la diagonal
movf fila,W subwf aux_x,W
; miramos si la casilla objetivo se encuentra ; en la misma diagonal inferior
btfss goto movwf movf subwf btfss goto subwf btfss goto decf decf
STATUS,C at_alfil_d4 auxAA columna,W aux_y,W STATUS,C at_alfil_d4 auxAA,W STATUS,Z at_alfil_d4 aux_x,f aux_y,f
; fila > aux_x? ; no ; si
movf subwf btfsc retlw call movwf btfsc goto goto
aux_x,W fila,W STATUS,Z h'01' mira_casilla auxAA auxAA,0 ataque_2 at_alfil_3
movf
aux_x,W
subwf movwf btfss goto movf
fila,W auxAA STATUS,C ataque_2 columna,W
; columna > aux_y? ; no ; si ; (aux_x - fila)=(aux_y-columna) ? ; no, saltamos ; si, recorremos la diagonal mirando si ; hay algun obstaculo entre el alfil y ; ; ; ;
; casilla objetivo aux_x++, aux_y++ hemos llegado a la casilla destino? si, retorno con 1 no, miramos si hay obstaculos
; casilla ocupada? ; si, saltamos ; no, seguimos recorriendo la diagonal ; miramos si la casilla objetivo se ; en la misma diagonal superior izquierda ; fila > aux_x? ; no ; si
187
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
at_alfil_4
subwf btfss goto subwf btfss goto incf decf
aux_y,W STATUS,C ataque_2 auxAA,W STATUS,Z ataque_2 aux_x,f aux_y,f
movf subwf btfsc retlw call movwf btfsc goto goto
aux_x,W fila,W STATUS,Z h'01' mira_casilla auxAA auxAA,0 ataque_2 at_alfil_4
Anexos
; columna > aux_y? ; no ; si ; (fila - aux_x)=(aux_y-columna) ? ; no, saltamos ; si, recorremos la diagonal mirando si ; hay algun obstaculo entre el alfil y
la ; ; ; ;
; casilla objetivo aux_x++, aux_y++ hemos llegado a la casilla destino? si, retorno con 1 no, miramos si hay obstaculos
; casilla ocupada? ; si, saltamos ; no, seguimos recorriendo la diagonal
;------------------------------------------------------------------------; guarda_ram: almacena las jugadas realizadas en memoria RAM ; 2 Bytes semijugada. High: coordenada y, Low: coordenada x ;------------------------------------------------------------------------guarda_ram
guarda_ram2
movf coord_or1y,W movwf auxAA swapf auxAA,f movf coord_or1x,W addwf auxAA,f movlw h'90' subwf base_ram,W btfsc STATUS,C goto guarda_ram2 movf base_ram,W escribe_punterob2 incf base_ram movf coord_desy,W movwf auxAA swapf auxAA,f movf coord_desx,W addwf auxAA,f movf base_ram,W escribe_punterob2 movlw h'6f' subwf base_ram,W btfss STATUS,Z goto $+4 movlw h'90' movwf base_ram return incf base_ram return movlw h'EF' subwf base_ram,W btfsc STATUS,Z return movf base_ram,W escribe_punterob3 incf base_ram movf coord_desy,W movwf auxAA swapf auxAA,f movf coord_desx,W addwf auxAA,f movf base_ram,W escribe_punterob3 incf base_ram
; componemos el byte coordenada origen
; base_ram>0x190? ; si ; no ; componemos el byte coordenada destino
; base_ram=0x16f final banco 2? ; no ; si
; fin del banco 3? ; si, no salvamos nada ; no ; componemos el byte coordenada destino
188
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
return ;-------------------------------------------------------------------------; ; Definimos los valores iniciales de los dígitos ; ; en la memoria de datos EEPROM del PIC ; ;-------------------------------------------------------------------------; ORG H'2100' ; orden variables: ; nsecmov,xtrtmp,hora,minde,minun,secde,secun,ehora,eminde,eminun,esecde,esecun DE DE DE DE DE DE DE DE DE
0 ; offset 0, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 ; m1. 0, 1, 1, 3, 0, 0, 0, 1, 0, 0, 0, 0 ; m2. 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 ; m3. 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0 ; m4. 1, 0, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0 ; m5. 1, 0, 0, 2, 5, 0, 0, 0, 0, 0, 1, 0 ; m6. 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 2 ; m7. "Copyright","Carlos Vidal Garcia"
end
189
2h + 1h finish 90m + 1h finish 30 mimutos 5 minutos 90m + 30s/jug 25m + 10s/jug 4m + 2s/jug
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
6.3.
Anexos
Código Fuente del Programa Terminal.
/******************************************************************/ /* Programa: Terminal */ /* */ /* Redactado en lenguaje C++ */ /* Gestiona la comunicacion entre el PC y el microcontrolador por */ /* el puerto serie COM_1. Recibe la informacion (jugadas) que */ /* transmite el microcontrolador y genera un archivo *.pgn . */ /* */ /* PFC: Carlos Vidal Garcia
[email protected] Septiembre 2005 */ /******************************************************************/ #define #define #define #define #define #define #include #include #include #include void char void
COM1BASE TXDATA LSR LCR LIMITE 192 carac_final
0x3F8 COM1BASE (COM1BASE+5) (COM1BASE+3) /*limite del vector 'inchar'*/ -1
configura_serie(void); get_character(void); genera_pgn(void);
/***********variables globales*************************************/ char
inchar[LIMITE];
/*en este vector se guardan las jugadas*/
/*----------------------------------------------------------------*/ /* programa principal */ /*----------------------------------------------------------------*/ int main(void) { int x=0; printf("Comunicacion 232 con PIC\n\n"); configura_serie(); printf("Esperando Transmision \n\n"); while(inchar[x]!=carac_final && x4)+97; fprintf(fp,"%c",columna); fila=(inchar[x]&0x0F)+1; fprintf(fp,"%d ",fila); if(inchar[x]!=carac_final) x++; origen=1; negras=0;
191
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos } else { if(origen==1 && negras==1) { columna=((inchar[x]&0xF0)>>4)+97; fprintf(fp,"%c",columna); fila=(inchar[x]&0x0F)+1; fprintf(fp,"%d-",fila); if(inchar[x]!=carac_final) x++; origen=0; } else { if(origen==0 && negras==0) { columna=((inchar[x]&0xF0)>>4)+97; fprintf(fp,"%c",columna); fila=(inchar[x]&0x0F)+1; fprintf(fp,"%d ",fila); if(inchar[x]!=carac_final) x++; origen=1; negras=1; } else { if(origen==1 && negras==0) { fprintf(fp,"%d. ",jugada); columna=((inchar[x]&0xF0)>>4)+97; fprintf(fp,"%c",columna); fila=(inchar[x]&0x0F)+1; fprintf(fp,"%d-",fila); jugada++; if(inchar[x]!=carac_final) x++; origen=0; } } } } } fclose(fp); }
192
Anexos