Beruflich Dokumente
Kultur Dokumente
MEMORIA
Septiembre / 2005.
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Índice
Índice
1. Memoria Descriptiva. 4
1.2. Antecedentes. 5
1.3.6. Alimentación. 11
1
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Índice
1.5.6. Alimentación. 26
1.6. Resultados. 28
1.7. Conclusiones. 29
2. Memoria de Cálculo. 31
2.1. Inicialización. 32
3. Planos. 62
2
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Índice
4. Presupuesto. 66
4.1. Mediciones. 67
5. Bibliografía. 95
6. Anexos.
97
6.1. Manual de Usuario.
98
6.2. Código Fuente para PIC16F877.
104
6.3. Código Fuente del Programa Terminal.
190
3
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
1. MEMORIA DESCRIPTIVA
4
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
1. Memoria Descriptiva.
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.
5
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
Por todo ello, de las marcas anteriormente mencionadas, nos decantamos por
Microchip. Los llamados microcontroladores PIC ofrecen un gran número de ventajas
tecnológicas, son fáciles de utilizar y disponen de una gran documentación técnica.
También se ha tenido en cuenta la gran disponibilidad en el mercado de estos
dispositivos, así como la posibilidad de utilización en la escuela de un programador para
grabar el dispositivo y del software necesario para la generación y depuración del
código del programa.
6
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
En el proyecto anterior, Reloj de Ajedrez para Ciegos, se optó por esta última
opción. El motivo básico es que nuestro sistema debe ser capaz de reproducir dos
mensajes de voz de forma simultánea, sin que estos tengan que ser iguales. Las
características de las ISD no permiten realizar esto directamente, siendo necesario el uso
de dos de estos dispositivos. Esto duplica el coste, de manera que la elección se basó en
criterios económicos. Sin embargo, con el paso de los años, el precio de las ISD se ha
reducido. Actualmente, una implementación con memoria EEPROM y demás
7
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
componentes viene a costar unos 35,50 €, mientras que el coste de una sola ISD es de
unos 18 €. Si usamos dos de estos dispositivos nos situamos en unos 36 €,
prácticamente igual, por lo que el criterio de selección pasa ser cualitativo.
Existen otras opciones a tener en cuenta para esta elección, como son:
8
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
Esto último se soluciona con un ligero relieve de las casillas negras sobre las
blancas, que lo hacen inconfundible al tacto. Asimismo, las piezas negras están dotadas
de una pequeña cabeza de alfiler metálico en su parte superior para distinguirlas de las
blancas.
La sujeción de las piezas viene solventada por una pequeña espiga que se situa
en la peana (ver figura 1). Si se práctica un agujero en el centro de cada casilla, esta
espiga puede introducirse, de manera que la pieza queda fijada al tablero y no puede
moverse o ser derribada, si no es expresamente.
PIEZA
TABLERO
ESPIGA
Figura 1. Sujeción de las piezas al tablero.
Esta última característica nos permitirá realizar el sensado del tablero. Para
poder determinar la situación de las piezas será necesario situar un sensor en cada
casilla del tablero. Un tablero de ajedrez contiene 64 casillas, de modo que hay que
buscar un sensor económico, fiable y de dimensiones reducidas. La solución adoptada
en el presente proyecto pasa por utilizar un sensor óptico (ver figura 2), modelo
OPB620. Estos pequeños sensores están dotados de un diodo emisor de luz y un
fototransistor NPN, situados en oposición. Cuando alimentamos el diodo, este realiza
una emisión que capta el transistor, situándose en zona de conducción. El transistor no
podrá captar la emisión si esta no existe o hay un obstáculo en medio que lo impida.
9
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
PIEZA
TABLERO
SENSOR
ESPIGA
Otra solución podría ser utilizar dos contactos flexibles y esmalte conductor en
la base de la peana, situando los cables de forma que se haga contacto al introducirse la
pieza en el ajujero. Esta solución, muy económica, es extremadamente poco fiable ya
que los cables pueden sufrir desgaste debido a un uso continuado. Los sensores ópticos
tienen la ventaja de no sufrir desgaste, ya que no se necesita un contacto físico con la
pieza para su detección.
Otros sensores como los de contacto o los magnéticos son más costosos y se
hace difícil integrarlos en la estructura del tablero.
10
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
1.3.6. Alimentación.
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.
Módulo de control:
Módulo de audio:
Módulo de visualización:
Módulo de tablero:
11
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
PULSADORES
DECODIFICADOR
ISD2560 ISD2560
SENSORES
TABLERO
COMUNICACIÓN SERIE
PC
12
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
El aparato está diseñado para ser utilizado por dos usuarios en partidas de
competición de ajedrez. Estos dos usuarios podrán ajustar las opciones del tipo y tiempo
de partida y preparar el reloj para jugar. Asímismo, se podrá conectar el tablero
adaptado al reloj, realizándose así el control de las jugadas realizadas. Durante la partida
el reloj tendrá que mostrar por un display el tiempo restante y, mientras hace esto,
tendrá que reproducir, a petición de cualquiera de los dos usuarios o de los dos a la vez,
el tiempo restante de uno u otro jugador o la última jugada realizada en el tablero por el
auricular del usuario que ha hecho dicha petición. Aunque no es necesario que el
aparato cuente con una gran calidad de sonido los mensajes se oirán de una manera
clara e inteligible. Si el tablero está conectado las jugadas realizadas se almacenarán en
la memoria del microcontrolador, siendo posible su posterior volcado en un PC externo.
CONECTOR AURICULAR
INTERRUPTOR
PETICION AUDIO
JUGADAS
UP MODE
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
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:
• RA [4,3] : No utilizado
• RB [7..0] : Entradas. Utilizaremos estas líneas para los 8 pulsadores del reloj.
• 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.
• 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.
15
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
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:
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
17
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
18
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
Para determinar si existe o no una pieza situada en la casilla sólo nos interesan
dos estados de trabajo del transistor: no conducción (casilla ocupada, Vout = 5 V) y
conducción (casilla libre, Vout = 0 V). La elección de las resistencias de polarización
debe permitirnos, por un lado, la emisión de suficiente luz en el diodo para que el
transistor entre en conducción, y por otro, limitar la corriente en R2 para evitar un
consumo excesivo. Con los ensayos en laboratorio hemos podido determinar que los
valores que más se ajustan a estas condiciones son R1 = 2.2kΩ y R2 = 220kΩ
(conducción Vout = 5 V , I = 6 mA ; no conduccción Vout = 0, I = 0 mA).
O0
O1
SELECCIÓN
A0 O2
A1 O3
A2 O4
O5
E O6
O7
8 LINEAS DE INFORMACIÓN
19
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
O0
O1
O2
O3
O4
A0 O5
SELECCIÓN
A1 O6
A2 O7
A3 O8
O9
O 10
E
O 11
O 12
O 13
O 14
O 15
4 LINEAS DE INFORMACIÓN
20
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
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”.
21
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
DIRECCIONAMIENTO ISD2560
22
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
A 0101001010 330
B 0101010000 336
C 0101010110 342
D 0101011100 348
E 0101100010 354
F 0101101000 360
G 0101101110 366
H 0101110100 372
Torre 0101111010 378
Caballo 0110000110 390
Alfil 0110010010 402
Dama 0110011110 414
Rey 0110101010 426
Jugada Ilegal 0110110110 438
Uno 0111001010 458
Enroque 0111010100 468
Tabla 1. Direcciones de los mensajes almacenados en las ISD2560.
Se observará que los bits A9 y A0 están siempre a nivel 0. Esto es debido a que
para direccionar todos los mensajes sólo son necesarias ocho líneas. El
direccionamiento completo (utilizando las diez líneas) de los dispositivos ISD nos da
una resolución de 0.1 segundos. Sin embargo, para nuestra aplicación no es necesaria tal
resolución; nos basta con una de 0.2 segundos (como puede observarse en la tabla, todas
las direcciones de inicio son números pares). Podemos obtener dicha resolución
utilizando las líneas A1-A9, y dejando A0 conectada a masa. Por otro lado, el bit A9
sólo se utiliza para direccionamientos a partir de los 52.1 segundos de grabación. Puesto
que no hemos alcanzado dicho valor, también conectamos esta línea a masa, quedando
conectadas al microcontrolador A1-A8.
Una vez hecho esto, sólo se tendrá que respetar la secuencia de comandos para
realizar la reproducción de los mensajes. En la siguiente figura podemos ver el diagrama
temporal de dicha secuencia.
23
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
Otros pines de interés son los que corresponden a las señales RS y R/W. La
primera se refiere al contenido de lo que pasamos por el bus de datos. Si su valor es 1 se
trata de un dato, mientras que si su valor es 0 se trata de una instrucción. La señal R/W
identifica si la operación a realizar es de lectura (1) o de escritura (0). Para nuestra
aplicación esta señal estará siempre a 0.
24
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
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.
25
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
1.5.6. Alimentación.
26
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
R2
VL = Vref
R1 + R 2
(7)
R1 R2
VH = Vref + Vref
R1 + R 2 R1 + R 2
27
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
19
VL = 4.7 = 4.465 V
1 + 19
(8)
1 19
VH = 4.7 + 4.7 = 4.7 V
1 + 19 1 + 19
1.6. Resultados.
Una vez montado el prototipo y puesto totalmente en marcha los resultados
obtenidos son los siguientes:
El módulo de audio es capaz de reproducir todos los tiempos posibles del reloj.
Los mensajes orales son claramente inteligibles. Posibilidad de reproducción simultánea
por dos auriculares con mensajes de distinto contenido. Modo automático cuando queda
menos de 1 minuto para alguno de los jugadores: se reproducen mensajes temporales sin
necesidad de pulsar el botón correspondiente. Reproducción de todas las jugadas legales
realizadas en el tablero en el formato pieza.coordenada origen.coordenada destino.
Control del volumen por medio de potenciómetro. Reproduce el mensaje “jugada ilegal”
cuando la jugada realizada en el tablero es incorrecta.
El tablero sensorial reconoce todas las jugadas legales posibles excepto la captura
al paso y la coronación a pieza distinta de la dama. Se realizan dos encuestas cada
segundo. La jugadas correctas se almacenan en memoria RAM del microcontrolador. El
espacio reservado para ello es de 192 bytes. Cada jugada completa ocupa 4 bytes (2
bytes semijugada), por lo que la memoria es capaz de almacenar 48 jugadas (96
semijugadas). Cuando se deteca un error en el tablero se enciende un LED de aviso en
el reloj, apagándose el mismo al salir del error.
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 de jugadas en memoria y su transferencia a PC.
No obstante, todo se puede mejorar.
El reloj de ajedrez cuenta con una resolución más que suficiente para el uso al
que está destinado. No sufre retrasos importantes (ver apartado 1.5.1.1.). La
información que muestra por pantalla cubre las necesidades del jugador durante la
partida. Los modos de tiempo que tiene implementados son los más utilizados en
competición oficial e incluso en partidas amistosas a nivel de club. Por todo ello
consideramos que el reloj de ajedrez implementado es apto para los usos antes
mencionados. Aún así, podrían introducirsele algunas mejoras interesantes, como
aumentar el número de modos de funcionamiento, implementar configuración manual
del tiempo, aumentar la información mostrada por pantalla o contar las jugadas
realizadas por cada jugador (esto último muy interesante en las partidas con caída de
bandera). De cara a una posible puesta en venta habría que plantearse seriamente la
posibilidad de cambiar el display LCD por uno de siete segmentos. Para un prototipo el
display LCD es lo ideal, pero tal vez (esto ya dependería además de los proveedores)
podría salir más a cuenta rediseñar el sistema para un display menos práctico pero
posiblemente más económico para grandes tiradas.
Los mensajes orales reproducidos tienen una calidad aceptable puesto que son
claramente inteligibles y eso es suficiente para su uso. Se aprecia en la reproducción
una pequeña pausa entre mensajes. Esto es debido a que las encuestas del tablero
introducen un pequeño retardo, de unos 160ms cada encuesta. Esta pausa no supone un
grave problema, aunque podría mejorarse en futuras versiones. Una opción interesante
sería implementar una reproducción multilingüe. Se trataría de aumentar (prácticamente
doblar) la capacidad de almacenamiento de los ISD y programar el dispositivo para
poder escoger el idioma de locución deseado. Otro aspecto mejorable es la regulación
de volumen, implementada en este proyecto con un simple potenciómetro.
29
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria Descriptiva
30
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
2. MEMORIA DE CÁLCULO
31
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
2. Memoria de Cálculo.
2.1. Inicialización.
Una vez encendido el dispositivo el programa empezará a ejecutarse desde la
dirección 0x00 de la memoria de código. Lo primero que hacemos es llamar a una
subrutina encargada de inicializar convenientemente los puertos E/S del
microcontrolador, poner el preescaler del TMR0, incializar algunas variables y habilitar
las interrupciones. Los dispositivos ISD y el display LCD son incializados en este
punto. También será necesario habilitar las resistencias del pull-up del puerto B para
poder detectar correctamente las señales producidas al pulsar un botón.
32
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
INICIALIZAR PRINCIPAL
INICIO
INICIALIZAR ISD'S
INICIALIZAR DISPLAY
INICIALIZAR VARIABLES
RETURN
33
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
34
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
INICIO
CO G E RE E
CO M P _ TA B L E RO
INICIA LIZA R
V A RIA B L E S DE
P A RTIDA Y A UDIO
INICIA LIZA R
CO NTA DO RE S
NO
NO NO NO NO
B O TO N A B O TO N B B O TO N S E T B O TO N NE X T
P UL S A DO ? P UL S A DO ? P ULS A DO ? P ULS A DO ?
SI SI SI SI
P A RTIDA
35
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
P A RTIDA
NO NO
B O TO N A B O TO N B
CM P _ S E T
P ULS A DO ? P ULS A DO ?
SI SI
SI SI
V A RIA B LE V A RIA B LE
A CTUA LIZA DA ? A CTUA LIZA DA ?
NO NO
TA B LE RO NO TA B LE RO NO
CO NE CTA DO ? CO NE CTA DO ?
SI SI
NO NO
TURNO DE TURNO DE
LA S NE G RA S ? LA S B LA NCA S ?
SI SI
SI SI
M O DO M O DO
INCRE M E NTO A INCRE M E NTO B
FIS CHE R? FIS CHE R?
NO NO
NO NO
B O TO N B B O TO N A
P ULS A DO ? P ULS A DO ?
SI SI
P A RA R RE LO JE S P A RA R RE LO JE S
CM P _S E T
36
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
CM P _ S E T
M O DO R E P R O D. SI
A U TO M A TIC A RE P S E C A _A
P A RA A ?
NO
M O DO R E P R O D. SI
A U TO M A TIC A RE P S E C B _B
P A RA B ?
NO
SI
RE P RO DU CIE NDO
RE P RO D UCE A
P A RA A ?
NO
SI
RE P RO DU CIE NDO
RE P RO D UCE B
P A RA B ?
NO
SI NO
B O TO N S E T RE LO JE S
TIE M P O B _ B
P UL S A D O ? P A RA DO S ?
NO SI
INICIO
SI
B O TO N M O D E
TIE M P O A _B
P UL S A D O ?
NO
SI
B O TO N UP
TIE M P O B _A
P UL S A D O ?
NO
SI NO
B O TO N NE X T RE LO JE S
TIE M P O A _ A
P UL S A D O ? P A RA DO S ?
SI
TX _ RS 23 2
(C O NTINUA )
P A RTIDA
37
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
B O TO N SI
JU G A D A A R E P R O _ JU G A D A _ A
PULSADO?
NO
B O TO N SI
JU G A D A B R E P R O _ JU G A D A _ B
PULSADO?
NO
NO
TA B L E R O
C O N E C TA D O ?
SI
SI
TIE M P O D E
IN IC IO _ E N C U E S TA
E N C U E S TA ?
NO
P A R TID A
38
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
39
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
IS R
SALVAR LOS
RE G IS TR O S
W , S TA TUS Y
P C L A TH
M IRA S I S E ÑA L E S
E O M A S E RTA DA S
NO
JUE G A A =1 ? IG UA L P A RA E L JUG A DO R B
SI
DE CRE M E NTA R
CO NTA DO R A
SI
CO N TA DO R A =0? C A D A S E CA
NO
RE INICIA R CO N TA D O R A
NO
TA B L E RO
CO NE CTA DO ?
SI
DE CRE M E NTA R
C O NTA DO R
TA B L E RO
SI A CTUA L IZA R
C O NTA DO R
V A RIA B L E
TA B L E RO =0 ?
A S O CIA DA
NO
RE INICIA R CO NTA DO R
TA B L E R O
RE S TA U RA R
W , S TA TU S
Y P CL A TH
L IM P IA R E L FL A G D E
INTE RRUP CIO N DE L TM R 0
INTCO N(T0 IF)
RE TFIE
40
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
CADASECA
DESHABILITAR
TABLERO
SI
FINA=1? RETURN
NO
DECREMENTAR 1 SEGUNDO
EL RELOJ DE A
CAMBIAR
CO NFIG PO RTD
Y ACTUALIZAR
DISPLAY
NO
RELO J DE A=0?
SI
SI
HA PASADO
YA EL CO NTRO L? FINA=1
(FLAG A=1?)
NO
NO
XTRTMPA=1?
SI
FLAG A=1
PO NER MO DO DE
REPRO DUCCIO N
XTRTMPA=0 AUTO MATICA
SI
VO LCAR VARIABLES NO
Q UEDA MENO S DE
DE FINISH EN VARIABLES RETURN
UN MINUTO ?
RELO J A
CAMBIAR
CO NFIG PO RTD
Y ACTUALIZAR
DISPLAY
41
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
Dependiendo del tiempo restante para cada jugador, el mensaje oral reproducido
puede constar de horas y minutos, minutos y segundos o segundos solamente. A ese
efecto se han creado las subrutinas rephoraAA, repminAA, repsecAA y sus análogas para
las distintas combinaciones de A y B.
REPRODUCEA
NO
E O M =0 ?
SI
SI
C O N T2 A -@ M S G 2 A +1 =
R E P R O A =0
C O N TA ?
SI
D IS P L A Y P R O X IM O
A A C TU A L IZ A R S E ?
NO
CARGAR EL
S IG U IE N TE M E N S A JE R E TU R N
P A R A R E P R O D U C C IO N
42
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
TIE M P O A _ A
E S TA M O S E N SI
R E P R O D U C C IO N
A U TO M Á TIC A ?
NO
E S TA M O S SI
R E P R O D U C IE N D O
POR A?
NO
NO
H O R A S D E A =0 ? REPHORAAA
SI
NO
M IN U TO S D E A =0 ? R E P M IN A A
SI
NO
S E G U N D O S D E A =0 ? REPSECAA
SI
R E TU R N
43
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
RE P HO R A A A
CO N TA =0
M S G 1A =@ D E L N UM E RO
C O RR E S P O ND IE NTE A H O RA A
CO N TA ++
M S G 2A =@ P A LA B R A
"H O RA S "
CO N TA ++
SI
M INU TO S D E A =0?
NO
M S G 3 A =@ P A LA B R A
SI SI C O RR E S P O ND IE N TE
M INU NA =0?O
M IN UN A =0?
M IND E A =0? A M IN DE A
CO N TA ++
NO
NO
M S G 3A =@ P A LA B R A M S G 3A =@ P A LA B RA
M S G 4 A =@ P A LA B R A
C O RR E S P O ND IE NTE CO R RE S P O N DIE NTE
"M IN UTO S "
A M IN DE A A M INU NA
CO N TA ++
CO N TA ++ C O NTA ++
M S G 4A =@ P A LA B R A
C O RR E S P O ND IE NTE
A M IN UN A
CO N TA ++
M S G 5A =@ P A LA B R A
"M IN UTO S "
CO N TA ++
L A N ZA M O S M S G 1 A
A R E P RO DUC CIO N
C O N T2 A =M S G 2 A
RE P R O A =1
R E TUR N
44
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
REPMINAA
CO NTA=0
MSG1A=@ PALABRA
SI SI CO RRESPONDIENTE
MINUNA=0?O
MINUNA=0?
MINDEA=0? A MINDEA
CO NTA++
NO
NO
MSG2A=@ PALABRA
CO RRESPONDIENTE MSG 3A=@ PALABRA
A MINUNA SI SI CO RRESPONDIENTE
SECUNA=0?O
SECUNA=0?
CO NTA++ SECDEA=0? A SECDEA
CO NTA++
NO
NO
MSG3A=@ PALABRA
"MINUTO S"
MSG3A=@ PALABRA MSG3A=@ PALABRA
CO NTA++ MSG 4A=@ PALABRA
CO RRESPONDIENTE CO RRESPONDIENTE
"SEG UNDO S"
A SECDEA A SECUNA
CO NTA++
CO NTA++ CO NTA++
MSG4A=@ PALABRA
CO RRESPONDIENTE
A SECUNA
CO NTA++
MSG4A=@ PALABRA
SI SI CO RRESPONDIENTE
SECUNA=0?O
SECUNA=0? MSG5A=@ PALABRA
SECDEA=0? A SECDEA
"SEG UNDO S"
CO NTA++
CO NTA++
NO
NO
MSG5A=@ PALABRA
CO RRESPONDIENTE
A SECUNA
CO NTA++
MSG6A=@ PALABRA
"SEGUNDO S"
CO NTA++
LANZAMOS MSG1A
A REPRODUCCIO N
CO NT2A=MSG 2A
REPRO A=1
RETURN
45
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
RE PS ECAA
CO NTA=0
MS G 2A =@ P ALAB RA
CO RRES PO NDIE NTE
A SE CUNA
CO NTA++
MS G 3A =@ P ALAB RA
LA NZA MO S MSG 1A
"SE G UNDO S "
A RE P RO DUCCION
CO NTA++
CO NT2A =MSG 2A
RE PROA =1
RE TURN
46
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
SI
BASE_RAM=
RETURN
0X110?
NO
CO NTA=0
CARG AMO S
MENSAJE
"PIEZA" EN
MSG1A
BASE_RAM> BASE_RAM=
0X190? 0X190?
LANZAMOS MSG 1A
A REPRO DUCCIÓN
RETURN
47
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
Cuando se mueve una pieza pueden darse varios casos especiales, como la
captura de una pieza enemiga o la jugada de enroque. Para ello la función examina
llamará, en determinados casos, a otras subrutinas que se encagarán de comprobar estos
casos especiales. La subrutina mira_captura comprueba si la casilla destino del
movimiento ya está ocupada por otra pieza. De ser así determina si esa pieza es del
bando enemigo, en cuyo caso es una captura, o del mismo bando, lo que daría lugar a un
error. Si es una captura se procede a eliminar la pieza capturada de la tabla pieza
mediante la función kill_pieza. Excepto el caballo, las demás piezas no pueden atravesar
una casilla que ya está ocupada, es decir, interceptando la trayectoria de su movimiento.
La subrutina mira_casilla se encarga de esto. Puede ocurrir que con la jugada realizada
uno de los reyes, ya sea el del propio bando o el enemigo, quede atacado. El primer caso
se trata de una jugada ilegal, para lo que hemos creado la subrutina jaque. Puesto que la
labor de determinar si un rey u otro están en jaque se reduce a comprobar si una pieza
del bando enemigo ataca la casilla en la que se ubica dicho rey, la subrutina jaque llama
con frecuencia a otra subrutina, ataque. Esta última recibe como parámetros de entrada
las coordenadas de la casilla afectada y el bando al que corresponde el turno de juego. A
continuación se recorre la tabla pieza, comprobando si alguna de las piezas de color
contrario y viva puede atacar la casilla en cuestión. Esta subrutina también es utilizada
48
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
IN IC IO _ E N C U E S TA
E N C U E S TA
COMPARA
NO
JU G A D A
C O M P L E TA ?
SI
E X A M IN A
P A R TID A
49
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
E N C U E S TA
C O N T_ FIL A =0
C O N FIG U R A R P O R TD
4 B ITS A L TO S IN
4 B ITS B A JO S O U T
TE M P O R IZA C IO N 1 0 m s TE M P O R IZA C IO N 1 0 m s
SI SI
S E H A A C TU A L IZA D O S E H A A C TU A L IZA D O
E L D IS P L A Y? E L D IS P L A Y?
NO NO
E N A B L E =1 E N A B L E =1
S A L V A R B YTE S A L V A R B YTE
A L TO P O R TD E N A L TO P O R TD E N
B YTE B A JO B YTE A L TO
M E M O R IA M E M O R IA
C O N T_ FIL A ++ C O N T_ FIL A ++
NO
C O N T_ FIL A =1 6 ?
SI
C O N FIG U R A P O R TD
TO D O S A L ID A S
R E TU R N
50
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
COMPARA
A U X _ A C TU A L =A C TU A L
A U X _ A N TE R IO R =A N TE R IO R
B =0
NO NO SI
A U X _ A C TU A L (B )=
A U X _ A C TU A L (B )=1 ? B IT_ C A M B IO =0 ?
A U X _ A N TE R IO R (B )?
SI NO
SI
NO
B ++ B IT_ C A M B IO =0 ?
A U X _ A C TU A L ->C O O R D _ D E S X
B ->C O O R D _ D E S Y
SI
SI A U X _ A C TU A L ->C O O R _ O R 1 X
B =8 ?
B ->C O O R D _ O R 1 Y
NO
B =0
A U X _ A C TU A L ->C O O R _ O R 2 X
B ->C O O R D _ O R 2 Y
SI
A U X _ A C TU A L -
A C TU A L =7 ?
B IT_ C A M B IO =1
NO
A U X _ A C TU A L ++
A U X _ A N TE R IO R ++
R E TU R N
51
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
EXAMINA
BUSCAMOS LA PIEZA
Q UE SE ESTÁ MOVIENDO
EN LA TABLA 'PIEZA'
CO MPROBAR TURNO
DE JUEGO Y SI
PIEZA VIVA
DETERMINAR QUE
TIPO DE PIEZA SE
ESTA MOVIENDO
NO NO NO NO NO
PEO N? TORRE? CABALLO? ALFIL? DAMA?
SI SI SI SI SI
NO
SE ENRO CA?
SI
MIRA_CAPTURA
MIRA_ENROQ UE
MIRA_JAQUE
GUARDA_RAM
ACTUALIZA
VARIABLES DE
CONTRO L
RETURN
52
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
SI CO M P RO B A R CO LO R NO
CA SILLA
P IE ZA CAS IL LA CO O RDE NA DA _ X = X ?
O CUPA DA ?
O CUPA DA
NO
SI
RETURN K IL L_ P IE ZA NO NO
FINA L
CO O RDENA DA _Y = Y?
TAB L AP IE ZA ?
SI SI
NO RETURN(0 )
P IE ZA V IV A ?
SI
RETURN(CO LO R PIEZA)
K ILL _P IE ZA
RE CO RRE R
TA BL A P IE ZA
NO
CO O RDE NADA _X =
CO O RDE NA _DE STINO X ?
SI
NO
CO O RDE NA DA_Y = NO
FINAL
CO O RDE NA _DE STINO Y?
TA BL A PIEZA?
SI
SI
NO
P IE ZA V IV A ?
PO N_E RRO R
SI
LIMP IA FLA G
PIEZA VIVA
RE TURN
53
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
MIRA_JAQ UE
NO
JUEGAN
BLANCAS?
SI
BUSCAMOS BUSCAMO S
LAS COO RDENADAS LAS CO ORDENADAS
DEL REY BLANCO DEL REY NEGRO
SI SI
ATAQ UE ATAQUE
PON_ERRO R PON_ERROR
RETORNA 1? RETO RNA 1?
NO NO
RETURN
54
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
MIRA_ENRO Q UE
NO
ENRO Q UE IG UALPARA ENRO Q UE LARG O
CO RTO ?
SI
NO
JUEG AN
BLANCAS?
SI
ENRO Q UE NO NO ENRO Q UE
CO RTO CO RTO
PERMITIDO ? PERMITIDO ?
SI SI
SI SI
BLANCAS EN NEG RAS EN
JAQ UE? JAQ UE?
NO NO
CASILLAS DE SI SI CASILLAS DE
PASO OCUPADAS? PASO OCUPADAS?
(F1 Y G 1) (F8 Y G 8)
NO NO
CASILLAS DE SI SI CASILLAS DE
PASO ATACADAS? PASO ATACADAS?
(F1 Y G 1) (F8 Y G 8)
NO NO
PO N_ERRO R
RETURN
55
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
RE CO RRE
TA BLA PIE ZA
NO
PIE ZA
V IV A?
SI
NO
CO O RDE NA DA _X=
FILA?
SI
NO
CO O RDE NA DA_Y=
CO LUMNA ?
SI NO
NO SI
CO LO R P IE ZA = FINA L TA B LA
RE TURN(0)
BA NDO ATA CA NTE? PIE ZA ?
SI
DE TE RMINA R DE
Q UE P IE ZA
S E TRATA
NO NO NO NO NO
PE O N? TO RRE? CA BA LLO ? A LFIL? DAMA ?
SI SI SI SI SI
NO
CAS ILLA
ATA CA DA ?
SI
RETURN(1)
56
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
P O N_ E R RO R
E N CIE NDE
L E D E R RO R
P O S IC IO N SI APAGA
TA B L E RO
L E D E RR O R
R E E S TA B L E CID A ?
NO
NO R E TU RN
P E TICIO N
A UDIO JUG A DA ?
SI
RE P R O DU CE
M E N S A JE
"JUG A DA IL E G A L "
57
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
58
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
S E TCU E NTA
O FFS E T=
O FFS E T + 12
O FFS E T= SI
P O S ICIO N 84 DE LA O FFS E T=0
E E P RO M DE L P IC?
NO
CO G E RE E
SI
B O TO N
S E T P ULS A DO ?
NO
B O TO N SI
JUG A DO R A
P ULS A DO ?
NO
G UA RDA M O S E L
B O TO N SI O FFS E T E N LA
JUG A DO R B
P O S ICIO N 0 DE LA
P ULS A DO ?
E E P RO M DE L P IC
NO
RE TURN
59
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
GUARDA_RAM
C O M P O N E M O S B YTE
C O O R D E N A DA O R IG E N
(HIG H: C O O R D Y, L O W C O O RD X )
SI SI
BASE_RAM> B A S E _R A M =
0X 1 90? 0X 1 E F?
NO NO
G U A R D A B YTE G U A R DA B YTE
O RIG E N E N RA M O R IG E N E N R A M
B A S E _R A M ++ B A S E _ R A M ++
C O M P O N E M O S B YTE CO M P O NE M O S B YTE
C O O R D E N A D A D E S TIN O C O O R DE N A D A DE S TINO
G U A R D A B YTE G U A R DA B YTE
D E S TIN O E N R A M D E S TINO E N R A M
NO
BASE_RAM=
0X 1 6F?
SI
B A S E _R A M =0X 1 90 B A S E _ R A M ++
RE TU R N
60
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Memoria de Cáculo
TX_RS232
SI FALLO
B ASE_RAM=
0X120? MEMO RIA VACIA
NO
RETURN
ACTIVA R USART
(RCSTA(SP EN)=1)
ACTIVA R USART
(RCSTA(SP EN)=1)
INCREMENTAR NO
PUNTERO =
P UNTERO BAS E_RAM?
HAB ILITAR TRANSMISIO N
(TXS TA (TXEN)=1)
SI
NO
FIN DE TRA NSMISIO N?
(TXSTA(TRMT)=1?)
LEER CO NTENIDO
ME MO RIA RA M
SI
RETURN
TRANSMITIR B YTE SI
FIN DE TRANSMISIO N?
(TXREG ) (TXS TA (TRMT)=1?)
NO
61
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Planos
3. PLANOS
62
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Planos
63
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Planos
64
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Planos
65
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
4. PRESUPUESTO
66
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
4. Presupuesto.
4.1. Mediciones.
67
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
DISPOSITIVO GRABADOR/REPRODUCTOR
DE VOZ ISD2560, CON 60 SEGUNDOS DE
CAPACIDAD GRABACIÓN 2 2
2
2.3 U LCD 16X1
C. I. MAX232 TRANSMISIÓN/RECEPCIÓN DE
SEÑALES TTL/232. 1 1
1
2.7 U OSCILADOR 4 MHz
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
RESISTENCIA DE 1 kΩ1/4 W 4 4
4
2.21 U RESISTENCIA 10 kΩ
RESISTENCIA DE 10 kΩ1/4 W 1 1
1
2.22 U RESISTENCIA 100 Ω
RESISTENCIA DE 1 kΩ1/4 W 1 1
1
2.23 U RESISTENCIA 2,2 kΩ
69
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
RESISTENCIA DE 18 kΩ1/4 W 1 1
1
2.26 U POTENCIÓMETRO 4,7 kΩ
CONDENSADOR CERÁMICO 22 pF 2 2
2
2.30 U CONDENSADOR 22 µF
CONDENSADOR ELECTROLÍTICO 22 µF 4 4
4
2.31 U ZÓCALO 40 PINES
70
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
71
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
CABLE PLANO 1 1
1
72
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
Capítulo 5: Varios.
73
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
74
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
75
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
76
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
77
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
78
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
79
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
Capítulo 5: Varios.
80
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
81
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
DISPOSITIVO GRABADOR/REPRODUCTOR
DE VOZ ISD2560, CON 60 SEGUNDOS DE
CAPACIDAD GRABACIÓN
C. I. MAX232 TRANSMISIÓN/RECEPCIÓN DE
SEÑALES TTL/232.
2.7 U OSCILADOR 4 MHz 1 0,84 0,84
PILA ALCALINA DE 9V
PORTAPILAS PILA 9V
82
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
RESISTENCIA DE 1 kΩ1/4 W
RESISTENCIA DE 10 kΩ1/4 W
RESISTENCIA DE 1 kΩ1/4 W
83
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
RESISTENCIA DE 18 kΩ1/4 W
CONDENSADOR CERÁMICO 22 pF
CONDENSADOR ELECTROLÍTICO 22 µF
84
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
85
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
CABLE PLANO
86
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
Capítulo 5: Varios.
87
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
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.
TOTAL 13884,84 €
88
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
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.
DISPOSITIVO GRABADOR/REPRODUCTOR
DE VOZ ISD2560, CON 60 SEGUNDOS DE
CAPACIDAD GRABACIÓN
C. I. MAX232 TRANSMISIÓN/RECEPCIÓN DE
SEÑALES TTL/232.
U OSCILADOR 4 MHz 1 0,64 0,64
PILA ALCALINA DE 9V
PORTAPILAS PILA 9V
89
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
RESISTENCIA DE 1 kΩ1/4 W
RESISTENCIA DE 10 kΩ1/4 W
RESISTENCIA DE 1 kΩ1/4 W
RESISTENCIA DE 18 kΩ1/4 W
90
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
CONDENSADOR CERÁMICO 22 pF
CONDENSADOR ELECTROLÍTICO 22 µF
91
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
TOTAL 85,05 €
92
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
CABLE PLANO
93
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Presupuesto
TOTAL 64,14 €
94
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Bibliografía
5. BIBLIOGRAFÍA
95
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Bibliografía
5. Bibliografía
[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-841-
2858-3.
[3] Floyd, Thomas. “Fundamentos de Sistemas Digitales”. Ed: Prentice-Hall, 2000. ISBN: 84-205-
2994-X.
[4] Buchanan, William. “PC Interfacing, Communications and Windows Programming”. Ed:
Addison-Wesley, 1999. ISBN: 0-201-17818-4.
[5] Martínez Salamero, L. Poveda López, A. García de Vicuña, L. Guinjoan Gispert, F. Sánchez
García, A. F. Sánchez Robert, F. J. “Funcions Electròniques”. Ed: UPC, 1993. ISBN: 84-8301-
012-7.
[6] PFC: Massa Amado, Carlos. “Reloj de Ajedrez Para Ciegos”. URV, 2002.
96
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
6. ANEXOS
97
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
6. Anexos.
6.1. Manual de Usuario.
CONECTOR AURICULAR
INTERRUPTOR
PETICION AUDIO
JUGADAS
UP MODE
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
Como se puede observar en la figura 1, el reloj cuenta con los siguientes botones
y conectores:
• 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 conector a PC externo.
La pantalla está dividida en dos grupos de ocho dígitos cada uno. Los ocho de la
izquierda muestran información para el jugador A y los ocho de la derecha para el
99
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
jugador B. Para mostrar el tiempo se usan cuatro dígitos por jugador, dando información
en formato horas.minutos o minutos.segundos. Los dos dígitos centrales sirven para
indicar que reloj está corriendo.
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.
100
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
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
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.
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
103
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
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 ;
;---------------------------------------------------------------------------;
104
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
; otras variables
base_ram EQU H'72'
aux_anterior0 EQU 0x73 ; tabla anterior0 77:7E banco 0
offset_piezas EQU 0x74
offset_captura EQU 0x75
pieza_jugada EQU 0x76
estado_botones EQU 0x43
105
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
; Definición de macros ;
;-------------------------------------------------------------------------;
pagina0 macro
bcf PCLATH,4
bcf PCLATH,3
endm
pagina1 macro
bcf PCLATH,4
bsf PCLATH,3
endm
pagina2 macro
bsf PCLATH,4
bcf 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 Anexos
movwf FSR
bcf FSR,7
movf INDF,W
endm
escribe_puntero macro
bcf STATUS,IRP ; accede al banco 0
movwf FSR
bcf FSR,7
movf auxAA,W
movwf INDF
endm
leer_punterob1 macro
bcf STATUS,IRP ; accede al banco 1
movwf FSR
bsf FSR,7
movf INDF,W
endm
escribe_punterob1 macro
bcf STATUS,IRP ; accede al banco 1
movwf FSR
bsf FSR,7
movf auxAA,W
movwf INDF
endm
leer_punterob2 macro
bsf STATUS,IRP ; accede al banco 2
movwf FSR
bcf FSR,7
movf INDF,W
endm
escribe_punterob2 macro
bsf STATUS,IRP ; accede al banco 2
movwf FSR
bcf FSR,7
movf auxAA,W
movwf INDF
endm
leer_punterob3 macro
bsf STATUS,IRP ; accede al banco 3
movwf FSR
bsf FSR,7
movf INDF,W
endm
escribe_punterob3 macro
bsf STATUS,IRP ; accede al banco 3
movwf FSR
bsf FSR,7
movf auxAA,W
movwf INDF
endm
absoluto macro
btfss STATUS,C ; calcula el valor absoluto del numero
goto $+3 ; pasado por W. Se devuelve por auxAA.
movwf auxAA
goto $+4
movwf auxAA
comf auxAA,f
incf auxAA,f
endm
107
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
mira_reproduce macro
btfss reproA,0 ; estamos reproduciendo por A?
goto $+3 ; no
btfss PORTC,eom_isd1 ; fin de mensaje A?
bsf reproA,1 ; si
btfss reproB,0 ; no, estamos reproduciendo por B?
goto $+3 ; no
btfss PORTC,eom_isd2 ; si, fin de mensaje B?
bsf reproB,1 ; 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 w_temp ; salvamos el registro W
swapf STATUS,W ; y el registro de estado
banco0
movwf status_temp ; no hemos cambiado ningún flag
movf PCLATH,W ; salva parte alta del contador de programa
movwf pclath_temp
clrf PCLATH
goto isr
;-------------------------------------------------------------------------;
; Rutina de Inicialización ;
;-------------------------------------------------------------------------;
inicializar banco0
clrf PORTA
clrf PORTB ; inicializamos los puertos
clrf PORTD ; limpiando los latches de salida
clrf PORTE
banco1 ; vamos al banco 1 de memoria
movlw H'06' ; configuramos PORTA como
movwf ADCON1 ; I/O digital
clrf TRISA ; PORTA todo salidas
movlw H'FF' ; PORTB todo entradas
movwf TRISB ;
clrf TRISD ; PORTD todo salidas
movlw b'10001100'
movwf TRISC ; PORTC [2:3,7] entradas, [0:1]y[4:6] salidas
banco1
movlw H'00' ; ponemos el preescaler del TMR0
movwf OPTION_REG ; a 1:2 y habilitamos los pull-ups del PORTB
banco0 ; volvemos al banco 0
108
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movlw h'FF'
movwf estado_botones
clrf control ; inicializa control (bit0=0, juegan
blancas)
clrf cambio
movlw h'0F'
movwf enroque
movlw d'8' ; encuestas cada 0.5 segundos
movwf tics_tab1
movlw d'122'
movwf tics_tab
clrf PCLATH
movlw H'00'
call leeree ; inicializamos el offset de la EEPROM
con
movwf offset ; el valor de la dirección de la ultima
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 si_tablero ; si no ha llegado a 0 continua
decfsz ticsA1
goto contaA
call cadasecA ; si es 0 ejecutar cadasecA
movlw D'217' ; y poner ticsA al valor inicial
movwf ticsA ; ticsA = 217
movlw D'9'
movwf ticsA1
goto si_tablero ; no
109
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
restaura banco0
movf pclath_temp,W
movwf PCLATH
swapf status_temp,W ; restauramos registro de estado
original
movwf STATUS ; y lo guardamos en el registro de
estado
swapf w_temp,f ; restauramos el registro W
swapf w_temp,W ; sin variar los flags
bcf INTCON,T0IF ; limpiamos el flag de interrupción del TMR0
bsf INTCON,T0IE ; permitimos la interrupción del TMR0
retfie ; y salimos de la ISR
;-------------------------------------------------------------------------;
; Esta rutina se llama desde la ISR cada ;
; segundo que pasa para el jugador A. ;
;-------------------------------------------------------------------------;
110
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
bsf PORTE,ce_isd1
bsf cambio,5 ; se ha cambiado la configuracion del puerto
D
banco1
clrf TRISD ; PORTD todo salidas
banco0
clrf PORTD ; si, fin de la encuesta
call lcd_tiempoA ; actualizamos las variables
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. ;
;-------------------------------------------------------------------------;
movf secunB,f
btfss STATUS,Z
goto autoB
movf secdeB,f
btfss STATUS,Z
goto autoB
movf minunB,f
btfss STATUS,Z
goto autoB
movf mindeB,f
btfss STATUS,Z
goto autoB
movf horaB,f
btfss STATUS,Z
goto autoB
bcf auto,1
btfss flagB,0
goto extraB
fiB bsf finB,0
return
extraB btfss xtrtmpB,0
goto fiB
bsf flagB,0
bcf xtrtmpB,0
movf esecunB,W
112
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf secunB
movf esecdeB,W
movwf secdeB
movf eminunB,W
movwf minunB
movf emindeB,W
movwf mindeB
movf ehoraB,W
movwf horaB
btfss PORTE,ce_isd1
bsf PORTE,ce_isd1
bsf cambio,5 ; se ha cambiado la configuracion del puerto
D
banco1
clrf TRISD ; PORTD todo salidas
banco0
clrf PORTD ; si, fin de la encuesta
call lcd_tiempoB ; actualizamos las variables
return
;-------------------------------------------------------------------------;
; principal ;
;-------------------------------------------------------------------------;
pagina0
movlw H'00' ; inicializacion variables de partida y audio
movwf finA
movwf finB
movwf flagA
movwf flagB
113
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
pagina0
;-------------------------------------------------------------------------;
; empiezaA, empiezaB
;-------------------------------------------------------------------------;
;-------------------------------------------------------------------------;
; partida, cmpset
;-------------------------------------------------------------------------;
114
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
goto $+3
btfss cambio,4 ; no, tablero2 conectado?
goto $+3
btfsc control,0 ; turno de las blancas?
goto jugA_1
bsf juegaA,0 ; si no, se actualiza juegaA=1, juegaB=0
bcf juegaB,0
btfss nsecmov,0 ; estamos en algun modo fischer?
goto $+4
pagina1
call incrementoB ; si, incrementar var tiempo B
call lcd_jugA ; no, actualizar display señal quien juega
jugA_1 btfsc estado_botones,b_jugA
goto partida
bcf juegaA,0
bcf juegaB,0
call lcd_nojug
goto partida
115
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
goto cmp_4
btfsc PORTB,b_mode
goto $+6
btfss estado_botones,b_mode
goto $+7
bcf estado_botones,b_mode
call tiempoA_B
goto $+4
call cont_20ms
btfsc PORTB,b_mode
bsf estado_botones,b_mode
btfsc PORTB,b_up
goto $+6
btfss estado_botones,b_up
goto $+7
bcf estado_botones,b_up
call tiempoB_A
goto $+4
call cont_20ms
btfsc PORTB,b_up
bsf 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
btfsc PORTB,b_jugadaB
goto $+6
116
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
btfss estado_botones,b_jugadaB
goto $+7
bcf estado_botones,b_jugadaB
goto cmp_set3
goto $+4
call cont_20ms
btfsc PORTB,b_jugadaB
bsf estado_botones,b_jugadaB
goto tiempo_encuesta
cmp_set2 pagina1
call repro_jugadaA
pagina0
goto partida
cmp_set3 pagina1
call repro_jugadaB
pagina0
goto partida
;-------------------------------------------------------------------------;
; setcuenta: pone la cuenta inicial de la proxima partida
;-------------------------------------------------------------------------;
;-------------------------------------------------------------------------
117
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
; Rutina para coger de la EEPROM del PIC la cuenta inicial. ;
;-------------------------------------------------------------------------;
118
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movlw H'0C'
addwf offset,W
call leeree
movwf esecunA
movwf esecunB
call lcd_tiempoA
call lcd_tiempoB
return
;-------------------------------------------------------------------------;
; Rutina para leer un byte de la memoria de datos EEPROM
;-------------------------------------------------------------------------;
;-------------------------------------------------------------------------;
; Rutina para escribir un byte en la memoria de datos EEPROM
;-------------------------------------------------------------------------;
;-------------------------------------------------------------------------
; configura_lcd: configuracion inicial del display
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
; borra_pantalla: borra la pantalla del display
;-------------------------------------------------------------------------
119
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
call cont_20ms
movlw b'00000010' ; Nos situamos en la posicion 0 de la memoria
DDRAM
call lcd_i
call cont_20ms
return
;-------------------------------------------------------------------------;
; lcd_jugA : actualiza indicador de tiempo jugador A
;-------------------------------------------------------------------------;
;-------------------------------------------------------------------------;
; lcd_jugB : actualiza indicador de tiempo jugador B
;-------------------------------------------------------------------------;
;-------------------------------------------------------------------------;
; lcd_nojug : quita los indicadores de tiempo
;-------------------------------------------------------------------------;
;-------------------------------------------------------------------------;
; actualiza display tiempo A
;-------------------------------------------------------------------------;
120
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movlw ':'
call lcd_c
movlw d'48'
addwf mindeA,w
call lcd_c
movlw d'48'
addwf minunA,w
call lcd_c
return
;-------------------------------------------------------------------------;
; actualiza display tiempo B
;-------------------------------------------------------------------------;
lcd_tiempoB_1 return
121
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------
; cont_20ms: retardo de 20 milisegundos
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
; funciones display
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------;
; tiempoA_A : reproduce el tiempo restante del jugador A por
; el auricular de A
;-------------------------------------------------------------------------;
movf horaA,f
btfsc STATUS,Z ; horaA=0?
goto $+3
call rephoraA_A
goto tiempoA_A1
movf mindeA,f
btfsc STATUS,Z
goto $+3
call repminA_A
122
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
goto tiempoA_A1
movf minunA,f
btfsc STATUS,Z
goto $+3
call repminA_A
goto tiempoA_A1
movf secdeA,f
btfsc STATUS,Z
goto $+3
call repsecA_A
goto tiempoA_A1
movf secunA,f
btfsc STATUS,Z
goto $+2
call repsecA_A
tiempoA_A1 return
;-------------------------------------------------------------------------;
; tiempoB_A : reproduce el tiempo restante del jugador B por
; el auricular de A
;-------------------------------------------------------------------------;
movf horaB,f
btfsc STATUS,Z ; horaA=0?
goto $+3
call rephoraB_A
goto tiempoB_A1
movf mindeB,f
btfsc STATUS,Z
goto $+3
call repminB_A
goto tiempoB_A1
movf minunB,f
btfsc STATUS,Z
goto $+3
call repminB_A
goto tiempoB_A1
movf secdeB,f
btfsc STATUS,Z
goto $+3
call repsecB_A
goto tiempoB_A1
movf secunB,f
btfsc STATUS,Z
goto $+2
call repsecB_A
tiempoB_A1 return
;-------------------------------------------------------------------------;
; tiempoA_B : reproduce el tiempo restante del jugador A por
; el auricular de B
;-------------------------------------------------------------------------;
123
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movf horaA,f
btfsc STATUS,Z ; horaA=0?
goto $+3
call rephoraA_B
goto tiempoA_B1
movf mindeA,f
btfsc STATUS,Z
goto $+3
call repminA_B
goto tiempoA_B1
movf minunA,f
btfsc STATUS,Z
goto $+3
call repminA_B
goto tiempoA_B1
movf secdeA,f
btfsc STATUS,Z
goto $+3
call repsecA_B
goto tiempoA_B1
movf secunA,f
btfsc STATUS,Z
goto $+2
call repsecA_B
tiempoA_B1 return
;-------------------------------------------------------------------------;
; tiempoB_B : reproduce el tiempo restante del jugador B por
; el auricular de B
;-------------------------------------------------------------------------;
movf horaB,f
btfsc STATUS,Z ; horaA=0?
goto $+7
pagina1
call rephoraB_B
pagina0
goto tiempoB_B1
movf mindeB,f
btfsc STATUS,Z
goto $+7
pagina1
call repminB_B
pagina0
goto tiempoB_B1
movf minunB,f
btfsc STATUS,Z
goto $+7
124
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
pagina1
call repminB_B
pagina0
goto tiempoB_B1
movf secdeB,f
btfsc STATUS,Z
goto $+7
pagina1
call repsecB_B
pagina0
goto tiempoB_B1
movf secunB,f
btfsc STATUS,Z
goto $+6
pagina1
call repsecB_B
pagina0
tiempoB_B1 return
;-------------------------------------------------------------------------;
; rephoraA_A : reproduce hora y minutos de A por A
;-------------------------------------------------------------------------;
movlw HIGH(tablaISD_un)
movwf PCLATH
movf horaA,W
call tablaISD_un
movwf msg1A
incf contA
movlw horas ; @ de "horas"
movwf msg2A
incf contA
pagina0
125
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf msg4A
incf contA
goto repA_A
repA_A2 pagina1
call reset_isd1
pagina0
126
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
; repminA_A : reproduce minutos y segundos de A por A
;-------------------------------------------------------------------------;
127
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf PCLATH
movf mindeA,W
call tablaISD_veinti
movwf msg1A
pagina0
incf contA
movlw HIGH(tablaISD_un)
movwf PCLATH
movf minunA,W
call tablaISD_un
movwf msg2A
pagina0
incf contA
movlw minutos ; @ de minutos
movwf msg3A
incf contA
movf auxAA,W
movwf msg3A
incf contA
movlw segundos ; @ de segundos
movwf msg4A
incf contA
goto repA_A
128
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
pagina0
goto repminAA5
movf auxAA,W
movwf msg3A
incf contA
movlw HIGH(tablaISD_un)
movwf PCLATH
movf secunA,W
call tablaISD_un
movwf auxAA
pagina0
movlw H'04'
subwf contA,W
btfss STATUS,Z
goto $+8
movf auxAA,W
movwf msg5A
incf contA
movlw segundos ; @ de segundos
movwf msg6A
incf contA
goto repA_A
movf auxAA,W
movwf msg4A
incf contA
movlw segundos ; @ de segundos
movwf msg5A
incf contA
goto repA_A
;-------------------------------------------------------------------------;
; repsecA_A : reproduce los segundos de A por A
;-------------------------------------------------------------------------;
129
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
; rephoraB_A : reproduce hora y minutos de B por A
;-------------------------------------------------------------------------;
movlw HIGH(tablaISD_un)
movwf PCLATH
movf horaB,W
call tablaISD_un
movwf msg1A
incf contA
movlw horas ; @ de "horas"
movwf msg2A
incf contA
pagina0
130
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
131
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf msg5A
incf contA
repB_A2 pagina1
call reset_isd1
pagina0
movf msg1A,W ; lanzamos el primer mensaje
movwf PORTD ; para reproducir
call cont_20ms
bcf PORTE,ce_isd1 ; ce=0, habilitado
call cont_20ms
call cont_20ms
btfsc PORTE,ce_isd1
goto $-7
bsf PORTE,ce_isd1 ; ce=1, deshabilitado
;-------------------------------------------------------------------------;
; repminB_A : reproduce minutos y segundos de B por A
;-------------------------------------------------------------------------;
132
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movf mindeB,W
call tablaISD_diez
movwf msg1A
pagina0
incf contA
goto repminBA
movf auxAA,W
movwf msg3A
incf contA
movlw segundos ; @ de segundos
movwf msg4A
133
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
incf contA
goto repB_A
movf auxAA,W
movwf msg3A
incf contA
movlw HIGH(tablaISD_un)
movwf PCLATH
movf secunB,W
call tablaISD_un
movwf auxAA
pagina0
movlw H'04'
subwf contA,W
btfss STATUS,Z
goto $+8
movf auxAA,W
movwf msg5A
incf contA
movlw segundos ; @ de segundos
movwf msg6A
incf contA
goto repB_A
movf auxAA,W
movwf msg4A
incf contA
movlw segundos ; @ de segundos
movwf msg5A
incf contA
goto repB_A
134
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
; repsecB_A : reproduce los segundos de B por A
;-------------------------------------------------------------------------;
;-------------------------------------------------------------------------;
; rephoraA_B : reproduce hora y minutos de A por B
;-------------------------------------------------------------------------;
135
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movlw HIGH(tablaISD_un)
movwf PCLATH
movf horaA,W
call tablaISD_un
movwf msg1B
incf contB
movlw horas ; @ de "horas"
movwf msg2B
incf contB
pagina0
136
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
call tablaISD_once
movwf msg3B
incf contB
pagina0
goto repminutosAB
repA_B2 pagina1
call reset_isd2
pagina0
movf msg1B,W ; lanzamos el primer mensaje
movwf PORTD ; para reproducir
call cont_20ms
bcf PORTE,ce_isd2 ; ce=0, habilitado
call cont_20ms
call cont_20ms
bsf PORTE,ce_isd2 ; ce=1, deshabilitado
;-------------------------------------------------------------------------;
; repminA_B : reproduce minutos y segundos de A por B
;-------------------------------------------------------------------------;
137
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movlw H'01'
subwf minunA,W
btfss STATUS,Z
goto repminAB
movlw minuto ; @ de minuto en W
movwf msg2B
incf contB
goto repminAB4
movlw HIGH(tablaISD_un)
movwf PCLATH
movf secunA,W
call tablaISD_un
138
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
pagina0
movf auxAA,W
movwf msg3B
incf contB
movlw segundos ; @ de segundos
movwf msg4B
incf contB
goto repA_B
movf auxAA,W
movwf msg3B
incf contB
movlw HIGH(tablaISD_un)
movwf PCLATH
movf secunA,W
call tablaISD_un
movwf auxAA
139
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
pagina0
movlw H'04'
subwf contB,W
btfss STATUS,Z
goto $+8
movf auxAA,W
movwf msg5B
incf contB
movlw segundos ; @ de segundos
movwf msg6B
incf contB
goto repA_B
movf auxAA,W
movwf msg4B
incf contB
movlw segundos ; @ de segundos
movwf msg5B
incf contB
goto repA_B
;-------------------------------------------------------------------------;
; repsecA_B : reproduce los segundos de A por B
;-------------------------------------------------------------------------;
140
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
pagina0
incf contB
movlw HIGH(tablaISD_un)
movwf PCLATH
movf secunA,W
call tablaISD_un
movwf msg2B
pagina0
incf contB
movlw segundos ; @ de segundos
movwf msg3B
incf contB
goto repA_B
;************************************************************************
;************************************************************************
;-------------------------------------------------------------------------;
; rephoraB_B : reproduce hora y minutos de B por B
;-------------------------------------------------------------------------;
movlw HIGH(tablaISD_un)
movwf PCLATH
movf horaB,W
call tablaISD_un
movwf msg1B
incf contB
movlw horas ; @ de "horas"
movwf msg2B
incf contB
141
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
142
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
; repminB_B : reproduce minutos y segundos de B por B
;-------------------------------------------------------------------------;
143
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movlw HIGH(tablaISD_un)
movwf PCLATH
movf secunB,W
call tablaISD_un
movf auxAA,W
movwf msg3B
incf contB
movlw segundos ; @ de segundos
movwf msg4B
incf contB
goto repB_B
144
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
goto $+4
movf auxAA,W
movwf msg3B
incf contB
movlw HIGH(tablaISD_un)
movwf PCLATH
movf secunB,W
call tablaISD_un
movwf auxAA
movlw H'04'
subwf contB,W
btfss STATUS,Z
goto $+8
movf auxAA,W
movwf msg5B
incf contB
movlw segundos ; @ de segundos
movwf msg6B
incf contB
goto repB_B
movf auxAA,W
movwf msg4B
incf contB
movlw segundos ; @ de segundos
movwf msg5B
incf contB
goto repB_B
;-------------------------------------------------------------------------;
; repsecB_B : reproduce los segundos de B por B
;-------------------------------------------------------------------------;
145
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
goto repsecBB
;-------------------------------------------------------------------------;
; reproduceA: continua la reproduccion de audio por A
;-------------------------------------------------------------------------;
bcf reproA,1
return
146
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
; reproduceB: continua la reproduccion de audio por B
;-------------------------------------------------------------------------;
bcf reproB,1
return
;-------------------------------------------------------------------------
; reset_isd: realiza un reset del dispositivo isd
;-------------------------------------------------------------------------
147
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
; direcciones de los mensajes temporales en el ISD
;-------------------------------------------------------------------------;
;---------------------------------------------------------------------------
; repro_jugadaA: reproduce por audio ultima jugada realizada para jugador A
;---------------------------------------------------------------------------
movwf PCLATH
movf pieza_jugada,W
call tablaISD_pieza
movwf msg1A
incf contA
movlw h'90'
subwf base_ram,W ; base_ram>0x190?
btfsc STATUS,C
goto rep_jugadaA2 ; si
movlw h'02' ; no, banco 2
subwf base_ram,W ; nos situamos en base_ram-2
148
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf auxBB
leer_punterob2
movwf auxAA
movlw h'F0' ; cogemos la columna
andwf auxAA,W
movwf auxCC
swapf auxCC
incf auxCC
movlw HIGH(tablaISD_col)
movwf PCLATH
movf auxCC,W
call tablaISD_col
movwf msg2A
incf contA
movlw h'0F' ; cogemos la fila
andwf auxAA,W
movwf auxCC
incf auxCC
movlw HIGH(tablaISD_fila)
movwf PCLATH
movf auxCC,W
call tablaISD_fila
movwf msg3A
incf contA
incf auxBB
movf auxBB,W
leer_punterob2
movwf auxAA
movlw h'F0' ; cogemos la columna
andwf auxAA,W
movwf auxCC
swapf auxCC
incf auxCC
movlw HIGH(tablaISD_col)
movwf PCLATH
movf auxCC,W
call tablaISD_col
movwf msg4A
incf contA
movlw h'0F' ; cogemos la fila
andwf auxAA,W
movwf auxCC
incf auxCC
movlw HIGH(tablaISD_fila)
movwf PCLATH
movf auxCC,W
call tablaISD_fila
movwf msg5A
incf contA
goto rep_jugadaA3
149
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movlw HIGH(tablaISD_col)
movwf PCLATH
movf auxCC,W
call tablaISD_col
movwf msg2A
incf contA
movlw h'0F' ; cogemos la fila
andwf auxAA,W
movwf auxCC
incf auxCC
movlw HIGH(tablaISD_fila)
movwf PCLATH
movf auxCC,W
call tablaISD_fila
movwf msg3A
incf contA
incf auxBB
movf auxBB,W
leer_punterob3
movwf auxAA
movlw h'F0' ; cogemos la columna
andwf auxAA,W
movwf auxCC
swapf auxCC
incf auxCC
movlw HIGH(tablaISD_col)
movwf PCLATH
movf auxCC,W
call tablaISD_col
movwf msg4A
incf contA
movlw h'0F' ; cogemos la fila
andwf auxAA,W
movwf auxCC
incf auxCC
movlw HIGH(tablaISD_fila)
movwf PCLATH
movf auxCC,W
call tablaISD_fila
movwf msg5A
incf contA
150
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
return
;---------------------------------------------------------------------------
; repro_jugadaB: reproduce por audio ultima jugada realizada para jugador B
;---------------------------------------------------------------------------
movwf PCLATH
movf pieza_jugada,W
call tablaISD_pieza
movwf msg1B
incf contB
movlw h'90'
subwf base_ram,W ; base_ram>0x190?
btfsc STATUS,C
goto rep_jugadaB2 ; si
movlw h'02' ; no, banco 2
subwf base_ram,W ; nos situamos en base_ram-4
movwf auxBB
leer_punterob2
movwf auxAA
movlw h'F0' ; cogemos la columna
andwf auxAA,W
movwf auxCC
swapf auxCC
incf auxCC
movlw HIGH(tablaISD_col)
movwf PCLATH
movf auxCC,W
call tablaISD_col
movwf msg2B
incf contB
movlw h'0F' ; cogemos la fila
andwf auxAA,W
movwf auxCC
incf auxCC
movlw HIGH(tablaISD_fila)
movwf PCLATH
movf auxCC,W
call tablaISD_fila
movwf msg3B
incf contB
incf auxBB
movf auxBB,W
leer_punterob2
movwf auxAA
movlw h'F0' ; cogemos la columna
andwf auxAA,W
movwf auxCC
swapf auxCC
incf auxCC
movlw HIGH(tablaISD_col)
movwf PCLATH
movf auxCC,W
call tablaISD_col
movwf msg4B
incf contB
movlw h'0F' ; cogemos la fila
andwf auxAA,W
movwf auxCC
incf auxCC
movlw HIGH(tablaISD_fila)
151
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf PCLATH
movf auxCC,W
call tablaISD_fila
movwf msg5B
incf contB
goto rep_jugadaB3
152
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movlw h'01'
subwf ticsA1,W
btfsc STATUS,Z
goto $-3
repBA1 btfss juegaB,0
goto rep_jugadaB4
movlw h'01'
subwf ticsB1,W
btfsc STATUS,Z
goto $-3
;-------------------------------------------------------------------------
; direcciones de los mensajes de jugada en el ISD
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
; tabla_piezas: inicializacion del array piezas
;-------------------------------------------------------------------------
ORG h'C10'
153
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
; rutina para aumentar el tiempo del reloj A en modo fischer
;-------------------------------------------------------------------------;
154
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
incrementoA4 pagina0
call lcd_tiempoA
return
;-------------------------------------------------------------------------;
; rutina para aumentar el tiempo del reloj B en modo fischer
155
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
incrementoB4 pagina0
call lcd_tiempoB
return
156
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------
; tx_rs232: transmite las jugadas que componen la partida por el puerto
; serie del PIC.
; Serial port config: 9600 baudios,8 bits,paridad = none
;-------------------------------------------------------------------------
tx_rs232 banco0
clrf INTCON ; no interrupciones
bsf RCSTA,SPEN ; activa el USART
banco1
movlw b'00100100'
movwf TXSTA ; baja velocidad (BRGH=1)
movlw d'25'
movwf SPBRG ; velocidad 9600 baudios
bsf TXSTA,TXEN
;-------------------------------------------------------------------------
; comp_tablero: comprueba si el tablero esta conectado al reloj
;-------------------------------------------------------------------------
157
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
banco1
movlw H'F0' ; PORTD 4 high entradas, 4 low salidas
movwf TRISD
banco0
btfsc auxAA,7
goto comp_tablero1
btfsc auxAA,6
goto comp_tablero1
btfsc auxAA,5
goto comp_tablero1
btfsc auxAA,4
goto comp_tablero1
bsf cambio,7 ; tablero conectado
goto $+2
comp_tablero1 bcf cambio,7 ; tablero desconectado
btfsc auxAA,7
goto comp_tablero2
btfsc auxAA,6
goto comp_tablero2
btfsc auxAA,5
goto comp_tablero2
btfsc auxAA,4
goto comp_tablero2
bsf cambio,4 ; tablero 2 conectado
goto $+2
comp_tablero2 bcf cambio,4
banco1
clrf TRISD
banco0
clrf PORTD
bcf cambio,5 ; retorno configuracion puerto D original
return
;-------------------------------------------------------------------------
; torre_enroque: comprueba el movimiento de torre en la jugada enroque
;-------------------------------------------------------------------------
158
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
btfss STATUS,Z
goto torre_enroque4
movlw h'00'
subwf coord_desx,W
btfss STATUS,Z
goto torre_enroque4
movlw h'05'
subwf coord_desy,W
btfss STATUS,Z
goto torre_enroque4
pagina2 ; movimiento correcto
goto examina11
159
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
subwf coord_desy,W
btfss STATUS,Z
goto torre_enroque4
pagina2 ; movimiento correcto
goto examina11
torre_enroque4 pagina2
goto pon_error
;************************************************************************
;************************************************************************
;-------------------------------------------------------------------------
; cont_10ms: retardo de 10 milisegundos
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
; inicio_anterior: inicializa la tabla anterior con la posicion inicial
;-------------------------------------------------------------------------
160
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movf aux_anterior0,W
escribe_puntero
incf aux_anterior0
incf auxBB
movf auxBB,W
escribe_punterob1
movf aux_anterior0,W
escribe_puntero
incf aux_anterior0
incf auxBB
movf auxBB,W
escribe_punterob1
movf aux_anterior0,W
escribe_puntero
incf aux_anterior0
incf auxBB
clrf auxAA
movf auxBB,W
escribe_punterob1
movf aux_anterior0,W
escribe_puntero
incf aux_anterior0
incf auxBB
movf auxBB,W
escribe_punterob1
movf aux_anterior0,W
escribe_puntero
return
;-------------------------------------------------------------------------
; inicio_piezas: inicializa el array piezas
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
; inicio_encuesta: inicia el proceso de encuesta y comprobacion de jugadas
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
; encuesta: realiza la encuesta del tablero
;-------------------------------------------------------------------------
161
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
banco1
clrf TRISD ; PORTD todo salidas
banco0
162
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------
; compara: compara actual con anterior y mira si hay cambios
;-------------------------------------------------------------------------
163
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------
164
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------
; actualiza_a0: actualiza anterior0 con actual
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
; pon_error: enciende led de error y entra en un bucle
;-------------------------------------------------------------------------
165
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
leer_punterob1
subwf auxAA,W
btfss STATUS,Z ; contenido igual?
goto pon_error1 ; no
movlw anterior0
subwf aux_anterior0,W
movwf auxAA
movlw h'07'
subwf auxAA,W ; hemos llegado al final del array?
btfsc STATUS,Z
goto compara12 ; si, reiniciamos el proceso
incf aux_actual ; no
incf aux_anterior0
goto compara11
rep_errorA pagina1
call reset_isd1
pagina2
movlw jug_ilegal
movwf PORTD
pagina0
call cont_20ms
bcf PORTE,ce_isd1 ; ce=0, habilitado
call cont_20ms
call cont_20ms
bsf PORTE,ce_isd1 ; ce=1, deshabilitado
pagina2
goto loop1
166
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos 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
;-------------------------------------------------------------------------
clrf offset_piezas
movlw piezas ; buscamos pieza en array 'piezas'
movwf aux_piezas
examina1 incf aux_piezas
incf offset_piezas
movf aux_piezas,W
leer_punterob1
movwf auxAA
andlw h'0F' ; aplica mascara para seleccionar coord x
subwf coord_or1x,W ; igual a coord_or1x?
btfsc STATUS,Z
goto examina2 ; si
movlw h'DF' ; no
subwf aux_piezas,W ; hemos llegado al final del array?
btfsc STATUS,Z
167
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;***********************************************************************
168
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf auxAA
btfsc auxAA,3
goto peon_negro
movf coord_desy,W ; peon blanco
subwf coord_or1y,W
btfss STATUS,Z ; coordenadas y (columna) iguales?
goto captura_peonb ; no
movf coord_or1x,W
subwf coord_desx,W
movwf auxAA
decf auxAA
btfsc STATUS,Z ; avance una posicion?
goto examina_peon1 ; si, miramos si casilla destino ocupada
subwf coord_or1x,W
btfss STATUS,Z
goto pon_error
decf coord_desx,W
movwf aux_x
movf coord_or1y,W
movwf aux_y
call mira_casilla ; miramos si casilla de paso ocupada
movwf auxAA
btfsc auxAA,0 ; casilla ocupada?
goto pon_error ; si
goto examina_peon1 ; no, miramos si casilla destino ocupada
subwf coord_or1x,W
btfss STATUS,Z
169
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
goto pon_error
incf coord_desx,W
movwf aux_x
movf coord_or1y,W
movwf aux_y
call mira_casilla ; miramos si casilla de paso ocupada
movwf auxAA
btfsc auxAA,0 ; casilla ocupada?
goto pon_error ; si
goto examina_peon1 ; miramos si casilla destino ocupada
;***********************************************************************
170
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf auxBB
examina_ty movf coord_or1y,W
subwf coord_desy,W
btfss STATUS,C ; coord_or1y > coord_desy ?
goto $+3 ; si
incf auxBB ; no
goto $+2
decf auxBB
movf auxBB,W
subwf coord_desy,W ; coincide con la casilla destino ?
btfsc STATUS,Z
goto quita_enroquet ; si
movf auxBB,W
movwf aux_y
movf coord_or1x,W
movwf aux_x
call mira_casilla ; miramos si la casilla esta ocupada
movwf auxAA
btfsc auxAA,0 ; ocupada ?
goto pon_error ; si
goto examina_ty
171
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
goto mira_captura
bcf enroque,1
goto mira_captura
quita_enroquet3 movlw h'00'
subwf coord_or1y,W
btfss STATUS,Z
goto mira_captura
bcf enroque,3
goto mira_captura
;***********************************************************************
172
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
absoluto
movlw h'02'
subwf auxAA,W
btfss STATUS,Z
goto pon_error ; no, error
goto mira_captura ; si
;***********************************************************************
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
;***********************************************************************
173
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;***********************************************************************
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
;***********************************************************************
174
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;***********************************************************************
175
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf auxAA
btfsc auxAA,0
goto pon_error
movlw h'02'
movwf aux_y
call mira_casilla
movwf auxAA
btfsc auxAA,0
goto pon_error
movlw h'00' ; miramos si casillas paso atacadas
movwf fila
movlw h'03'
movwf columna
movlw h'01'
call ataque
movwf auxAA
btfsc auxAA,0
goto pon_error
movlw h'02'
movwf columna
movlw h'01'
call ataque
movwf auxAA
btfsc auxAA,0
goto pon_error
bsf enroque,6 ; enroque en proceso (falta mover torre)
bcf enroque,2
call actualiza_array
goto turno_juego
176
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
call ataque
movwf auxAA
btfsc auxAA,0
goto pon_error
bsf enroque,5 ; enroque en proceso (falta mover torre)
bcf enroque,1
call actualiza_array
goto turno_juego
mira_enroque3 movlw h'02' ; comprobamos casilla destino
subwf coord_desy,W
btfss STATUS,Z
goto pon_error
movlw h'07'
subwf coord_desx,W
btfss STATUS,Z
goto pon_error
btfss enroque,3 ; enroque largo negras permitido?
goto pon_error ; no
btfsc control,1 ; si, esta el rey en jaque?
goto pon_error ; si
movlw h'07' ; no, miramos si casillas de paso ocupadas
movwf aux_x
movlw h'03'
movwf aux_y
call mira_casilla
movwf auxAA
btfsc auxAA,0
goto pon_error
movlw h'02'
movwf aux_y
call mira_casilla
movwf auxAA
btfsc auxAA,0
goto pon_error
movlw h'07' ; miramos si casillas paso atacadas
movwf fila
movlw h'03'
movwf columna
movlw h'00'
call ataque
movwf auxAA
btfsc auxAA,0
goto pon_error
movlw h'02'
movwf columna
movlw h'00'
call ataque
movwf auxAA
btfsc auxAA,0
goto pon_error
bsf enroque,7 ; enroque en proceso (falta mover torre)
bcf enroque,3
call actualiza_array
goto 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
;-------------------------------------------------------------------------
177
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------
; kill_pieza: elimina pieza capturada del array
;-------------------------------------------------------------------------
178
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
leer_punterob1
movwf auxAA
btfsc auxAA,4 ; pieza muerta?
goto kill_pieza4 ; si
bsf auxAA,4 ; no, bit4=1, pieza muerta
movf aux_piezas,W
escribe_punterob1
return
;-------------------------------------------------------------------------
; actualiza_array: actualiza el array piezas con la jugada introducida
;-------------------------------------------------------------------------
179
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
goto actualiza_ar6
;-------------------------------------------------------------------------;
; jaque: mira si el bando que mueve deja a su rey en jaque al hacerlo.
; si no ocurre, mira si da jaque al rey contrario
;-------------------------------------------------------------------------;
180
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf auxAA
btfsc auxAA,0 ; rey atacado?
goto pon_error ; si
bcf control,2 ; no
; miramos si con la jugada realizada se da jaque al rey contrario
181
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;-------------------------------------------------------------------------;
; ataque: mira si alguna pieza del bando 'W' ataca la casilla de
; coordenadas 'fila' y 'columna'. Retorna W=0, no, y W=1, si.
;-------------------------------------------------------------------------;
182
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
btfsc STATUS,Z
retlw h'00' ; si, no hay ataque (W=0)
incf aux_piezas ; no
goto ataque_1
;************************************************************
183
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
;************************************************************
184
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
movwf auxAA
btfsc auxAA,0 ; casilla ocupada?
goto at_torre_5 ; si
goto at_torre_3 ; no, saltamos
;************************************************************
movlw h'01'
addwf aux_y,W
subwf columna,W
btfss STATUS,Z ; columna+1 = columna?
goto at_caballo_1 ; no, saltamos
movlw h'02'
addwf aux_x,W
subwf fila,W
btfsc STATUS,Z ; si, fila+2 = fila?
retlw h'01' ; si, retorno con 1
movlw h'02' ;no
subwf aux_x,W
subwf fila,W
btfsc STATUS,Z ; no, fila-2 = fila?
retlw h'01' ; si, retorno con 1
goto ataque_2 ; no, seguimos con otra pieza
185
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
subwf aux_x,W
subwf fila,W
btfsc STATUS,Z ; no, fila-1 = fila?
retlw h'01' ; si, retorno con 1
goto ataque_2 ; no, seguimos con otra pieza
;************************************************************
186
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
187
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
subwf aux_y,W
btfss STATUS,C ; columna > aux_y?
goto ataque_2 ; no
subwf auxAA,W ; si
btfss STATUS,Z ; (fila - aux_x)=(aux_y-columna) ?
goto ataque_2 ; no, saltamos
at_alfil_4 incf aux_x,f ; si, recorremos la diagonal mirando si
decf aux_y,f ; hay algun obstaculo entre el alfil y
la
movf aux_x,W ; casilla objetivo
subwf fila,W ; aux_x++, aux_y++
btfsc STATUS,Z ; hemos llegado a la casilla destino?
retlw h'01' ; si, retorno con 1
call mira_casilla ; no, miramos si hay obstaculos
movwf auxAA
btfsc auxAA,0 ; casilla ocupada?
goto ataque_2 ; si, saltamos
goto at_alfil_4 ; no, seguimos recorriendo la diagonal
;-------------------------------------------------------------------------
; guarda_ram: almacena las jugadas realizadas en memoria RAM
; 2 Bytes semijugada. High: coordenada y, Low: coordenada x
;-------------------------------------------------------------------------
188
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
return
;-------------------------------------------------------------------------;
; Definimos los valores iniciales de los dígitos ;
; en la memoria de datos EEPROM del PIC ;
;-------------------------------------------------------------------------;
ORG H'2100'
; orden variables:
;
nsecmov,xtrtmp,hora,minde,minun,secde,secun,ehora,eminde,eminun,esecde,esecun
DE 0 ; offset
DE 0, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 ; m1. 2h + 1h finish
DE 0, 1, 1, 3, 0, 0, 0, 1, 0, 0, 0, 0 ; m2. 90m + 1h finish
DE 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 ; m3. 30 mimutos
DE 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0 ; m4. 5 minutos
DE 1, 0, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0 ; m5. 90m + 30s/jug
DE 1, 0, 0, 2, 5, 0, 0, 0, 0, 0, 1, 0 ; m6. 25m + 10s/jug
DE 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 2 ; m7. 4m + 2s/jug
DE "Copyright","Carlos Vidal Garcia"
end
189
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
void configura_serie(void);
char get_character(void);
void genera_pgn(void);
/***********variables globales*************************************/
/*----------------------------------------------------------------*/
/* programa principal */
/*----------------------------------------------------------------*/
int main(void)
{
int x=0;
configura_serie();
printf("Esperando Transmision \n\n");
190
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
/*----------------------------------------------------------------*/
/* configura_serie : configuracion del puerto serie */
/*----------------------------------------------------------------*/
void configura_serie(void)
{
outportb(LCR,0x80); /*line control bit7=1, accedemos a baud rate
divisor*/
outportb(TXDATA,0x0C);
outportb(TXDATA+1,0x00); /*frecuencia del cuarzo 1.8432 MHz*/
outportb(LCR,0x03); /*configuracion de la linea: no bit de paridad,
1 bit de stop, palabra
de 8 bits*/
}
/*----------------------------------------------------------------*/
/* get_character : obtiene un dato entrante por el COM_1 */
/*----------------------------------------------------------------*/
char get_character(void)
{
int status;
do
{
status=inportb(LSR)&0x01; /*data ready=1?*/
if(kbhit()) exit(1);
}while(status!=0x01); /*repetir hasta que se obtiene un dato*/
return((char)inportb(TXDATA));
}
/*----------------------------------------------------------------*/
/* genera_pgn : convierte los bytes transmitidos en un archivo */
/* de partida pgn. */
/*----------------------------------------------------------------*/
void genera_pgn(void)
{
FILE *fp;
int x=0, jugada=1;
char origen=1, negras=0, columna, fila;
fp=fopen("partida.pgn","w+");
if (fp==NULL)
{
printf("Error: no se puede abrir partida_1.pgn\a");
exit(1);
}
fprintf(fp,"[Event \" \"]\n"); /*Escribe los datos de la cabecera del
pgn*/
fprintf(fp,"[Site \" \"]\n");
fprintf(fp,"[Date \" \"]\n");
fprintf(fp,"[Round \" \"]\n");
fprintf(fp,"[White \" \"]\n");
fprintf(fp,"[Black \" \"]\n");
fprintf(fp,"[Result \" \"]\n\n");
191
Gestión Basada en Microcontrolador de un Tablero de Ajedrez Adaptado para Ciegos Anexos
}
else
{
if(origen==1 && negras==1)
{
columna=((inchar[x]&0xF0)>>4)+97;
fprintf(fp,"%c",columna);
fila=(inchar[x]&0x0F)+1;
fprintf(fp,"%d-",fila);
if(inchar[x]!=carac_final) x++;
origen=0;
}
else
{
if(origen==0 && negras==0)
{
columna=((inchar[x]&0xF0)>>4)+97;
fprintf(fp,"%c",columna);
fila=(inchar[x]&0x0F)+1;
fprintf(fp,"%d ",fila);
if(inchar[x]!=carac_final) x++;
origen=1;
negras=1;
}
else
{
if(origen==1 && negras==0)
{
fprintf(fp,"%d. ",jugada);
columna=((inchar[x]&0xF0)>>4)+97;
fprintf(fp,"%c",columna);
fila=(inchar[x]&0x0F)+1;
fprintf(fp,"%d-",fila);
jugada++;
if(inchar[x]!=carac_final) x++;
origen=0;
}
}
}
}
}
fclose(fp);
}
192