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:C AUTOR: arlos Vidal García. DIRECTOR: J osé Luís Ramírez Falo. DIRECTOR: Septiembre / 2005.
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Índice
Índice 1.
4
Memoria Descriptiva.
5 1.1. 1.2. 1.3.
Objeto del Proyecto. Antecedentes.
5 6
Posibles Soluciones y Solución Adoptada. 1.3.1. Elección del Microcontrolador. 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.
1.4.
1.5.
1.3.6. Alimentación.
10 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 (Grabación/Reproducción
de
20
Audio). 1.5.4. Módulo LCD de de Caracteres Caracteres de 16x1. 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.
2.6.
Rutinas Auxiliares.
48 58
Planos.
62
3.1.
Aspecto del Prototipo
L1
3.2.
Conexionado Sensores.
L2
3.3.
Esquema Eléctrico Placa 1.
L3 L4
3.4. 3.5.
Esquema Eléctrico Placa 2. 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 Ca Cara ra S Soldadura oldadura 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 Ca Cara ra S Soldadura oldadura Placa 2.
65
2
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Índice
4.
5.
6.
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 98
6.1.
Manual de Usuario.
6.2.
Código Fuente para PIC16F877.
6.3.
Código Fuente del Programa Terminal.
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 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 almacenamien almacenamiento to en memoria de las mismas y la mejora 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
Memoria Descriptiva
1.3. 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. Microcontrolador. De entre el extenso listado de fabricantes de microcontroladores podemos destacar: Intel, Motorola, T Toshiba, oshiba, 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 de microcontroladores. Un bus más grande implicaría un aumento de precio innece innecesario, sario, mientras que un bus más peq pequeño ueño nos reduce los puertos de E/S, las fuentes de interrupción i nterrupció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 ddee una gran do documentación cumentación técnica. 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 del el dispositivo código programa. y del software necesario para la generación y depuración del 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 bitsdedetamaño tamañodededatos. instrucción. 8 bits
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 elevado número de puertasesdeunE/S escogemos finalmente el PIC16F877 . A pesar deunque el modelo PIC16F874 poco más económico, se diferencia por tener una menor menor memoria, tanto de de código como de datos: 4k y 192 bytes respectivamente, 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. condensadores 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 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 una embargo, con el paso de años, años, el precio de las ISD se ha reducido. Actualmente, implementación conlos 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, 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 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
•
al intentar movidas No habríainvoluntariamente forma de distinguir distinguir el color tocarlas. de las ppiezas iezas 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 emisión si esta no exis existe te o hay un obstáculo obstáculo en medio qque ue 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.
podría ser dosforma contactos y esmalte conductor en la base Otra de la solución peana, situando los utilizar cables de que seflexibles 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 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. 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 esta Así tarea se podrán volcarellas jugadas almacenadas ordenador parafacilitar su consulta. se podrá comprobar curso correcto de la partida.en un
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 subc subcircuitos, ircuitos, formando un total siete de etapas: 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: decodificador 74HC4514N. • Sensado de las casillas: sensores ópticos OPB620.
•
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 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 ti po 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. 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á ba baja. ja.
•
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 acon acontece tece cuando se desborda uno de sus sus tres timers. También con cinco puertos entrada/salida: el puerto A, de 6 bits, los puertos B, C y D, cuenta de 8 bits y el puerto E, de 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 la Error. Enciende un led cuando se detecta un movimiento erróneo durante partida. •
RA [4,3] : No utilizado
•
RA [2..0] : Salidas. Corresponden Corresponden a las señales Ent (2), ha habilitación bilitació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 l os 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 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. 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.999936 s (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: 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, generarla, el USART dispone de un generador de frecuencia 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, conducción, y por otro, limitar la corriente eenn 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 R 1 = 2.2k Ω y R 2 = 220k Ω (conducción Vout = 5 V , I = 6 mA ; no conduccción Vout = 0, I = 0 mA). El siguiente paso es ver ver como interconecta interconectarr el conjunto de 64 sensores y como conectarlos al microcontrolador. La fo forma rma más más fá fácil cil de solventar el problema problema es tratar el tablero como lo haríamos con una matriz 8x8 (ver figura ). DECODIFICADOR 3:8
TABLERO (matriz 8x8)
O0 N Ó I C C E L E S
O1 A 0
O2
A 1
O3
A 2
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 número de puertos E/S limitado y también hay que controlar controlar otros dispositivos. Por todo ello se ha optado por reordenar la matriz de sensores 8x8 por una 16x4 y utilizar un decodificado decodificadorr de 4 bits (ver figura 11).
19
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria Descriptiva
DECODIFICADOR 4:16
TABLERO (matriz 16x4)
O0 O1 O2 O3 O4 N Ó I C C E L E S
A 0
O5
A 1
O6
A 2
O7
A 3
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 y el incremento de coste mínimo. Habrá que realizar 16 encuestas paranecesitamos poder muestrear todo el tablero (el es doble que antes), pero la velocidad de trabajo del microcontrolacor hace que esto no sea un problema. El formato de la respuesta respuesta del tablero (4 bits de le lectura ctura cada vez) nos oobligará bligará 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 memoria ISD de la marca Winb Winbond. ond. En la figura podemos ver el diagrama bloqu bloques es 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 Microcontrol Microcontrolador ador 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 uestreo a 8K 8KH H z , 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 c alidad 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 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 j ugador 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
Memoria Descriptiva
A B C D E F G
0101001010 0101010000 0101010110 0101011100 0101100010 0101101000 0101101110
330 336 342 348 354 360 366
H Torre Caballo Alfil Dama Rey Jugada Ilegal Uno Enroque
0101110100 0101111010 0110000110 0110010010 0110011110 0110101010 0110110110 0111001010 0111010100
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 niv nivel el 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 l as 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 pasamos por el bus de datos 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 la señal operación realizara es aplicación siesta estaráasiempre 0. de lectura (1) o de escritura (0). Para nuestra
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. extendidas. Una de sus carac características terísticas es la de los rangos rangos de tensión que utiliza para representar los niveles lógicos lógicos.. El nivel alto se representa con 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, 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 l a 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 teóricadeenlínea). su pata de salida es de 5 V (puede oscilar entre los 4.75 Vsey cumple, l os 5.25 la los V tensión : Regulación 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 V =V H
ref
R 2 R 1 + R 2 R 1
+V ref
R 1 + R 2
27
R 2 R 1 + R 2
(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) 19 1 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 0.5 ms (512 µs). Se muestra por pantalla información tiempos de cada jugadorde(horas.minutos o minutos.segundos) así como el reloj con quelos 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 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
Memoria Descriptiva
1.7.
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 almacenamiento de jugad jugadas as en memoria y su transferencia a PC. PC. No obstante, todo se se puede mejorar. 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 pa para ra 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, además, es gratuito. La elección está, está, pues, justificada 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 los archivos PC. Los gestores partidas a los que aludíamos púltimo uedenen traducir de unogenerados formato a en otro fácilmente. Aúndeasí, 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 ISD se encargan pormensaje sí mismos realizar dicha reproducción. Cuando se dispositivos solicite la reproducción de un sólodeserá 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 correctamente las señales señales producidas al ppulsar ulsar un botón.
32
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
INICIALIZAR
PRINCIPAL
CONFIGURAR PUERTOS E/S
INICIALIZAR
INICIO INICIALIZAR ISD'S
INICIALIZAR INICI ALIZAR DISPLAY
PREESCALER DEL TMR0 A 1:2
HABILITA PULL-UPS PORTB
HABILITA HABILIT A INTERRUPCIONES INTERRUPCIONES
INICIALIZAR INICIALI ZAR V ARIABLES
INICIALIZAR INICI ALIZAR OFFSET DE LA EE PROM
RETURN
33
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
2.2. 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 loselcontadores que se utilizarán en la rutina de atención a la interrupción. Posteriormente 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 eje ejecuta cuta alternativamente 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 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 por nivel implementando un bucle para saber cuando se suelta un botón previamente pues correríamos riesgo de del no atender otras acciones importantes como lapulsado, reproducción de mensajeseso el control tablero.
34
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
INICIO
COGEREE
COMP_TABLERO
INICIALIZAR VARIABLES DE PARTIDA Y AUDIO
INICIALIZAR CONTADORES
TABLERO CONECTADO?
SI
INICIALIZAR VARIABLES CONTROL TABLERO
NO
BOTON A PULSADO? SI
NO
BOTON B PULSADO?
NO
BOTON SET PULSADO?
SI
jue ga B= 1
jue gaA =1
IN IC IA L IZ A TM R 0
I N I C I A L I Z A TM R 0
SI
SETCUENTA
PARTIDA
35
NO
BOTON NEXT PULSADO? SI
TX_RS232
NO
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
PARTIDA
B O TO N A
NO
BOTON B
P UL S A DO ?
SI
SI
VARIABLE AC TU AL IZ AD A?
VARIABLE AC TU AL IZ AD A?
NO
NO
NO
TABLERO CONECTADO?
SI
NO
TURNO DE
TURNO DE L A S B L A NCA S ?
L A S NE G RA S ?
SI
SI
AC TU AL IZ AR VARIABLES
AC TU AL IZ AR VARIABLES
MO DO FISCHER?
SI
MO DO FISCHER?
INCREMENTOA
SI INCREMENTOB
NO
NO
AC TU AL IZ AR DISPLAY
AC TU AL IZ AR DISPLAY
B O TO N B P UL S A DO ?
NO
TABLERO CONECTADO?
SI
NO
CMP _ S E T
P UL S A DO ?
SI
SI
NO
NO
BOTON A P UL S A DO ?
NO
SI
SI
P A RA R RE L O JE S
P A RA R RE L O JE S
AC TU AL IZ AR DISPLAY
AC TU AL IZ AR DISPLAY
CMP _ S E T
36
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
CMP _S E T
MODO RE P ROD. AU TO M AT IC A P A RA A ?
SI RE P S E CA _A
NO
MODO RE P ROD. AU TO M AT IC A P A RA B ?
SI RE P S E CB _B
NO
SI
RE P RODUCI E NDO P A RA A ?
RE P RODUCE A
NO
SI
RE P RODUCI E NDO
RE P RODUCE B
P A RA B ? NO
B OTON S E T P ULS A DO?
SI
RE LOJE S P A RA DOS ?
NO TI E MP OB _B
SI
NO
INICIO
B OTON MODE P ULS A DO?
SI TI E MP OA _B
NO
B OTON UP P ULS A DO?
SI TI E MP OB _A
NO
B OTON NE X T P ULS A DO?
SI
RE LOJE S P A RA DOS ?
NO TI E MP OA _A
SI TX _RS 232
(CONTINUA) PARTIDA
37
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
BOTON JUGADA A PULSADO?
SI REPRO_JUGADA_A
NO
BOTON JUGADA B PULSADO?
SI REPRO_JUGADA_B
NO
NO
TABLERO CONECTADO? SI
TIEMPO TIEMPO D E ENCUESTA?
SI
INICIO_ENCUESTA
NO PARTIDA
38
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
2.3. 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 cuan do se desborda desborda el time timer, r, o sea, cada 51 5122 s. (ver apa apartado rtado 1.5.1.1. 1.5.1.1.). ). Cada vez que 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 aque decrementar el contador asociado ese jugador. el contador llega a cadasecA o 0 sabemos ya ha pasado 1 segundo, por loa que se llama Cuando a la subrutina 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 i nterrupció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 dderectar erectar las jugadas realizadas. Igual que con el control de tiempo decrementaremos un contador para saber cuando cuando han pasado los 0.5 segundo segundos. s. En ese cas casoo actualizaremos una 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
SAL VAR L OS REGISTROS W, STATUS Y PCLATH
MIRA SI SEÑALES EOM ASERTADAS
NO
IGUAL PARA EL JUGADOR B
JUEGAA=1? SI DECREMENTAR CONTADOR A
SI C O N TA D O R A = 0 ?
CADASECA
NO
REINICIAR CONTADOR A
NO
TABLERO CONECTADO? SI DECREMENTAR CONTADOR TABLERO
CONTADOR TABLERO=0?
SI
AC TUA LI ZA R VARIABLE AS OC IA DA
NO
REINICIAR CONTADOR TABLERO RESTAURAR W, STATUS Y PCLATH
LIMPIAR EL FLAG DE INTERRUPCION DEL TMR0 INTCON(T0IF)
PERMITIR INTERRUPCION DEL TMR0 INTCON(T0IE)
RETFIE
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 CONFIG PORTD Y ACTUALIZAR DISPLAY
NO RELOJ DE A=0? SI
SI
HA PASADO YA EL CONTROL? (FLAGA=1?)
FINA=1
NO NO XTRTMPA=1? SI
FLAGA=1
PONER MODO DE REPRODUCCION AU TOM AT ICA
XTRTMPA=0
SI VOLCAR VARIABLES DE FINISH EN VARIABLES RELOJ A
QUEDA MENOS DE UN MINUTO?
CAMBIAR CONFIG PORTD Y ACTUALIZAR DISPLAY
NO RETURN
41
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
2.4. 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, repsecAAy 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 EOM= 0? SI
CONT2A-@MSG2A+ 1= CONTA?
SI
SI REPROA=0
DISPLAY PROXIMO A A C TU A L IZ A R S E ? NO CARGAR EL SIGUIENTE MENSAJE
RETURN
P A R A R E P R O D U C C IO IO N
42
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
TIEMPOA_A
ESTAMOS EN REPRODUCCION AU A U TO M Á TIC A ?
SI
NO
ESTAMOS REPRODUCIENDO POR A?
SI
NO
NO HORAS DE A=0?
REPHORAAA
SI
NO MINUTOS DE A=0?
REPMINAA
SI
NO REPSECAA
SEGUNDOS DE A= 0? SI
RETURN
43
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
REPHORAAA
CONTA=0
MSG1A=@DEL NUMERO CORRESPONDIENTE A HORAA CONTA++
MSG2A=@PALABRA "HORAS" CONTA++
SI MINUTOS DE A=0?
NO MINUNA=0?O MINDEA=0?
SI
SI MINUNA=0? NO
NO MSG3A=@PALABRA CORRESPONDIENTE A M IN DE A CONTA++
MSG3A=@PALABRA CORRESPONDIENTE A M IN DE A CONTA++
MSG3A=@PALABRA CORRESPONDIENTE A MI NU NA CONTA++
MSG4A=@PALABRA "MINUTOS" CONTA++
MSG4A=@PALABRA CORRESPONDIENTE A M IN UN A CONTA++
MSG5A=@PALABRA "MINUTOS" CONTA++
LANZAMOS MSG1A A R EP RO DU C CI O N
CONT2A=MSG2A REPROA=1
RETURN
44
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
REPMINAA
CONTA=0
MINUNA=0?O MINDEA=0?
SI
SI MINUNA=0?
MSG1A=@PALABRA CORRESPONDIENTE A M IND EA CONTA++
NO
NO
MSG1A=@PALABRA CORRESPONDIENTE A M INU NA CONTA++
MSG1A=@PALABRA CORRESPONDIENTE A M IND EA CONTA++ MSG2A=@PALABRA CORRESPONDIENTE A M INU NA CONTA++
MSG2A=@PALABRA "MINUTOS" CONTA++
SECUNA=0?O SECDEA=0? NO
MSG3A=@PALABRA "MINUTOS" CONTA++
MSG3A=@PALABRA CORRESPONDIENTE A S EC DE A CONTA++
SI
SI SECUNA=0?
MSG3A=@PALABRA CORRESPONDIENTE A S EC DE A CONTA++
NO MSG3A=@PALABRA CORRESPONDIENTE A S EC UN A CONTA++
MSG4A=@PALABRA "SEGUNDOS" CONTA++
MSG4A=@PALABRA CORRESPONDIENTE A S EC UN A CONTA++ SECUNA=0?O SECDEA=0? NO MSG4A=@PALABRA CORRESPONDIENTE A S ECD EA CONTA++
SI
SI SECUNA=0?
MSG4A=@PALABRA CORRESPONDIENTE A S EC DE A CONTA++
MSG5A=@PALABRA "SEGUNDOS" CONTA++
NO MSG4A=@PALABRA CORRESPONDIENTE A S EC UNA CONTA++
MSG5A=@PALABRA "SEGUNDOS" CONTA++
MSG5A=@PALABRA CORRESPONDIENTE A S EC UN A CONTA++
MSG6A=@PALABRA "SEGUNDOS" CONTA++ LANZAMOS MSG1A A R EP RO DU CCI ON
CONT2A=MSG2A REPROA=1
RETURN
45
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
REPSECAA
CONTA=0
SECUNA=0?O SECDEA=0? NO MSG1A=@PALABRA CORRESPONDIENTE A SE CD EA CONTA++
SI
SI SECUNA=0?
MSG1A=@PALABRA CORRESPONDIENTE A SE CD EA CONTA++
NO MSG1A=@PALABRA CORRESPONDIENTE A SE CU NA CONTA++
MSG2A=@PALABRA "SEGUNDOS" CONTA++
MSG2A=@PALABRA CORRESPONDIENTE A SE CU NA CONTA++
MSG3A=@PALABRA "SEGUNDOS" CONTA++
LANZAMOS MSG1A A RE PR OD UC CION CI ON
CONT2A=MSG2A REPROA=1
RETURN
46
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
REPRO_JUGADAA
BASE_RAM= 0X110?
SI
RETURN
NO
CONTA=0
CARGAMOS MENSAJE "PIEZA" EN MSG1A
BASE_RAM> 0X190?
BASE_RAM= 0X190?
NOS SITUAMOS EN BASE_RAM-2 (BANCO2)
NOS SITUAMOS EN BASE_RAM-2 (BANCO3)
CARGAMOS "FILA" Y "COLUMNA" ORIGEN EN MSG2A Y MSG3A
CARGAMOS "FILA" Y "COLUMNA" ORIGEN EN MSG2A Y MSG3A
CARGAMOS "FILA" Y "COLUMNA" DESTINOEN MSG4A Y MSG5A
CARGAMOS "FILA" Y "COLUMNA" DESTINOEN MSG4A Y MSG5A
NOS SITUAMOS EN BASE_RAM= 0X16E
LANZAMOS MSG1A A RE PR O DU CC IÓ N
RETURN
47
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
2.5. 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, respectivame r espectivamente. nte. 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 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 de pieza es y se comprueb compruebaa si su movimiento es acorde. Como las distintas piezas del juego se mueven de forma diferente es necesario 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, enemigo, en cuyo caso eess una captura, o de dell mismo bando, lo que 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 i nterceptando 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, f unción, mira_enroque, que determinará si el movimiento de enrocar es acorde con las reglas que le l e 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 paraeselposible jugadorsalir infractor. Tampoco se prosigue la comprobación de más jugadas. Sólo de esta situación volviendocon a poner las piezas como estaban antes del error y siguiendo la partida a partir de este punto.
INICIO_ENCUESTA
ENCUESTA
COMPARA
JUGADA COMPLETA?
NO
SI
EXAMINA
PARTIDA
49
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
E NCUE S TA
CONT_FILA=0
CO NFI G URA R P O RTD 4 BITS ALTOS IN 4 BITS BAJOS OUT
SI
CONT_FILA->PORTD E NA B L E = 0
CONT_FILA->PORTD E NA B L E = 0
TE MP O RI ZA CIO CIO N 1 0 ms
TE MP O RI ZA CIO CIO N 1 0 ms
S E HA A CTUA L IIZA ZA DO EL DISPLAY?
S E HA A CTUA L IIZA ZA DO EL DISPLAY?
NO
SI
NO
E NA B L E = 1
E NA B L E = 1
SALVAR BYTE AL TO PO RT D EN BYTE ALTO ME MO RI A
SALVAR BYTE AL TO P OR TD EN BYTE BAJO ME MO RI A
CONT_FILA++
CONT_FILA++
CONT_FILA=16?
NO
SI CO NFI G URA P O RTD TO DO S A L I DA S
RE TURN
50
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
COMPARA
AU X_ AC TUA L= AC TUA L AU X_ AN TE RI OR =A NT ER IO R B= 0
NO
AU X_ AC TU AL (B )= AU X_ AN TE RIO R( B)?
NO
SI BIT_CAMBIO=0?
AU X_ AC TU AL (B) =1 ? SI
NO
SI NO B+ +
BIT_CAMBIO=0?
AU X_ AC TUA L-> CO OR D_ DE SX B-> COORD_ DESY
SI
SI
AU X_ AC TU AL ->C OO R_ OR 1X B-> COORD_ OR1 Y
B=8? NO B= 0
AU X_ AC TU AL ->C OO R_ OR 2X B-> COORD_ OR2 Y AU X_ AC TU AL AC TU AL =7? NO
SI
BIT_CAMBIO=1
AU X_ AC TUA L+ + AU X_ AN TE RIO R+ +
RETURN
51
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
EXAMINA
BUSCAMOS LA PIEZA QUE SE ESTÁ MOVIENDO EN LA TABLA 'PIEZA'
COMPROBAR TURNO DE JUEGOY SI PIEZA VIVA
DETERMINAR QUE TIPO DE PIEZA SE ESTA MOVIENDO
NO P E O N? SI COMPROBAR MOVIMIENTO PEON
NO TO R R E ? SI COMPROBAR MOVIMIENTO TORRE
NO CABALL O? SI
NO A L F IL ? SI
COMPROBAR MOVIMIENTO CABALLO
COMPROBAR MOVIMIENTO AL FIL
NO DA MA ? SI COMPROBAR MOVIMIENTO TORRE
DETERMINAR SI SE
COMPROBAR MOVIMIENTO
COMPROBAR MOVIMIENTO
HA LLEGADO 8ª/1ª FILAA LA
AL FIL
RE Y
NO
SE ENROCA? SI
MIRA_CAPTURA
MIRA_ENROQUE MIRA_JAQUE
GUARDA_RAM
ACT UA LIZ A VARIABLES DE CONTROL
RETURN
52
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
MIRA_CAPTURA
MIRA_CASILLA (X,Y)
MIRA_CASILLA (DESTINO X,Y)
RECORRER TABLA PIEZA
CASILLA OCUPADA?
SI
COMPROBAR COLOR PIEZA CASILLA OCUPADA
NO COORDENADA_X = X?
NO
RETURN
SI
KILL_PIEZA
NO
FINAL TABLAPIEZA?
COORDENADA_Y = Y?
SI
NO
SI RETURN(0)
NO PIEZA VIVA? SI RETURN(COLOR PIEZA)
KILL_PIEZA
RECORRER TABLA PIEZA
COORDENADA_X = COORDENA_DESTINOX?
NO
SI
NO COORDENADA_Y = COORDENA_DESTINOY?
FINAL TABLAPIEZA?
SI
NO
SI NO
PIEZA VIVA? PON_ERROR
SI LIMPIA FLAG PIEZA VIVA
RETURN
53
53
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
MIRA_JAQUE
JUEGAN BLANCAS?
NO
SI BUSCAMOS LAS COORDENADAS DEL REY BLANCO
BUSCAMOS LAS COORDENADAS DEL REY NEGRO
GUARDAMOS LAS COORDENADAS EN 'FILA' Y 'COLUM 'COLUM NA'
GUARDAMOS LAS COORDENADAS EN 'FILA' Y 'COLUM 'COLUM NA'
ATA Q UE (FIL A, COLUMNA,NEGRAS)
ATA QU E(F ILA , COLUMNA,BLANCAS)
ATA Q UE RETORNA 1?
SI
ATA QU E RETORNA 1?
PO N_ERRO R
BUSCAMOS LAS COORDENADAS DEL REY NEGRO
GUARDAMOS LAS COORDENADAS EN 'FILA' Y 'COLUM 'COLUM NA'
ATA Q UE (FIL A, COLUMNA,BLANCAS)
ATA QU E(F ILA , COLUMNA,NEGRAS)
SI
P O N_E RRO R
BUSCAMOS LAS COORDENADAS DEL REY BLANCO
R E TU R N
GUARDAMOS LAS COORDENADAS EN 'FILA' Y 'COLUM 'COLUM NA'
ATA Q UE RETORNA 1?
SI
PON FLAG JAQUE REY NEGRO
ATA QU E RETORNA 1?
NO
R E TU R N
SI
PON FLAG JAQUE REY BLANCO
NO
QUITA FLAG JAQUE REY NEGRO
QUITA FLAG JAQUE REY BLANCO
RETURN
54
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
MIRA_ENROQUE
ENROQUE CORTO?
NO
IGUALPARA ENROQUE LARGO
SI
JUEGAN BLANCAS?
NO
SI
ENROQUE CORTO PERMITIDO?
NO
NO
SI
BLANCAS EN JAQUE?
SI
SI
SI
NO
CASILLAS DE PASO OCUPADAS? (F1 Y G1)
ENROQUE CORTO PERMITIDO?
NEGRAS EN JAQUE? NO
SI SI
NO
CASILLAS DE PASO OCUPADAS? (F8 Y G8)
NO
AT AQ UE (F1 , NEGRAS)
AT AQ UE (F8 , BLANCAS)
AT ATAQ AQ UE (G 1,
AT AQ UE (G 8,
NEGRAS)
BLANCAS)
CASILLAS DE PASO ATACAD ATACADAS? AS? (F1 Y G1)
SI SI
NO
CASILLAS DE PASO ATACADAS? (F8 Y G8)
NO
PON_ERROR
RETURN
55
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
ATA QU E (FIL A, CO LU MN A, COLOR BANDO A TACANTE) TACANTE)
RECORRE TABLA PIEZA
PIEZA VIVA?
NO
SI
NO
COORDENADA_X= FILA? SI
NO
COORDENADA_Y= COLUMNA?
NO
SI NO
COLOR PIEZA= BANDO ATACANTE?
FINAL TABLA PIEZA?
SI RETURN(0)
SI
DETERMINAR DE QUE PIEZA SE TRATA
NO PE O N?
NO TO RR E ?
SI
SI
COMPROBAR CASILLAS AT AQ UE PE ON
CASILLA ATA CA DA ?
COMPROBAR CASILLAS ATA QU E TOR RE
NO CA B A L LO ? SI COMPROBAR CASILLAS ATA QU E CA BA LL O
NO A L FIL ? SI COMPROBAR CASILLAS ATA QU E AL FIL
NO DAMA? SI COMPROBAR CASILLAS AT AQ UE TO RR E
NO
SI RETURN(1)
56
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
PON_ERROR
ENCIENDE LED ERROR
POSICION TABLERO REESTABLECIDA?
SI
A PA G A LED ERROR
NO
NO
PETICION AUD A UD IO JU G A DA ?
RETURN
SI
REPRODUCE MENSAJE "JUGADA ILEGAL"
57
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
2.6. 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 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
Memoria de Cáculo
SETCUENTA
OFFSET= OFFSET + 12
OFFSET= POSICION 84 DE LA EEPROM DEL PIC?
SI
OFFSET=0
NO
COGEREE
SI SETBOTON PULSADO? NO
BOTON JUGADOR A PULSADO?
SI
NO
BOTON JUGADOR B PULSADO?
SI
GUARDAMOS EL OFFSET EN LA POSICION 0 DE LA EEPROM DEL PIC
NO RETURN
59
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
GUARDA_RAM
COMPONEMOS BYTE COORDENADA ORIGEN (HIGH: (HIGH: COORD Y, LOW CO ORD X)
BASE_RAM> 0X190?
SI
BASE_RAM= 0X1EF?
NO
SI
NO
GUARDA BYTE ORIGEN EN RAM
GUARDA BYTE ORIGEN EN RAM
BASE_RAM++
BASE_RAM++
COMPONEMOS BYTE COORDENADA DESTINO
COMPONEMOS BYTE COORDENADA DESTINO
GUARDA BYTE DESTINO EN RAM
GUARDA BYTE DESTINO EN RAM
BASE_RAM= 0X16F?
NO
SI
B A S E _ R A M =0 X 1 9 0
B A S E _ R A M ++
RETURN
60
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Memoria de Cáculo
TX_RS232
BASE_RAM= 0X120?
SI
FALLO MEMORIA VACIA
NO
AC TIV AR US AR T (RCSTA(SPEN)=1)
RETURN
CONFIGURAR USART PARA TRANSIMISION (TXSTA=0x24)
VELOCIDAD=9600 BAUDIOS (SPBRG=25)
AC TIV AR US AR T (RCSTA(SPEN)=1)
INCREMENTAR PUNTERO
NO
HABILITAR TRANSMISION (TXSTA(TXEN)=1)
PUNTERO= BASE_RAM? SI TRANSMITIR BYTE 0XFF (FIN TRANSMISION)
INICIALIZAR PUNTERO A MEMORIA
FIN DE TRANSMISION? (TXSTA(TRMT)=1?)
NO
LEER CONTENIDO MEMORIA RAM SI
RETURN SI TRANSMITIR (TXREG)BYTE
FIN(TXSTA(TRMT)=1?) DE TRANSMISION? NO
61
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
3. PLANOS
Planos
62
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 Ca Cara ra C Componentes omponentes Placa 1.
Planos
63
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
3.5.3. Máscara de Ca Cara ra S Soldadura oldadura Placa 1.
3.5.4. Situación de Componentes Placa 2.
Planos
64
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
3.5.5. Máscara de Ca Cara ra C Componentes omponentes Placa 2.
3.5.6. Máscara de Ca Cara ra S Soldadura oldadura Placa 2.
Planos
65
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
4. PRESUPUESTO
Presupuesto
66
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º
Ud.
Descripción
Nº Partes
Subtotal
TOTAL
1.1
H
HORAS DISEÑO PROTOTIPO HORAS DE DISEÑO Y DESARROLLO DESARROLLO DEL PROTOTIPO
350
350 350
67
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 2: Componentes Electrónicos. Nº
Ud.
Descripción
Nº Partes
Subtotal
TOTAL
2.1
U
MICROCONTROLADOR PIC16F877 MICROCONTROLADOR MICROCONTROL ADOR MODELO PIC16F877 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 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
SENSOR ÓPTICO MODELO OPB620 2.5
U
OPB620 64
64
74HC4514N DECODIFICADOR 1:16 MODELO 74HC4514N CON 4 ENTRADAS DE SELECCIÓN, SALIDA A NIVEL ALTO
64
1
1 1
2.6
U
MAX232 C. I. MAX232 TRANSMISIÓN/RECEPCIÓN TRANSMISIÓN/RECEPCIÓN DE SEÑALES TTL/232.
1
1 1
2.7
U
CRISTAL DE CUARZO DE 4 MHz. 2.8
U
OSCILADOR 4 MHz 1
1
LM7805 REGULADOR DE TENSIÓN MODELO LM7805
1
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
Presupuesto
Nº
Ud.
Descripción
Nº Partes
Subtotal
TOTAL
2.11 U
PULSADOR COLOR ROJO PULSADOR MINIATURA COLOR ROJO
4
4 4
2.12 U
PULSADOR COLOR AMARILLO 2
2.13 U
PULSADOR MINIATURA CO COLOR AMARILLO PULSADOR COLOR NEGRO PULSADOR MINIATURA COLOR NEGRO
2
2
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 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 AMPLIFICADOR LM741
1
1 1
2.20 U
RESISTENCIA RESISTENCI A DE 1 k Ω 1/4 1/4 W 2.21 U
4 1
1 1
1
1 1
RESISTENCIA 2,2 k Ω RESISTENCIA RESISTENCI A DE 2,2 k Ω 1/4 1/4 W
4
RESISTENCIA 100 Ω RESISTENCIA RESISTENCI A DE 1 k Ω 1/4 1/4 W
2.23 U
4
RESISTENCIA 10 k Ω RESISTENCIA DE 10 k Ω 1/4 1/4 W
2.22 U
RESISTENCIA 1 k Ω
4
4 4
69
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Nº
Ud.
Descripción
Nº Partes
Subtotal
TOTAL
2.24 U
RESISTENCIA 220 k Ω RESISTENCIA RESISTENCI A DE 220 k Ω 1/4 1/4 W
2.25 U
4 1
1
3
3 3
CONDENSADOR 100 nF CONDENSADOR CERÁMICO 100 Nf
1
POTENCIÓMETRO 4,7 k Ω POTENCIÓMETRO POTENCIÓMET RO DE 4,7 k Ω 1/4 1/4 W
2.27 U
4
RESISTENCIA 18 k Ω RESISTENCIA DE 18 k Ω 1/4 1/4 W
2.26 U
4
1
1 1
2.28 U
CONDENSADOR 330 nF CONDENSADOR CERÁMICO 330 Nf
1
1 1
2.29 U
CONDENSADOR CERÁMICO 22 pF 2.30 U
2
2
4
4 4
ZÓCALO 40 PINES ZÓCALO 40 PINES TORNEADO
2
CONDENSADOR 22 µF CONDENSADOR ELECTROLÍTICO ELECTROLÍTICO 22 µF
2.31 U
CONDENSADOR 22 pF
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º
Ud.
Descripción
Nº Partes
Subtotal
TOTAL
3.1
U
CIRCUITO IMPRESO PLACA CIRCUITO IMPRESO DOBLE CARA 180 x 100 mm.
3.2
U
1 1
CIRCUITO IMPRESO PLACA CIRCUITO IMPRESO DOBLE CARA 70 x 40 mm.
1
1
1 1
71
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Capítulo 4: Conectores y Cables. Nº
Ud.
Descripción
Nº Partes
Subtotal
TOTAL
4.1
U
CONECTOR CABLE PLANO CONECTOR CABLE PLANO MACHO DE 14 CONTACTOS
4.2
U
U
4
CONECTOR CABLE PLANO CONECTOR CABLE PLANO MACHO DE 16 CONTACTOS
4.3
4
1
1 1
CONECTOR DB9 CONECTOR DB9 HEMBRA ACODADO
4
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º
Ud.
Descripción
Nº Partes
Subtotal
TOTAL
5.1
U
CAJA PLÁSTICO CAJA DE PLÁSTICO COLOR NEGRO 200 x 140 x 90 mm
5.2
1
1
U
1
TABLERO AJEDREZ TABLERO DE AJEDREZ, LÁMINA DE PLÁSTICO SERIGRAFIADA 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
Presupuesto
4.2. Cuadro de precios. Capítulo 1: Horas De Diseño. Nº 1.1
Ud. H
Descripción HORAS DISEÑO PROTOTIPO HORAS DE DISEÑO Y DESARROLLO DESARROLLO DEL PROTOTIPO
Precio (€) 38,84 TREINTA Y OCHO EUROS CON OCHENTA Y CUATRO CÉNTIMOS
74
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 MICROCONTROLADOR PIC16F877 MICROCONTROLADOR MODELO PIC16F877 MICROCONTROLADOR PIC16F877 DE MICROCHIP DE 8 K. DE MEMORIA DE PROGRAMA, 33 PINES DE E/S
2.2
U
ISD 2560 DISPOSITIVO GRABADOR/REPRODUCTOR 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
Precio (€) 9,70 NUEVE EUROS CON SETENTA CÉNTIMOS
18,32 DIECIOCHO EUROS CON TREINTA Y DOS CÉNTIMOS 12,15 DOCE EUROS CON QUINCE CÉNTIMOS
2.4
U
OPB620 SENSOR ÓPTICO MODELO OPB620
0,82 OCHENTA Y DOS CÉNTIMOS
2.5
U
74HC4514N
1,21 UN EURO CON VEINTIUN CÉNTIMOS
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 TRANSMISIÓN/RECEPCIÓN DE SEÑALES TTL/232.
2.7
2.8
U
OSCILADOR 4 MHz
U
CRISTAL DE CUARZO DE 4 MHz. LM7805
1,23 UN EURO CON VEINTITRÉS CÉNTIMOS 0,84 OCHENTA Y CUATRO CÉNTIMOS 0,28 VEINTIOCHO CÉNTIMOS
REGULADOR DE TENSIÓN MODELO LM7805 2.9
U
PILA 9V PILA ALCALINA DE 9V
2.10 U
CONECTOR PILA 9V PORTAPILAS PILA 9V
1,70 UN EURO CON SETENTA CÉNTIMOS 0,20 VEINTE CÉNTIMOS
75
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Nº
Ud.
2.11 U
Descripción 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
Precio (€) 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
2.16 U
LED ROJO DIODO EMISOR DE LUZ 3 MM COLOR ROJO
0,09 NUEVE CÉNTIMOS
2.17 U
LED AMARILLO
0,09 NUEVE CÉNTIMOS
DIODO EMISOR DE LUZ 3 MM COLOR AMARILLO AMARILLO 2.18 U
DIODO ZENER
0,08 OCHO CÉNTIMOS
DIODO ZENER MODELO 1N750 4,7 V 2.19 U
LM741 AMPLIFICADOR AMPLIFICAD OR OPERACIONAL MODELO
2.20 U
LM741 RESISTENCIA 1 k Ω
0,36 TREINTA Y SEIS CÉNTIMOS 0,02 DOS CÉNTIMOS
RESISTENCIA RESISTENCI A DE 1 k Ω 1/4 1/4 W 2.21 U
RESISTENCIA 10 k Ω
0,02 DOS CÉNTIMOS
RESISTENCIA DE 10 k Ω 1/4 1/4 W 2.22 U
RESISTENCIA 100 Ω
0,02 DOS CÉNTIMOS
RESISTENCIA RESISTENCI A DE 1 k Ω 1/4 1/4 W 2.23 U
RESISTENCIA 2,2 k Ω RESISTENCIA RESISTENCI A DE 2,2 k Ω 1/4 1/4 W
0,02 DOS CÉNTIMOS
76
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Nº
Ud.
2.24 U
Descripción RESISTENCIA 220 k Ω
Precio (€) 0,02 DOS CÉNTIMOS
RESISTENCIA RESISTENCI A DE 220 k Ω 1/4 1/4 W 2.25 U
RESISTENCIA 18 k Ω RESISTENCIA DE 18 k Ω 1/4 1/4 W
2.26 U
POTENCIÓMETRO 4,7 k Ω
0,02 DOS CÉNTIMOS 0,12 DOCE CÉNTIMOS
POTENCIÓMETRO POTENCIÓMET RO DE 4,7 k Ω 1/4 1/4 W 2.27 U
CONDENSADOR 100 nF
0,11 ONCE CÉNTIMOS
CONDENSADOR CERÁMICO 100 nF 2.28 U
CONDENSADOR 330 nF
0,11 ONCE CÉNTIMOS
CONDENSADOR CERÁMICO 330 nF 2.29 U
CONDENSADOR 22 pF CONDENSADOR CERÁMICO 22 pF
2.30 U
CONDENSADOR 22 µF
0,08 OCHO CÉNTIMOS 0,13 TRECE CÉNTIMOS
CONDENSADOR ELECTROLÍTICO 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
0,63 SESENTA Y TRES CÉNTIMOS 0,57 CINCUENTA Y SIETE CÉNTIMOS
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 CIRCUITO IMPRESO PLACA IMPRESO DOBLE CARA 180 x 100CIRCUITO mm.
3.2
U
CIRCUITO IMPRESO PLACA CIRCUITO IMPRESO DOBLE CARA 70 x 40 mm.
Precio (€) 4,60 CUATRO EUROS CON SESENTA CÉNTIMOS 1,54 UN EURO CON CINCUENTA Y CUATRO CÉNTIMOS
78
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 CONECTOR CABLE PLANO
Precio (€) 0,28 VEINTIOCHO CÉNTIMOS
CONECTOR CABLE PLANO MACHO DE 14 CONTACTOS 4.2
U
CONECTOR CABLE PLANO
0,28 VEINTIOCHO CÉNTIMOS
CONECTOR CABLE PLANO MACHO DE 16 CONTACTOS 4.3
U
CONECTOR DB9 CONECTOR DB9 HEMBRA ACODADO
4.4
U
CONECTOR AURICULAR
0,66 SESENTA Y SEIS CÉNTIMOS 0,22 VEINTIDOS CÉNTIMOS
CONECTOR AURICULAR TIPO JACK 3,5 ESTEREO 4.5
U
CABLE PLANO CABLE PLANO
0,63 SESENTA Y TRES CÉNTIMOS
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 CAJA PLÁSTICO CAJA DE PLÁSTICO 200 x 140 x 90 mm COLOR NEGRO
5.2
U
TABLERO AJEDREZ TABLERO DE AJEDREZ, LÁMINA DE PLÁSTICO SERIGRAFIADA SERIGRAFIADA 400 x 410 mm
5.3
U
PIEZAS AJEDREZ PIEZAS DE AJEDREZ PARA INVIDENTES MODELO STAUNTON Nº 4
Precio (€) 3,16 TRES EUROS CON DIECISEIS CÉNTIMOS 3,50 TRES EUROS CON CINCUENTA CÉNTIMOS 12,00 DOCE EUROS
80
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
4.3. Aplicación de precios. Capítulo 1: Horas de Diseño. Nº 1.1
Ud. H
Descripción HORAS DISEÑO PROTOTIPO
Cantidad 350
Precio (€) 38,84
TOTAL (€) 13594,00
HORAS DE DISEÑO Y DESARROLLO 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.
Descripción
Cantidad
Precio (€)
TOTAL (€)
U
MICROCONTROLADOR PIC16F877
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 MICROCONTROL ADOR MODELO PIC16F877 PIC16F877 DE MICROCHIP DE 8 K. DE MEMORIA DE PROGRAMA, 33 PINES DE E/S 2.2
U
ISD 2560 DISPOSITIVO GRABADOR/REPRODUCTOR 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 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
Presupuesto
Nº
Ud.
2.11 U
Descripción
Cantidad
Precio (€)
TOTAL (€)
PULSADOR COLOR ROJO
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 AMARILLO
2.18 U
DIODO ZENER DIODO ZENER MODELO 1N750 4,7 V
2.19 U
LM741 AMPLIFICADOR OPERACIONAL MODELO AMPLIFICADOR LM741
2.20 U
RESISTENCIA 1 k Ω RESISTENCIA RESISTENCI A DE 1 k Ω 1/4 1/4 W
2.21 U
RESISTENCIA 10 k Ω RESISTENCIA DE 10 k Ω 1/4 1/4 W
2.22 U
RESISTENCIA 100 Ω RESISTENCIA RESISTENCI A DE 1 k Ω 1/4 1/4 W
2.23 U
RESISTENCIA 2,2 k Ω RESISTENCIA RESISTENCI A DE 2,2 k Ω 1/4 1/4 W
83
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Nº
Ud.
2.24 U
Descripción
Cantidad
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 220 k Ω RESISTENCIA RESISTENCI A DE 220 k Ω 1/4 1/4 W
2.25 U
RESISTENCIA 18 k Ω RESISTENCIA DE 18 k Ω 1/4 1/4 W
2.26 U
POTENCIÓMETRO 4,7 k Ω POTENCIÓMETRO POTENCIÓMET RO DE 4,7 k Ω 1/4 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 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.
Descripción
Cantidad
Precio (€)
TOTAL (€)
U
CIRCUITO IMPRESO
1
4,60
4,60
PLACA IMPRESO DOBLE CARA 180 x 100CIRCUITO mm. 3.2
U
CIRCUITO IMPRESO
1
1,54
1,54
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.
Descripción
Cantidad
Precio (€)
TOTAL (€)
U
CONECTOR CABLE PLANO
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 CONTACTOSCABLE PLANO MACHO DE 14 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.
Descripción
Cantidad
Precio (€)
TOTAL (€)
U
CAJA PLÁSTICO
1
3,16
1
3,50
3,50
1
12,00
12,00
3,16
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 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
Presupuesto
4.4. 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
TOTAL
Meses de utilización
Coste de amortización
250 €
Precio por mes amortización 5 años 4,16 €
6
24,96 €
1.100 €
18,33 €
6
109,98 € 134,94 €
Precio
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
TOTAL
13594,00 128,53 6,14 2,57 18,66 134,94
€ € € € € €
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
Presupuesto
4.5. 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 MICROCONTROLADOR PIC16F877
Cantidad
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 MICROCONTROLADOR PIC16F877 DE MICROCHIP DE 8 K. DE MEMORIA DE PROGRAMA, 33 PINES DE E/S U
ISD 2560 DISPOSITIVO DISPOSITI VO GRABADOR/REPRODUCTOR 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 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
Presupuesto
Ud. U
Descripción PULSADOR COLOR ROJO
Cantidad
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 AMARILLO
U
DIODO ZENER DIODO ZENER MODELO 1N750 4,7 V
U
LM741 AMPLIFICADOR OPERACIONAL MODELO AMPLIFICADOR LM741
U
RESISTENCIA 1 k Ω RESISTENCIA RESISTENCI A DE 1 k Ω 1/4 1/4 W
U
RESISTENCIA 10 k Ω RESISTENCIA DE 10 k Ω 1/4 1/4 W
U
RESISTENCIA 100 Ω RESISTENCIA RESISTENCI A DE 1 k Ω 1/4 1/4 W
U
RESISTENCIA 18 k Ω RESISTENCIA DE 18 k Ω 1/4 1/4 W
90
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
Ud. U
Descripción POTENCIÓMETRO 4,7 k Ω
Cantidad
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 POTENCIÓMET RO DE 4,7 k Ω 1/4 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 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
Presupuesto
Ud. U
Descripción
Cantidad
Precio (€)
TOTAL (€)
1
2,52
2,52
CAJA PLÁSTICO 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
10,00 €
LINEA DE PRODUCCIÓN C.I. + MANO DE OBRA
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 OPB620
Cantidad
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 RESISTENCI A DE 2,2 k Ω 1/4 1/4 W
U
RESISTENCIA 220 k Ω RESISTENCIA RESISTENCI A DE 220 k Ω 1/4 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 SERIGRAFIADA 400 x 410 mm
93
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Presupuesto
47,42 €
COSTE MATERIAL
2,84 €
BENEFICIO INDUSTRIAL (6%)
(13.594 / 3.500) = 3,88 €
AMORTIZACIÓN HORAS DE DISEÑO
10,00 €
LINEA DE PRODUCCIÓN C.I. + MANO DE OBRA
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
Bibliografía
95
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 1997. Martínez, “Microcontroladores Pic. Diseño Práctico de Aplicaciones”. Ed: Mc Graw-Hill, ISBN:I.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”. 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 [Software de simulación simulación y depuración de código ensamblamdor ensamblamdor http://www.microchip.com para PIC’s (MPLAB), (MPLAB), Data Sheet Sheet 16F877].
[10]
http://www.isd.com. [Data Sheet dispotivos ISD2560]. http://www.isd.com.
[11]
http://www.x-robotics.com.. [Información funcionamiento displays alfanuméricos y conexión http://www.x-robotics.com microcontrolador-PC].
[12]
http://www.micropik.com. 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
Anexos
97
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 de color rojo, se encenderá encenderá cuando se realice una jugada ilegal en el 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 tiempo se usan cuatro 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 ti empo 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 Observará comoPuede los dígitos mostrados en pantalla sucesivamente conpartida. cada nueva pulsación. configurarse cualquiera de loscambian 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 inutos + 1 hora finish
30 m inuto inutoss finish
5 minutos finish
4 m inuto inutoss + 2 seg/jugada
25 m inuto inutoss + 10 seg/jugada
90 minutos + 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 Microcontrol Microcontrolador ador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
6.1.3. Uso del Tablero Adaptado.
6.1.3.1. 6.1. 3.1.
C om omo o C one onecta ctarr el T ab ablero. lero.
Para utilizar el tablero adaptado coloque las piezas en la posición de inicio de partida (ver figura 3). Después conecte el tablero t ablero aall reloj r eloj con c on 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. 6.1.3. 2.
C omo E mpezar la P ar tida tida..
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 H ace cerr C ua uand ndo o se P r oduce un E r r or .
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
Anexos
6.1.3.4.
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 atablero está conectado. movida.coordenada movida.coordenad origen.coordenada origen.coordena da destino. El formato del mensaje es pieza 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 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 aparecer son: Bits por segundo : 9600 Bits de datos : 8 Paridad : ninguna Bits de parada : 1 Control de 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 mensaje “Comunicación 232 con PIC”, “Espera “Esperando ndo transmisión”. transmisión”. En este 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
Anexos
6.2. 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
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'
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 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 aux_anterior aux_piezas coord_desx coord_desy control aux_x aux_y fila columna enroque bit auxAA1 auxCC coord_or2x coord_or2y tics_tab tics_tab1
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
H'4D' H'4E' H'4F' H'50' H'51' H'52' H'53' H'54' H'55' H'56' H'57' H'58' H'59' H'5A' H'5B' H'5C' H'5D' 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
EQU EQU EQU EQU EQU EQU
H'72' 0x73 ; tabla anterior0 77:7E banco 0 0x74 0x75 0x76 0x43
#DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE
DIS_RW DIS_RS DIS_E b_jugA b_jugB b_set b_up
D'1' D'0' D'0' D'6' D'7' D'5' D'4'
; ; ; ; ; ; ;
PORTA PORTA PORTE PORTB PORTB PORTB B_B PORTB B_A
#DEFINE #DEFINE #DEFINE #DEFINE
b_mode b_next b_jugadaA b_jugadaB
D'3' D'2' D'1' D'0'
; ; ; ;
PORTB A_B PORTB A_A PORTB PORTB
Anexos
105
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
#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
D'2' D'3' D'0' D'1' D'4' D'5' D'2' D'1' D'3'
; ; ; ; ; ; ; ; ;
PORTC PORTC PORTC PORTC PORTC PORTC PORTE PORTE PORTA ent1
#DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE
enable2 led_error RETARDO1 RETARDO2 RETARDO3 b_ram anterior0 anterior actual piezas una hora horas minuto minutos segundos jug_ilegal
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
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
endm 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
macro STATUS,IRP FSR FSR,7
; accede al banco 0
movf auxAA,W movwf INDF endm 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 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.
Anexos
107
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
mira_reproduce btfss goto btfss bsf btfss goto btfss bsf
macro reproA,0 ; $+3 ; PORTC,eom_isd1 reproA,1 ; reproB,0 ; $+3 ; PORTC,eom_isd2 reproB,1 ;
estamos reproduciendo por A? no ; fin de mensaje A? si no, estamos reproduciendo por B? no ; si, fin de mensaje B? si
endm ;-------------------------------------------------------------------------; ; 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
w_temp STATUS,W
; salvamos el registro W ; y el registro de estado
status_temp PCLATH,W pclath_temp PCLATH
; no hemos cambiado ningún flag ; salva parte alta del contador de programa
goto
isr
;-------------------------------------------------------------------------; ; 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
clrf
TRISE
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 ; PORTC [2:3,7] entradas, [0:1]y[4:6] salidas ; PORTE 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 ; con configuracion figuracion de del l 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
Anexos
movlw movwf movwf movwf movwf movwf movwf movwf
H'00' juegaA juegaB xtrtmpA xtrtmpB nsecmov auto reproA
; inicializacion de variables
movwf reproB movwf 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
si_tablero ; si no ha llegado a 0 continua ticsB1 contaB cadasecB ; si es 0 ejecutar cadasecB D'217' ; y poner ticsB al valor inicial ticsB ; ticsB = 217
movlw D'9' movwf ticsB1 goto si_tablero
; volver de la ISR
109
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
contaA
contaB
si_tablero
si_tablero1
movlw D'217' movwf ticsA goto si_tablero movlw D'217' movwf ticsB
; y poner ticsA al valor inicial
; y poner ticsB al valor inicial
btfsc cambio,7 goto $+3 btfss cambio,4
; tablero conectado? ; si ; no, tablero 2 conectado?
goto btfsc goto btfss goto decfsz goto decfsz goto bsf movlw movwf movlw movwf
; ; ; ; ;
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
no si, juega A? no juega B? no
; bit(6) cambio=1 ; encuestas cada 0.5 segundos
restaura
banco0 movf pclath_temp,W movwf PCLATH
original
swapf status_temp,W
; restauramos registro de estado
movwf STATUS
; y lo guardamos en el registro de
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
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
movlw movwf decf btfss
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
Anexos
bsf bsf
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
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
btfss STATUS,Z return bsf auto,0 return
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
PORTA,enable ; enable=1 tablero deshabilitado
bsf btfsc return decf incfsz goto movlw movwf decf incfsz goto movlw movwf decf incfsz goto movlw movwf
PORTA,enable2 finB,0
decf incfsz goto movlw movwf decf btfss bsf bsf
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
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
D banco1 clrf TRISD banco0 clrf PORTD call lcd_tiempoB
fiB
movf btfss goto movf btfss goto movf btfss goto movf btfss goto movf btfss goto bcf btfss goto bsf return
extraB
; 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
goto bsf bcf movf
fiB flagB,0 xtrtmpB,0 esecunB,W
112
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
movwf movf movwf movf movwf movf movwf movf movwf
secunB esecdeB,W secdeB eminunB,W minunB emindeB,W mindeB ehoraB,W horaB
btfss PORTE,ce_isd1 bsf PORTE,ce_isd1 bsf cambio,5 ; se ha cambiado la configuracion del puerto D banco1 clrf TRISD banco0 clrf PORTD call lcd_tiempoB return autoB
movf btfss return movf btfss return movf
; PORTD todo salidas ; si, fin de la encuesta ; actualizamos las variables
horaB,f STATUS,Z minunB,f STATUS,Z mindeB,f
btfss return STATUS,Z bsf auto,1 return ;-------------------------------------------------------------------------; ; 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
goto btfsc goto btfss goto btfss
btfsc cambio,7 botones2 ; cambio,4 ; botones2 ; PORTB,b_jugA ; empiezaB ; PORTB,b_jugB ;
; tablero conectado? si tablero 2 conectado? si no, boton A pulsado? si, saltamos a empiezaB 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 ; bo boton ton 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
Anexos
goto btfss goto btfsc goto bsf bcf btfss goto
jugA_1
jugB
jugB_1
cmp_set cmp_2 cmp_4
cmp_1
cmp_3
$+3 cambio,4 $+3 control,0 jugA_1 juegaA,0 juegaB,0 nsecmov,0 $+4
; no, tablero2 conectado? ; turno de las blancas? ; si no, se actualiza juegaA=1, juegaB=0 ; estamos en algun modo fischer?
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 goto btfsc goto btfss goto btfss goto
juegaB,0 jugB_1 cambio,7 $+3 cambio,4 $+3 control,0 jugB_1
; variable actualizada? ; si la var ya esta actualizada saltamos ; tablero conectado? ; no, tablero2 conectado? ; turno de las negras?
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
PORTB,b_set ; miramos si boton pulsado $+6 estado_botones,b_set $+7 estado_botones,b_set boton_set $+4
call cont_20ms btfsc PORTB,b_set bsf 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 PORTB,b_up goto $+6 btfss estado_botones,b_up goto bcf call goto call btfsc bsf
$+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
Anexos
116
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
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 ; tablero conectado? goto $+3 btfss cambio,4 goto partida btfss cambio,6 ; tiempo de encuesta? goto partida pagina2 goto inicio_encuesta ; inicia la encuesta tiempo_enc1
bcf goto
cmp_set2
pagina1 call repro_jugadaA pagina0 goto partida pagina1 call repro_jugadaB pagina0 goto partida
cmp_set3
cambio,6 partida
; no, repite el bucle
;-------------------------------------------------------------------------; ; 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 a algun lgun 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
H'01' offset,W leeree nsecmov H'02' offset,W leeree xtrtmpA xtrtmpB H'03' offset,W leeree horaA
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
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
Anexos
movlw addwf call movwf movwf call call return
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 memoria banco 3 de de datos memoria apuntamos a la 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
Anexos
call cont_20ms movlw b'00000010'
; N Nos os situamos en la posicion 0 de la memoria 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 h'C0' call lcd_i movlw call movlw call movlw call return
'coord_or2y bit,W coord_or2y cambio,1 ; cambio, bit1=1 actualiza
btfss goto btfsc goto movlw subwf movwf movf movwf
cambio,0 pon_error cambio,2 pon_error actual ; si, aux_actual,W coord_desx bit,W coord_desy
bsf call
cambio,2 actualiza
; bit0 de cambio =1? ; bit2 de 'cambio' =0? ; no, error guardamos coord_desx
; b->coord_or1y ; cambio, bit2=1 jugada completa
return ;-------------------------------------------------------------------------
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 return incf incf goto
STATUS,Z
; aux_actual-actual=7?
aux_actual aux_anterior0 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 btfsc goto incf incf goto
auxAA,W ; hemos llegado al final del array? STATUS,Z compara12 ; si, reiniciamos el proceso aux_actual ; no aux_anterior0 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
compara13
; mira si hay peticion de audio
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 call
cont_20ms 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
Anexos
rep_errorB
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 ; i igual gual 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
Anexos
goto incf incf goto examina2
pon_error ; si, es un error aux_piezas ; no offset_piezas examina1
movf auxAA,W andlw h'F0' movwf auxAA
; aplica mascara para seleccionar coord y
swapf subwf btfsc goto incf incf goto
auxAA,W coord_or1y,W ; i igual gual a coord_or1y? STATUS,Z examina3 ; si aux_piezas ; no 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
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
; 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
auxAA auxAA,3 peon_negro coord_desy,W ; peon blanco coord_or1y,W STATUS,Z ; coordenadas y (columna) iguales? captura_peonb ; no coord_or1x,W
subwf movwf decf btfsc goto
coord_desx,W auxAA auxAA STATUS,Z ; avance una posicion? examina_peon1 ; si, miramos si casilla destino ocupada
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
; 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 ;
peon negro coordenadas y (columna) iguales? no
avance una posicion? si, miramos si casilla destino ocupada
decf auxAA btfss STATUS,Z
; no, avance 2 posiciones?
goto pon_error movlw h'06'
; no ; si, miramos si fila inicial es 6
Anexos
subwf coord_or1x,W btfss STATUS,Z
169
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
goto incf movwf movf movwf call movwf btfsc
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?
goto goto
pon_error examina_peon1 ; ; si 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
coord_or1x,W ; comprobamos geometria del movimiento coord_desx,W ; c coordenadas oordenadas x iguales? STATUS,Z examina_torre1 ; si coord_or1y,W ; no, coordenadas y iguales? coord_desy,W STATUS,Z examina_torre2 ; si
btfss control,5 goto pon error
; no, mueve una dama? ; no
Anexos
goto examina_torre1
examina_alfil ; si movf
coord_or1y,W ; comprobamos casillas de paso y
170
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
examina_ty
movwf movf subwf btfss goto incf goto decf
auxBB coord_or1y,W coord_desy,W STATUS,C ; coord_or1y > coord_desy ? $+3 ; si auxBB ; no $+2 auxBB
movf subwf btfsc goto movf movwf movf movwf call movwf btfsc goto goto
auxBB,W coord_desy,W ; coincide con la casilla destino ? STATUS,Z quita_enroquet ; si auxBB,W aux_y coord_or1x,W aux_x mira_casilla ; miramos si la casilla esta ocupada auxAA auxAA,0 ; ocupada ? pon_error ; si examina_ty
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
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
btfss STATUS,Z goto quita enroquet3
Anexos
movlw h'07' subwf coord_or1y,W btfss STATUS,Z
171
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
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
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 btfss STATUS,Z
; desplazamiento lateral=1?
btfss goto movf subwf
STATUS,Z examina_caba2 ; no coord_desx,W coord_or1x,W ; si, desplazamiento horizont horizontal=2? al=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 STATUS,Z auxAA,W btfss 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 horizont horizontal=1? al=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
Anexos
; examina_dama bsf goto
control,5 ; indicamos que mueve una dama examina_torre ; se mira el movimiento de torre o alfil
173
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
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
Anexos
bsf control,0 bcf control,5 bcf control,6 return
174
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
;*********************************************************************** mira_enroque btfsc goto movlw subwf btfss
control,0 ; juegan blancas? mira_enroque2 h'06' ; si, comprobamos casilla destino coord_desy,W STATUS,Z
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
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
movlw h'00'
; no, miramos si casillas de paso ocupadas
movwf movlw movwf call
aux_x h'03' aux_y mira_casilla
175
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
movwf btfsc goto movlw movwf call movwf btfsc
auxAA auxAA,0 pon_error h'02' aux_y mira_casilla auxAA auxAA,0
goto movlw movwf movlw movwf movlw call movwf btfsc goto movlw movwf movlw call movwf btfsc goto bsf bcf call goto
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
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
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
btfsc auxAA,0
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
goto movlw movwf movlw
pon_error h'06' columna h'00'
176
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos
Anexos
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
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