proyecto final de carrera - deeea.urv.catdeeea.urv.cat/public/propostes/pub/pdf/163pub.pdf · 1.7.2...

156
Proyecto Final de Carrera Reloj de Ajedrez para Ciegos VOLUMEN 1: MEMORIA AUTOR: Carlos Massa Amado DIRECTOR: José Luis Ramírez Falo FECHA: Enero / 2002

Upload: vandung

Post on 28-Jul-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Proyecto Final de Carrera

Reloj de Ajedrez para Ciegos

VOLUMEN 1: MEMORIA

AUTOR: Carlos Massa Amado

DIRECTOR: José Luis Ramírez Falo

FECHA: Enero / 2002

Page 2: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Índice.

ÍNDICE

Pág.

1. MEMORIA DESCRIPTIVA 4

1.1 OBJETIVO DEL PROYECTO 5

1.2 ANTECEDENTES 5

1.3 SOLUCIÓN ADOPTADA 6

1.3.1 Descripción Detallada de la Solución Adoptada 6

1.3.1.1 Microcontrolador PIC16F873 de Microchip 6

1.3.1.2 Tipo de Memoria Utilizada 6

1.3.1.3 Control del Módulo de Audio 7

1.3.1.4 Conversión D/A 7

1.3.1.5 Etapa de Potencia 7

1.3.1.6 Display 7

1.3.2 Comparación de la Solución Adoptada con Otros Métodos 7

1.3.2.1 Ventajas del PIC Frente Otros µC 7

1.3.2.2 Ventajas de la EPROM Frente los Dispositivos ISD 8

1.3.2.3 Ventajas del Display LCD Frente a un Display tipo LED 9

1.4 DESCRIPCIÓN GENERAL DEL EQUIPO 9

1.5 DIAGRAMA DE BLOQUES 11

1.6 CARACTERÍSTICAS BÁSICAS 12

1.6.1 Aspecto General 12

1.6.2 Características Funcionales Básicas 13

1.7 DESCRIPCIÓN DEL HARDWARE 17

1.7.1 Módulo de Control: Microcontrolador PIC e interface con el Usuario 18

1.7.1.1 El Timer 19

1.7.1.2 Interface con el Usuario: los Pulsadores 21

1.7.1.3 Circuito Detector de Batería Baja 22

1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24

1
Page 3: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Índice.

1.7.3 Módulo de Audio: Almacén y Procesamiento del Sonido 28

1.7.3.1 La FPGA 29

1.7.3.2 El Conversor D/A 32

1.7.3.3 La Señal de Reloj 33

1.7.3.4 Etapa de Acondicionamiento de la Señal Acústica 35

1.7.3.5 Etapa de Potencia 36

1.8 DESCRIPCIÓN DEL SOFTWARE. DIAGRAMAS DE FLUJO 38

1.8.1 Inicialización del Sistema 39

1.8.2 Programa Principal 40

1.8.3 Subrutina de Atención a la Interrupción (ISR) 45

1.8.4 Subrutina para Disminuir un Segundo 47

1.8.5 Subrutina para Actualizar las Variables que Mandamos al Display 49

1.8.6 Subrutina para Poner un Determinado Modo de Partida 51

1.8.7 Subrutina para Esperar a que Cambie el Conmutador de Partida 53

1.8.8 Subrutina para Escribir en la EPROM del PIC la Configuración de

Partida actual 55

1.8.9 Subrutinas para Reproducir el Tiempo Restante de un Jugador 56

1.8.10 Otras Subrutinas 63

2. MEMORIA DE CÁLCULO 65

2.1 LISTADO DEL PROGRAMA EN CÓDIGO ENSAMBLADOR 66

3. PLANOS 108

3.1 PLACA 1 (MÓDULO DE CONTROL Y MÓDULO DEL

DISPLAY) 110

3.1.1 Esquema Eléctrico Placa 1 110

3.1.2 Situación de Componentes Placa 1 111

3.1.3 Máscara de Cara de Componentes Placa 1 112

3.1.4 Máscara de Cara de Soldaduras Placa 1 113

3.2 PLACA 2 ( MÓDULO DE AUDIO) 114

3.2.1 Esquema Eléctrico Placa 2 114

2 2
Page 4: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Índice.

3.2.2 Situación de Componentes Placa 2 115

3.2.3 Máscara de Cara de Componentes Placa 2 116

3.2.4 Máscara de Cara de Soldaduras Placa 2 117

4. PRESUPUESTO 118

4.1 PRESUPUESTO DE DISEÑO DEL PROTOTIPO 119

4.2 PRESUPUESTO DE PUESTA EN FABRICACIÓN 123

5. BIBLIOGRAFÍA 127

5.1 LIBROS CONSULTADOS 128

5.2 PÁGINAS WEB CONSULTADAS 129

ANEXO A. MANUAL DEL USUARIO

ANEXO B. ESQUEMAS Y SIMULACIÓN DE LA FPGA CON

MAX+PLUS II DE ALTERA. CHIPS UTILIZADOS

(Los anexos van encuadernados en volúmenes separados de la Memoria del Proyecto).

3 3
Page 5: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1. MEMORIA DESCRIPTIVA.

4

Page 6: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.1 Objetivo del Proyecto El objetivo del presente proyecto es diseñar y montar un prototipo de 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 de dos relojes / cronómetros independientes, y 4 Mbit de datos guardados en una memoria EPROM. Este prototipo realizará las funciones básicas de un reloj de ajedrez convencional: selección de diferentes modos de funcionamiento, presentación por pantalla del tiempo restante, parada del reloj en cualquier momento de la partida, etc. A parte de estas funciones, tendrá que reproducir el tiempo restante para cada jugador en forma de voz por un auricular. Hay que destacar que la reproducción de los mensajes de voz podrá darse de forma simultánea por los dos auriculares de los que dispondrá el reloj, sin que tengan que ser mensajes iguales. En definitiva, se trata de diseñar un aparato electrónico que pueda hacer más cómodo el juego del ajedrez para las personas discapacitadas visualmente y que tenga un coste de fabricación mínimo para competir con el mercado existente.

1.2 Antecedentes Para los no iniciados en el mundo del ajedrez de competición, es importante

mencionar que en este juego es básica la utilización de un reloj, que controla el tiempo que tiene cada jugador para pensar las jugadas. "Reloj de ajedrez" quiere decir un reloj con dos muestras de la hora interconectadas entre si de tal manera que sólo una de ellas puede estar disminuyendo en un momento dado. Cuando se usa un reloj de ajedrez, cada jugador debe hacer un cierto número o incluso todos sus movimientos en un periodo determinado de tiempo, o le puede ser otorgada una cantidad adicional de tiempo después de cada movimiento. Todo esto ha de especificarse por adelantado. Es decir, básicamente se trata de un temporizador que irá disminuyendo la cuenta de un reloj a partir de un tiempo inicial, y cuando esta llegue a cero para un jugador de los dos, éste pierde la partida.

Es fácil imaginar la dificultad que puede llegar a suponer para una persona ciega, jugar a un juego de estrategia como el ajedrez. Sólo hay que cerrar los ojos y ponerse delante de un tablero de juego. Si a la complicación de recordar mentalmente la posición de cada una de las fichas, las propias y las del adversario, en el tablero le añadimos la de saber el tiempo restante para terminar la partida, lo que en un principio iba a ser un juego o un deporte se puede convertir en una tarea realmente difícil de llevar a cabo. Por esta razón, es necesario crear una serie de facilidades para que las personas ciegas también puedan disfrutar de este juego de una manera más cómoda.

Para una persona invidente, lo más cómodo es escuchar por un auricular el tiempo que le queda a él y/o a su contrincante para terminar la partida. La forma de escuchar un mensaje tiene que ser rápida, sencilla e intuitiva, con la simple pulsación de un botón.

Actualmente existen en el mercado relojes capaces de satisfacer estas funciones, pero a parte de ser excesivamente caros, carecen de ciertas funciones, o las

5

Page 7: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

que tienen pueden ser mejoradas. Por esta razón se ha decidido realizar el diseño de un nuevo reloj que cumpla con los requisitos de ser más económico y a la vez contar con más funcionalidad, cómo la de poder escuchar mensajes de voz diferentes por los dos auriculares a la vez, sin tener que esperar a que termine la reproducción por uno de ellos para empezar por el otro. Esta característica resulta realmente útil en los últimos minutos o segundos de la partida, donde el jugador invidente podrá tener la posibilidad de escuchar de forma continuada por su auricular como va pasando el tiempo.

1.3 Solución Adoptada La solución adoptada está basada en un sistema digital con microcontrolador.

Lo que hacemos es guardar los mensajes de sonido en formato digital, en una memoria EPROM. El µC se encarga de gestionar estos datos de forma que se escuche por un auricular el tiempo restante a petición de un usuario. A la vez, el µC se encarga de llevar la cuenta del tiempo a partir de un sistema de interrupciones, que suceden a intervalos constantes, y de mostrar este tiempo por un display.

1.3.1 Descripción Detallada de la Solución Adoptada

1.3.1.1 Microcontrolador PIC16F873 de Microchip

Hemos escogido el PIC 16F873, de ocho bits, principalmente por la gran cantidad de documentación que hay sobre estos dispositivos y la facilidad que supone aprender su programación. También hemos tenido en cuenta las características que tenía que tener el sistema, tanto de velocidad de procesamiento, como de puertos de entrada salida, siendo este µC más que suficiente. Otro factor que nos ha empujado a esta decisión ha sido la disponibilidad de un programador para grabar el dispositivo y del software necesario para generar y depurar el código de programa.

1.3.1.2 Tipo de Memoria Utilizada

Utilizamos 2 memorias EPROM, una en el módulo del display y otra en el módulo de audio. La memoria del módulo del display es una M27C256 de 256 Kbits (32k. x 8), en la que se guardan los códigos de los números y símbolos que se mostrarán en el display. En el módulo de audio hemos escogido la memoria EPROM NM27C040 de 4 Mbit (512k. x 8), para almacenar los 64 mensajes de voz que se podrán reproducir por los auriculares.

6

Page 8: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.3.1.3 Control del Módulo de Audio

Entre el módulo de control y el módulo de audio, es necesaria la presencia de una gran cantidad de lógica combinacional y secuencial, que nos sirve de interface entre los dos. Para implementar toda esta lógica la solución más fiable y sencilla es utilizar una FPGA. Su diseño y programación se ha realizado utilizando el software MAX+plus II, subministrado a libre distribución por ALTERA.

1.3.1.4 Conversión D/A

Para poder oír un mensaje de voz por el auricular, primero hay que convertir los datos contenidos en la memoria EPROM a una señal analógica. Para realizar esta conversión, utilizamos el DAC TLC7528. Se ha escogido este integrado porque a parte de tener dos conversores de digital a analógico internos, contiene dos latches en la entrada digital, uno para cada canal. Está dotado de unas señales de control que lo hacen ideal para la comunicación con un microcontrolador. A parte de todas estas prestaciones, que nos facilitan mucho el control de la conversión, se añade la gran ventaja de que este chip permite la operación con una única alimentación (de 5 V a 15 V). Esto lo hace ideal para nuestra aplicación, ya que tiene que ser un equipo portátil alimentado con pilas.

1.3.1.5 Etapa de Potencia

Para poder oír la señal de audio con un volumen suficiente y poderlo variar, es necesario tratar la señal analógica provinente del DAC para amplificarla antes de atacar al auricular. Esta etapa la realizamos con el amplificador de audio LM386.

1.3.1.6 Display

El display que utilizamos para poder visualizar el tiempo restante de cada jugador es el VI804, de la casa Varitronix. Se trata de un display LCD de siete segmentos que contiene 8 dígitos.

1.3.2 Comparación de la Solución Adoptada con Otros Métodos

Veamos que ventajas presenta la solución que hemos escogido para llevar a cabo el proyecto, frente a otras que también podrían haber sido factibles, pero que presentan una serie de inconvenientes.

1.3.2.1 Ventajas del PIC Frente a Otros µC

Los microcontroladores más utilizados se encuentran, sin duda, entre las mejores elecciones:

7

Page 9: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

• 8048 (Intel). Es considerado por numerosas fuentes el padre de los microcontroladores actuales, el primero de todos. Su precio, disponibilidad y herramientas de desarrollo hacen que todavía sea muy utilizado.

• 8051 (Intel y otros). Está bien documentado y posee cientos de variantes y abundantes herramientas de desarrollo.

• 80186, 80188 y 80386 EX (Intel). Versiones en microcontrolador de los microprocesadores 8086 y 8088. Su principal ventaja es que permiten aprovechar las herramientas de desarrollo para PC.

• 68HC11 (Motorola y Toshiba). Es un microcontrolador de 8 bits potente y con gran cantidad de variantes.

• 683xx (Motorola). Surgido a partir de la familia 68k, a la que se incorporan algunos periféricos. Son microcontroladores de altísimas prestaciones.

• PIC (MicroChip). Familia de microcontroladores que gana terreno en las aplicaciones industriales día a día. Fueron los primeros microcontroladores RISC.

Es preciso resaltar en este punto que existen muchas familias de microcontroladores, cada una de las cuales posee un gran número de variantes.

Una de las principales ventajas que podemos encontrar en los PIC’s frente a los otros µC, es su arquitectura tipo RISC (Computadores de Juego de Instrucciones Reducido). En estos procesadores el repertorio de instrucciones máquina es muy reducido y las instrucciones son simples y, generalmente, se ejecutan en un ciclo. Otra ventaja es la facilidad de aprendizaje y uso del entorno de programación MPLAB, del cual se puede tener acceso en la escuela, para editar y depurar programas.

Un punto negativo de este tipo de arquitectura es que se complica ligeramente el software del procesador.

1.3.2.2 Ventajas de la EPROM Frente los Dispositivos ISD

Existen en el mercado los llamados “grabadores de estado sólido”; estos son los integrados ISD (Information Storage Devices), isdx25xx 45/60/90. Se trata de una tecnología donde las grabaciones se almacenan de manera digital (niveles de tensión), en una memoria no volátil. Los dispositivos que hay actualmente en el mercado, tienen integradas todas las partes que necesita un grabador – reproductor de voz.

Para este proyecto hemos escogido una memoria EPROM porque presenta una serie de ventajas frente a estos chips:

• El precio de estos integrados respecto al de una memoria EPROM, con un tamaño suficiente como para guardar una cantidad de audio igual, y con la misma calidad, es del orden de tres veces mayor.

• Como el almacenamiento de datos se realiza en bloques de tiempos determinados, el tratamiento de estos es bastante limitado. Nos resultaría

8

Page 10: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

imposible reproducir dos mensajes distintos a la vez por dos auriculares diferentes con sólo uno de estos dispositivos.

• No se puede ampliar la memoria de una forma fácil, en el caso de querer que el dispositivo cuente con distintos idiomas.

1.3.2.3 Ventajas del Display LCD Frente a un Display tipo LED.

Aunque no es fácil encontrar en el mercado LCDs de siete segmentos y ocho dígitos, como el que necesitamos para nuestro prototipo, estos presentan una gran ventaja frente a los displays de siete segmento de ánodo o cátodo común: su consumo. Estos últimos tienen un consumo del orden de miliamperios, mientras que los primeros se mueven alrededor de los microamperios. Este punto, el del consumo, es muy importante tenerlo en cuenta en una aplicación que se alimente de baterías, como ocurre en nuestro caso.

1.4 Descripción General del Equipo

El equipo se puede decir que está formado por tres grandes bloques o módulos,

cada uno de ellos dividido en una serie de etapas o subcircuitos, formando un total de 14 etapas, que son las siguientes:

Módulo de Control:

• Interface con los usuarios: pulsadores y conmutador de partida.

• Microcontrolador: PIC 16F873.

Módulo del Display:

• Almacenamiento del código de los dígitos y símbolos del LCD: Memoria EPROM de 256 bits.

• Demultiplexor formado por siete decodificadores.

• Interface con el usuario: pantalla LCD de siete segmentos y ocho dígitos.

9

Page 11: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

Módulo de audio:

• Interface con el Módulo de Control: FPGA.

• Almacenamiento de los mensajes: Memoria EPROM de 4 Mbit.

• Conversión D/A de los datos.

• Etapas de filtrado para quitar el ruido de la señal acústica.

• Amplificación de potencia y auriculares de salida.

10

Page 12: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.5 Diagrama de Bloques A continuación podemos ver un diagrama de bloques de todo el sistema:

MÓDULO DE CONTROL

PULSADORES USUARIOS Y

CONMUTADOR

MÓDULO DE AUDIO

MÓDULO DEL DISPLAY

11

EPROM 4Mb

DAC

FPGA

LCD

EPROM 256 BIT

MICRO

PIC 16F873

DEMULTIPLEXOR

AMPLIFICACION

ETAPA FILTRADO

ETAPA FILTRADO

AMPLIFICACION

88888888

Page 13: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.6 Características Básicas El aparato está diseñado para ser utilizado por dos usuarios en partidas de

competición de ajedrez. Estos dos usuarios podrán ajustar las opciones del tipo y tiempo de partida y preparar el reloj para jugar. 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 por el auricular del usuario que ha hecho dicha petición. No es necesario que el aparato cuente con una gran calidad de sonido, aunque los mensajes se oirán de una manera clara e inteligible.

A continuación se describen las características básicas del prototipo.

1.6.1 Aspecto General

Basándonos en esta idea, el aparato dispone de:

o Un display LCD de siete segmentos y 8 dígitos.

o Dos auriculares.

o Cuatro pulsadores para los usuarios, con funciones de ajuste de los parámetros de la partida o de petición de mensaje de audio, dependiendo de si ha empezado la partida o no.

o Un balancín para poder parar un temporizador o el otro.

o Un interruptor de encendido / apagado.

Para una descripción más detallada del funcionamiento de los botones de usuario, consultar el anexo A. Manual del usuario.

En la figura 1 se observa el diagrama del reloj de ajedrez para ciegos.

12

Page 14: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

p t

Figura 1. Diagrama del Reloj de Aje (a) vista superior (b) vi

1.6.2 Características Funcionales Básicas

La manera de almacenar los mensajes es cproduce al hablar en datos digitales. En nuestro cde 8 bits. El valor 0 voltios tendrá un código bintendrá un código binario = 11111111. Esto se pu

13

Mode Se

Next U

drez para Ciegos; sta frontal.

onvirtiendo la señal analógica que se aso la resolución de la conversión es ario = 00000000 y el valor 5 voltios

ede ver representado en la figura 2.

Page 15: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

valores256

0000000000000001

0111111111111111

5 V

0 V

Figura 2. Señal Analógica y su Codificación en Binario Natural

A parte de la resolución en bits, un parámetro muy importante en una conversión digital es la frecuencia a la que se muestreará la señal analógica. Este parámetro especifica el número de conversiones por unidad de tiempo. Utilizando una mayor velocidad de muestreo se adquirirán más puntos por un intervalo de tiempo, lo que implica una cantidad de datos más elevada.

Para nuestra aplicación, nos interesa que la frecuencia de muestreo sea lo más baja posible, ya que a cada conversión le corresponde un byte de memoria. Por tanto, cuantas más conversiones hagamos por segundo, más memoria necesitaremos para almacenar el mismo mensaje. Por otro lado, si la frecuencia de muestreo es demasiado baja puede suceder el efecto aliasing, distorsionando el mensaje que realmente queremos grabar. Se considera que la voz humana es inteligible por debajo de los 3600 Hz y también se sabe que la mínima frecuencia de muestreo necesaria para que no se produzca el efecto aliasing es justamente el doble de la frecuencia a digitalizar. Por tanto, la frecuencia de muestreo mínima es de 7200 Hz. Para obtener un poco más de calidad en el sonido que reproduciremos, hemos escogido una frecuencia de 8000 Hz. Es decir que cada 1/8000 = 125 microsegundos se produce una conversión, la cual cosa implica que cada 125 microsegundos se ocupa un byte (una posición de memoria). Como queremos grabar 64 mensajes distintos para poder dar información de cualquiera que sea el tiempo restante, y teniendo en cuenta que todos los mensajes son de 1 segundo, la memoria necesaria será de:

bytess

/000125'064 = 512000 bytes.

Es decir, para almacenar 64 segundos de audio con una calidad de 8 kHz y una resolución de 8 bits, necesitaremos una memoria de 512 KB, o lo que es lo mismo:

14

Page 16: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

(512 x 1024 x 8) bits = 4 Mbits.

Para poder digitalizar los mensajes de voz y grabarlos posteriormente en la memoria se ha utilizado la versión de evaluación del programa Cool Edit 2000. Primero hay que generar un archivo de sonido .raw con los mensajes de audio que queremos que contenga la memoria. Este archivo se puede generar con un PC y un micrófono conectado a la tarjeta de sonido, mediante algún software de audio, por ejemplo el mencionado anteriormente. Los tipos de archivo de sonido estándar utilizados por los PCs son los que tienen extensión .wav. Estos tipos de archivos llevan una cabecera que da información sobre el contenido del archivo. Para nuestra aplicación grabaremos un archivo .wav y le quitaremos la cabecera, con lo que obtenemos el archivo .raw. Esto se hace para no oír el ruido que generaría el auricular cuando el DAC convirtiese la cabecera del archivo .wav.

Una vez hecho esto, tenemos un archivo binario con formato .raw, el cual vamos a grabar en la EPROM utilizando el programador y el software que tiene la universidad para este fin.

Para convertir estos datos a sonido, lo haremos con un conversor D/A (digital – analógico), que convierte a un nivel de tensión determinado cada código binario. Una vez convertido el código digital a niveles de tensión filtraremos la señal obtenida para quitar el ruido que se haya podido introducir. Es las figuras 3 y 4 se observa este efecto.

0000000000000001

0111111111111111

valores256

Figura 3. Señal a la Salida del DAC

15

Page 17: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

5 V

0 V

Figura 4. Señal Filtrada

Cuando ya tenemos el sonido convertido y filtrado, sólo nos queda amplificarlo y sacarlo por el auricular. Para amplificarlo utilizaremos el operacional LM386. Este es un amplificador de audio de baja potencia que permite amplificar la señal hasta 1 W de potencia utilizando el mínimo de componentes, potencia más que suficiente para nuestro prototipo.

16

Page 18: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.7 Descripción del Hardware En las figuras 5 y 6 se puede ver la distribución de los diferentes componentes

en las dos placas que forman el sistema.

Figura 5. Distribución de los componentes en la placa 1

17

Page 19: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

Figura 6. Distribución de los componentes en la placa 2

1.7.1 Módulo de Control: Microcontrolador PIC e Interface con el Usuario

El elemento principal de este módulo, y podríamos decir también del sistema entero, es el microcontrolador PIC 16F873. Este integrado de la familia microchip, es un µC de ocho bits que cuenta con una memoria de programa tipo flash de 4K x 14 words (word de 14 bits) y una de datos de 192 bytes, ambas internas, así como también una memoria EEPROM de datos interna de 128 bytes.

Puede tener hasta 14 fuentes de interrupción, de las cuáles sólo vamos a utilizar una, que es la que ocurre cuando se desborda uno de los 3 timers que tiene. También cuenta con tres puertos de entrada - salida: el A, de 6 bits y el B y el C, ambos de 8 bits.

En la siguiente figura podemos ver el patillage del PIC 16F873.

Figura 7. Microcontrolador PIC16F873

Las patas de los tres puertos pueden ser configuradas como patas de entrada o de salida, cada uno independientemente de los demás. La configuración de las patas que hemos utilizado para nuestra aplicación es la siguiente:

18

Page 20: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

Puerto A:

o Pin [0..5] ⇒ Salida. Por aquí mandaremos los 6 bytes de más peso de la dirección del mensaje de voz guardado en la EPROM.

Puerto B:

o Pin [0..1] ⇒ Salida. Estos dos bits son los bits de control del módulo de audio. Por aquí controlaremos por que auricular se reproducirá un mensaje.

o Pin [2..7] ⇒ Entrada. Utilizamos estas 6 patas para los botones de usuario y para el conmutador de juego.

Puerto C:

o Pin [0..3] ⇒ Salida. Con estos 4 bits que van al bus de direcciones de la EPROM de 256 bits del módulo del display, podremos escoger 1 de los 16 caracteres posibles para representarlo en el display.

o Pin [4..6] ⇒ Salida. Mediante estos 3 bits escogemos cuál de los 8 dígitos del display es el que tiene que representar el carácter que hay en el bus de direcciones de la EPROM de 256 bits.

1.7.1.1 El Timer

El TIMER0 del PIC16F873 es un contador de 8 bits (0 – 255) que aumenta una cuenta cada vez que se ejecuta una instrucción. Como el tiempo de ejecución de una instrucción depende directamente del reloj del sistema, obtenemos la siguiente relación:

1 instrucción = 4 ciclos de reloj = 4 · (segundos) reloj frec.

1 (1)

Con un reloj de 1 MHz, cada instrucción tarda en ejecutarse un tiempo:

Tiempo ejecución 1 instrucción = 4 · 1000000

1 = 4 us. (2)

Por tanto, el timer tardará en desbordarse:

4 µs · 256 = 1’024 ms. (3)

19

Page 21: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

Cuando el timer se desborda (es decir, pasa del valor 255 al 0, o lo que es lo mismo, en hexadecimal pasa de 0xFF a 0x00) se produce una interrupción, saltando el contador de programa a la dirección donde se guarda la rutina de atención a la interrupción. Así pues, tal y como hemos obtenido en (3), se producirá una interrupción cada 1’024 ms.

La rutina de atención a la interrupción actualiza uno de los dígitos del display cada vez que es ejecutada. Sabiendo esto, y de la ecuación (3) obtenemos que cada 1’024 ms se estará actualizando un dígito. Este dígito no volverá a ser actualizado hasta que se produzcan 8 interrupciones más. Así, la frecuencia de refresco de cada dígito es de:

=ms024'1·8

1 122’1 Hz

Eta frecuencia es superior a la que aconseja el fabricante de 32 Hz, con lo que no se notará ningún parpadeo en la pantalla.

Para conocer la precisión en el cálculo del tiempo de partida transcurrido, resulta imprescindible tener en cuenta el reloj que lleva el microcontrolador. Esto es así porque hemos dicho que el timer es un contador de 8 bits que aumenta en una unidad su valor cada vez que se ejecuta una instrucción, y el tiempo que tarda cada instrucción en ejecutarse depende directamente del reloj del sistema. Así pues con un reloj de 1 MHz el timer aumentará una unidad cada 1’024 ms, como hemos explicado anteriormente. Si queremos calcular un segundo exacto de tiempo, tendremos que tener un contador que vaya disminuyendo cada vez que se desborde el registro del timer (cada 1’024 ms) y que cuando llegue a cero haya pasado dicho segundo. Llamemos X al valor de este contador, entonces tenemos la siguiente relación:

X · 1’024 ms = 1000 ms , de lo que resulta: X = 976’56 (4)

Los registros de memoria de datos que contiene el PIC son registros de 8 bits, es decir que podemos guardar en ellos un valor decimal como máximo de 255. Así que tendremos que dividir el valor del contador que hemos obtenido en dos registros, ya que 4 · 244 = 976. Por tanto, para el cálculo de un segundo, necesitaremos dos registros, uno que contenga el valor 4 y el otro el valor 244. De aquí podemos obtener fácilmente la precisión que tendrá nuestro reloj, ya que no estaremos calculando exactamente un segundo de tiempo, sino:

976 · 1’024 ms = 0’999424 s

Entonces, la precisión de nuestro sistema será de:

Precisión = (1 - 0’999424) · 100 = 0’058 %

Es decir, para una partida de 2 horas por jugador estaríamos cometiendo un error:

2 horas · 0’058 % = 7.200 s. · 0.00058 = 4’18 s. por jugador.

20

Page 22: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

Se puede ganar un 0’39 % de precisión utilizando 3 contadores para contar 977 interrupciones. En este caso estaríamos calculando un tiempo de:

977 · 1’024 ms = 1’000448 s

Entonces, la precisión de nuestro sistema sería de:

Precisión = (1’000448 - 1) · 100 = 0’0448 %

En estas condiciones, para una partida de 2 horas por jugador estaríamos cometiendo un error:

2 horas · 0’0448 % = 7.200 s. · 0.000448 = 3’23 s. por jugador.

1.7.1.2 Interface con el Usuario: los Pulsadores

Los cuatro botones de usuario, así como el conmutador de partida, van conectados a los patas [2..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 figura 8.

Figura 8. Conexión de un Pulsador a Una Pata del PIC

21

Page 23: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

De esta manera, si al leer el estado de una pata del puerto B en concreto, éste está a un nivel lógico de tensión 1, quiere decir que el botón no está pulsado. Del mismo modo, si la pata está a un nivel lógico 0, nos indica que el botón si está pulsado.

Ya veremos en el apartado 1.7 (Descripción del software. Diagramas de flujo) la manera de saber qué botón está pulsado en cada instante.

1.7.1.3 Circuito Detector de Batería Baja

En el Módulo de Control también ha sido incluido este pequeño circuito detector de batería baja. Su función es encender los dos puntos centrales del display cuando detecta que la pila está aproximadamente por la mitad de su capacidad.

Figura 9. 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 (78L05). Este regulador permite una tensión de entrada comprendida entre los 7 y los 20 V. Cuando la tensión en su terminal de entrada está entre los márgenes anteriores, la tensión en su pata de salida, está entre los 4’75 V y los 5’25 V.

Cuando la tensión a la salida del integrado 78L05 es inferior a 4’7 V, es que la tensión de la pila de 9 V, es más baja que 7V. En esta situación el amplificador

22

Page 24: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

operacional se saturará, haciendo que se enciendan dos puntos en el display, indicando que hay que cambiar la batería. Así pues, este circuito tendrá la función de transferencia de la figura 10.

Figura 10. Función de Transferencia del Circuito Detector de Batería Baja

Analizando el circuito se deducen las siguientes ecuaciones:

212·RR

RVrefVl+

= (5)

212·

211·

RRRVref

RRRVrefVh

++

+= (6)

De donde obtenemos los valores para nuestro circuito:

=ΩΩ

=kkVVl

2019·7'4 4’465 V.

=ΩΩ

+ΩΩ

=kkVkVVh

2019·7'4

201·7'4 4’7 V.

23

Page 25: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos

El módulo del display consta de tres partes:

o Una memoria EPROM M27C256 de 256 kbits ( 32k x 8),

o Una etapa demultiplexora, formada por 7 integrados 74HCT23, y

o El display LCD, modelo VI-804-DP.

El funcionamiento de este circuito se basa en el multiplexado en el tiempo de los 8 dígitos que contiene el display LCD (véase Anexo B). Esto quiere decir que mientras estamos representando un número en uno de los 8 dígitos, en los demás no representamos nada. Así pues, si por ejemplo quisiéramos representar el número 12345678 en el display, primero representaríamos el número 1 en el primer dígito, y lo dejaríamos iluminado un cierto tiempo, a continuación representaríamos el número 2 en el segundo dígito, y lo dejaríamos encendido el mismo tiempo, y así sucesivamente hasta el último dígito. Aprovechando la persistencia de la imagen en el ojo humano, si todo esto lo hacemos con la suficiente velocidad, este no es capaz de ver el encendido y apagado continuo del LCD. Este multiplexado en el tiempo también contribuye a un ahorro de energía.

En nuestro caso, la frecuencia de refresco de cada dígito es de 61 Hz. Podemos obtener este dato sabiendo que el software actualiza un dígito, cada vez que se entra en la rutina de atención a la interrupción. Como ya se ha explicado en el apartado 1.6.1.1, se produce una interrupción cada 2’048 ms, es decir que se producirán interrupciones con una frecuencia de 1 / 2’048ms = 488’28 veces por segundo, o lo que es lo mismo, 488’28 Hz. Si dividimos todas estas veces que se actualizará un dígito del display entre los 8 dígitos que hay, obtenemos que la frecuencia de refresco de cada uno será aproximadamente de 488’28 / 8 = 61 Hz. El ojo humano tiene una característica llamada persistencia de la imagen, por la que la señal que se envía al cerebro, causada por una fuente luminosa que alcanza al ojo, se mantiene por un pequeño intervalo de tiempo después de que la fuente luminosa se haya retirado. Si las imágenes en reposo se presentan una después de otra ante el ojo humano a una velocidad de más de 25 cuadros por segundo, se crea una sensación de escena en movimiento sin ningún parpadeo significativo. Esta frecuencia de 25 Hz es inferior a la frecuencia que trabaja nuestro display, con lo que no se apreciará ningun parpadeo.

El display que utilizamos tiene 68 patas para controlar todos los segmentos que posee: 7·8 = 56 segmentos para los dígitos; 7 puntos decimales; 3 separadores de dos puntos; y 2 patas que van conectadas a masa.

Se trata de demasiadas patas como para atacarlas todas directamente desde los puertos de nuestro microcontrolador ya que, aún queriéndolo hacer de esta forma, no habría patas de salida suficientes. Así pues, nos es indispensable la utilización de una etapa intermedia que nos sirva como interface.

24

Page 26: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

Para utilizar el mínimo número posible de patas del µC, utilizamos una EPROM de 256 bits que nos sirve como decodificador entre la salida del PIC y lo que queremos mostrar en el display. Conectando las 4 patas [0..3] del puerto C del PIC directamente al bus de direcciones de esta EPROM, podemos escoger entre 24 = 16 posibles posiciones de memoria. En cada posición de memoria se guarda una palabra de 8 bits, de los cuáles sólo necesitamos 7 para representar uno de los 16 caracteres que utilizamos. En la tabla 1 se puede ver el contenido de cada posición de esta memoria EPROM, junto con lo que representa en el display.

DIRECCIÓN

A4 A3 A2 A1 A0

CONTENIDO

O7 O6 O5 O4 O3 O2 O1 O0

SÍMBOLO

0 0 0 0 0 1 0 1 1 1 1 1 1 0

0 0 0 0 1 1 0 0 0 0 1 1 0 1

0 0 0 1 0 1 1 0 1 1 0 1 1 2

0 0 0 1 1 1 1 0 0 1 1 1 1 3

0 0 1 0 0 1 1 1 0 0 1 1 0 4

0 0 1 0 1 1 1 1 0 1 1 0 1 5

0 0 1 1 0 1 1 1 1 1 1 0 1 6

0 0 1 1 1 1 0 0 0 0 1 1 1 7

0 1 0 0 0 1 1 1 1 1 1 1 1 8

0 1 0 0 1 1 1 1 0 0 1 1 1 9

0 1 0 1 0 0 1 0 0 0 0 1 1

0 1 0 1 1 0 1 0 1 1 0 0 0

0 1 1 0 0 0 0 1 0 0 0 0 0 |

0 1 1 0 1 0 0 0 0 0 0 1 0 |

0 1 1 1 0 0 1 1 0 0 0 1 1

0 1 1 1 1 0 0 0 0 0 0 0 0 Espacio blanco

Tabla 1. Contenido de la Memoria EPROM 27S19

En la figura 11 podemos ver uno de los 8 dígitos que forman el display LCD, y el nombre que se le da a cada uno de sus segmentos. Si por ejemplo queremos representar en este display de un dígito el número 1, tendremos que hacer que se iluminen el segmento B y el segmento C. Para conseguir que se ilumine un segmento basta con conectar su pata a VDD.

25

Page 27: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

.

Figura 11. Dígito de 7 Segmentos

En la figura 12 podemos ver de forma esquemática el conexionado de las tres etapas que forman el conjunto del módulo del display.

Figura 12. Esquema del Módulo del Display

26

Page 28: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

En esta figura podemos distinguir la memoria EPROM, donde se guardan todos los números y símbolos que podemos representar; los siete decodificadores 74HCT23, que hacen la función de un demultiplexor de 8 canales (1 para cada dígito), de 7 bits cada canal (para cada uno de los 7 segmentos de cada dígito); y el display LCD. En la figura 13 está representado esquemáticamente un demultiplexor como el que hemos construido.

Como podemos observar, este módulo es controlado por el PIC a través de las siguientes líneas del puerto C:

o Pin [0..3] ⇒ Conectados directamente al bus de direcciones de la EPROM. Mediante estos 4 bits, escogeremos una de las 16 posibles posiciones de 8 bits que hay en la memoria.

o Pin [4..6] ⇒ Conectados a los bits de control de los 74HCT23, para realizar el multiplexado en el tiempo del display. En la tabla 2 podemos ver la tabla de verdad de estos integrados.

Figura 13. Demultiplexor de 8 Canales, de 7 Bits Cada Uno

Con los datos anteriores, y mirando la tabla de verdad del 74HCT2382 (ver anexo B) podemos explicar fácilmente lo que hace el software. Como se puede observar en esta tabla, la pata enable determina en última instancia si la pata de salida seleccionada estará a nivel alto o bajo. Si enable = 0, independientemente de lo que tengamos en las entradas de control, habrá un 0 en todas las salidas. En cambio si enable = 1, tendremos un 1 en la salida que seleccionemos por las entradas de control.

En la figura 12 se puede ver que utilizamos cada uno de los 7 integrados 74HCT238 para cada uno de los 7 segmentos que tiene un dígito respectivamente. La entrada enable de cada 74HCT238 va conectada directamente al bus de datos de la EPROM. Por tanto, el primero de ellos sirve para el segmento A de los 8 dígitos, el segundo para el segmento B de los 8 dígitos, y así hasta el séptimo integrado, que

27

Page 29: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

sirve para el segmento G de los 8 dígitos. Por esta razón, las salidas de estos integrados irán conectadas al segmento que representan, de cada uno de los 8 dígitos.

Por último quedan las entradas de control (A0, A1 y A2), mediante las cuales se puede escoger sólo 1 de las 23 = 8 posibilidades, que corresponden a los 8 dígitos.

1.7.3 Módulo de Audio: Almacén y Procesamiento del Sonido.

Como ya hemos visto en el diagrama de bloques del apartado 1.5, el Módulo de Audio consta de las siguientes 7 subetapas:

o Una FPGA de la familia MAX7000S, la EPM7128ELC84-20, que se ocupa del control de este módulo,

o Una memoria eprom de 4 Mbits (512 Kb x 8), la AM27C040, donde guardaremos los mensajes de voz,

o Un conversor D/A de dos canales, el TLC7528, para realizar la conversión de los datos guardados en la eprom a una onda analógica,

o Dos etapas de filtrado, una para cada canal de salida, y

o Dos etapas de amplificación, también una para cada canal.

Éste módulo recibe 2 líneas de control procedentes de las patas 0 y 1 del puerto B del PIC, las cuales están directamente conectadas a 2 patas de entrada de la FPGA. También recibe los 6 bits del puerto A del PIC. Estos bits corresponden a los 6 bits de más peso de la dirección de la memoria EPROM donde están guardados los mensajes de voz. Con 6 bits podemos distinguir entre 64 mensajes diferentes. Como los mensajes son de duración constante (todos duran 1’024 s.), necesitaremos un contador de 13 bits (213 = 8192 posiciones de memoria, de 8 bits cada una) para recorrer todo el mensaje (ecuación 7). Recordemos que los mensajes están guardados en la memoria EPROM con una calidad de 8 kHz y una resolución de 8 bits.

=./8000

8192sposiciones

posiciones 1’024 s. (7)

Así pues, de los 19 bits que tiene el bus de direcciones de la EPROM, los 6 de más peso corresponderán a los 6 bits del PORTA del PIC (para escoger un mensaje entre los 64 posibles), y los 13 de menos peso serán las salidas del contador de 13 bits (pare recorrer todo un mensaje - las 8192 posiciones - de 1’024 s). Conectando el bus de datos de esta memoria a un convertidor Digital / Analógico, y poniendo una etapa de filtrado y otra de amplificación a la salida de éste, ya tendríamos un módulo capaz de reproducir sonido, almacenado en forma digital, por un auricular.

28

Page 30: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

En nuestro caso como hay dos jugadores, se requiere que los dos puedan escuchar el tiempo restante propio o del adversario por su auricular. Además, mientras un jugador está escuchando un mensaje de audio por su auricular, el otro jugador tiene que ser capaz también de escuchar otro mensaje a la vez. Para realizar un Módulo de Audio con estas características y con un precio bajo, almacenaremos todos los mensajes en una sola memoria, y haremos un acceso a ella multiplexado en el tiempo. Para implementar éste sistema se necesita mucha lógica combinacional y secuencial, por lo que se ha utilizado una FPGA que la integra toda.

Auricular

MÓDULO A

PORTB[1..0] DE

AUDIO Auricular

PORTA[5..0] B

Figura 14. Entradas y salidas del Módulo de Audio

1.7.3.1 La FPGA

Cuando un usuario pulsa un botón para saber el tiempo restante que le queda a él o a su contrincante, el PIC envía a la FPGA los seis bits que contienen la dirección del mensaje en la memoria EPROM y dos bits de control para indicar si el mensaje tiene que ser reproducido por el auricular del jugador A o el jugador B (figura 14). Los 6 bits de la dirección del mensaje se guardan en un latch que ha sido implementado en la FPGA, mientras que los 2 bits de control van a una etapa también implementada en la FPGA, con el nombre de Control del Módulo de Audio. Esta etapa se encarga de controlar el resto de etapas implementadas en la FPGA para reproducir un mensaje de 1’1 s. Si mientras se está reproduciendo un mensaje por uno de los dos auriculares, llega otra petición de audio por parte del PIC y ésta corresponde al auricular que está inactivo, la etapa de Control del Módulo de audio se encarga de controlar la reproducción simultánea por los dos auriculares.

29

Page 31: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

00XX

S4CUENTA

B Y A

S3SÓLO

CUENTA B

S1 SÓLO

CUENTAA

S0REPOSO

S2CUENTA

A Y B

01XX

XXX0

01X0

00X0

001X

XXX110XX

00X1

100X

000X

XX1X

XX0X

Figura 15. Diagrama de Estados de la Etapa Control del Módulo de Audio

En la figura 15 podemos ver el diagrama de estados de esta etapa, y en la figura 16 sus entradas y al mismo tiempo bits de transiciones.

Pic_C1, Pic_C0, AND_CNTA, AND_CNTB

Figura 16. Entradas de la Etapa Control del Módulo de Audio: Transiciones entre Estados

Como se puede observar en la figura 15 al iniciar el sistema partimos de un estado de reposo (S0), en el que permanece el sistema mientras no recibe ningún estímulo por las entradas de control (Pic_C1 y Pic_C0), que corresponden a los bits 0

30

Page 32: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

y 1 del PORTB del PIC. Partiendo de este estado inicial, pueden pasar 2 cosas: que llegue una petición de audio por parte del jugador A o del B. Dependiendo de cuál de estas dos condiciones se cumpla, el sistema pasará al estado S1 o al S3, respectivamente. En estos dos estados, sólo uno de los dos contadores de 13 bits implementados en la FPGA contará, ya sea el contador A (S1) o el contador B (S3). Estando en uno de estos dos estados también pueden pasar 2 cosas: que se termine de reproducir el mensaje por el auricular A (cuando el contador de 13 bits A vuelve a 0 – AND_CNT_A=1-), por el auricular B (cuando el contador de 13 bits B vuelve a 0 – AND_CNT_B=1-), o que llegue una nueva petición de audio. En cualquiera de las dos primeras circunstancias el sistema volvería al estado de reposo S0. Si llega una nueva petición de audio por parte del jugador A, y ya se está reproduciendo un mensaje por el auricular de este jugador, la petición es ignorada. Lo mismo pasaría con el jugador B. Pero si se está reproduciendo un mensaje por uno de los dos auriculares, y la nueva petición corresponde al otro auricular, entonces pararíamos al estado S2 o S4. En estos dos estados tanto el contador A como el contador B están contando, permitiendo de esta forma que se escuchen dos mensajes diferentes a la vez, uno por cada auricular. Si estamos en el estado S2 significa que venimos del estado S1 o S6 en los que sólo cuenta el contador A. Por tanto, como el contador B ha empezado la cuenta más tarde, tendrá que terminar de contar primero el A, pasando al estado S3 cuando esto suceda. Análogamente, pasa lo mismo con el estado S4.

La Tabla 2 contiene las salidas de la etapa Control del Módulo de audio, dependiendo del estado en el que se encuentra. RST_CNT_A y RST_CNT_B son dos señales que van al contador A y al contador B respectivamente y que si están a 1 mantienen el contador a 0, mientras que si están a 0 el contador incrementa una cuenta a cada pulso de reloj. La señal !DACENABLE sirve para deshabilitar el DAC cuando el Módulo de Audio no está reproduciendo ningún mensaje.

SALIDAS

Estado

RST_CNT_A

RST_CNT_B

DACENABLE

S0 1 1 1

S1 0 1 0

S2 0 0 0

S3 1 0 0

S4 1 0 0

S5 0 0 0

S6 0 1 0

Tabla 2. Salidas de la Etapa Control del Módulo de Audio en cada Estado

31

Page 33: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

A parte de la etapa de Control del Módulo de audio, hay 5 etapas más implementadas en la FPGA: Contador13A y Contador13B, Cnt_a_o_b, Latch_pic y Latch_a_o_b (véase Anexo A). Las dos primeras son los dos contadores de 13 bits, uno para el auricular A y el otro para el B. Estos 13 bits junto con los 6 bits de selección de un mensaje que vienen del PORTA del PIC, sirven para recorrer las 8192 posiciones de memoria que ocupa un mensaje de 1’1 s. La etapa Latch_pic es donde se guardan los 6 bits que manda el PIC para seleccionar un mensaje. Ésta etapa tiene implementados 2 latches, uno para guardar la dirección de un mensaje que va a ser mandado por el auricular A y otro por el B. Para poder reproducir dos mensajes a la vez, se han implementado las etapas Cnt_a_o_b y Latch_a_o_b. En la figura 16 se pueden ver las salidas de estas dos etapas: EPROM[12..0] y EPROM[18..13] respectivamente.

Figura 16. Simulación de las entradas/salidas de la FPGA

Cuando se está realizando una reproducción simultánea por los dos auriculares, los bits que manda la FPGA al bus de direcciones de la EPROM se van alternando sincronizados con la señal de reloj. Cuando la señal CLK está a nivel bajo, la etapa Latch_a_o_b pone en su salida los bits correspondientes a la dirección del mensaje que hay que reproducir por el auricular A. Al mismo tiempo, la etapa Cnt_a_o_b pone en su salida la cuenta que lleva de dicho mensaje. Análogamente, cuando la señal CLK está a nivel alto, las etapas Cnt_a_o_b y Latch_a_o_b ponen en su salida la dirección del byte que toca mandar al DAC para reproducir un mensaje por el auricular B.

1.7.3.2 El Conversor D/A

Para realizar la conversión de audio de formato digital a analógico utilizamos el conversor TLC7528. Éste conversor de 8 bits tiene 2 canales (véase Anexo), así que utilizaremos uno para cada salida analógica. También tiene dos latches internos para guardar un byte para cada canal, y cuenta con una entrada (!DACA/DACB) que nos permite seleccionar por cuál de los dos canales se realizará la conversión. Ésta entrada la conectaremos a una señal de reloj de 8 kHz implementada mediante el

32

Page 34: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

integrado 555, que será la misma señal CLK de la FPGA. En sus 8 entradas digitales (DB[0..7]) conectaremos el bus de datos de la EPROM. De esta forma, cuando la señal de reloj esté a nivel bajo, estaremos seleccionando el canal A del TLC7528, y el byte que tengan sus entradas digitales será convertido a un nivel de tensión analógico.

Figura 17. Etapa de conversión D/A

En la figura 17 podemos ver el esquema de esta etapa de conversión D/A. Se ha utilizado una configuración recomendada por el fabricante del integrado para realizar la conversión con una fuente asimétrica. Las tensiones de referencia de cada canal entran por las patas OUT-A y OUT-B. Esta tensión de referencia viene de un divisor de tensión entre Vcc y Gnd. Como los dos resistores son de 1 kΩ y Vcc = 5V, tenemos una tensión de referencia de 2’5 V. Así pues, la señal analógica de salida (que saldrá por las patas VREF-A y VREF-B) estará comprendida entre 0 V y 2’5 V. Por las patas !WR y !CS entra la señal ENABLE_DAC. Ésta viene de la FPGA y sirve para habilitar el conversor sólo cuando se esté reproduciendo un mensaje.

1.7.3.3 La Señal de Reloj

Para implementar la señal de reloj de 8 kHz, necesaria para realizar la conversión D/A, hemos utilizado el chip LM555. Este integrado permite generar un pulso o una señal periódica, dependiendo de la configuración de sus componentes externos. En nuestro caso hemos implementado la configuración de la figura 18. La ecuación de diseño para la frecuencia de la señal de salida es la siguiente:

33

Page 35: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

( )CRRf

·2144'1

+= (8)

El diodo que está en paralelo con R2 sirve para que la señal de salida de este circuito tenga un “duty-cycle” del 50%.

Figura 18. Circuito para implementar la señal de reloj

El condensador C se carga sólo a través de R1 (el diodo cortocircuita la resistencia ya que la corriente es en sentido de Vcc a Gnd) y se vacía a través de R2. Los tiempos en los que la señal de salida está a nivel alto y bajo son los siguientes:

- Tiempo a nivel alto = 0’69· (R1·C)

- Tiempo a nivel bajo =0’69· (R2·C)

En nuestro caso los valores de los componentes son:

- R1 = 90 kΩ

- R2 = 90 kΩ

- C = 1 nF.

Si substituimos estos valores en (8) obtenemos la frecuencia de nuestra señal

de reloj: ( ) =Ω+Ω

=nF

f1·k 90k 90

44'1 8000 Hz.

34

Page 36: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.7.3.4 Etapa de Acondicionamiento de la Señal Acústica

Después de la conversión del código binario se ha colocado un filtro paso banda para eliminar las frecuencias que no nos interesa escuchar porque introducen ruido. La banda de paso de este filtro está entre los 20 Hz y los 3000 Hz. Se ha colocado uno a la salida de cada canal del DAC. La banda de paso ha sido escogida partiendo de la base que los mensajes de voz son inteligibles en el rango de frecuencias aproximado de 20 Hz a unos 3300 Hz. Se ha procedido a la calibración del filtro mediante métodos empíricos, ya que los datos anteriores son solamente estadísticos.

Figura 19. Filtro paso banda de segundo orden Sallen-Key

Para el diseño de este filtro, hay que tener en cuenta que se trata de un sistema con alimentación a pilas. Esto significa que dispondremos de una tensión de alimentación de los operacionales asimétrica. Por esta razón se ha escogido el integrado LM324 para implementarlo, ya que dispone de una entrada para +Vcc y otra para GND.

En la figura 19 podemos ver el esquema de uno de los dos filtros paso banda que tiene el circuito. Se trata de dos filtros de Sallen-Key de segundo orden, uno de paso alto y otro de paso bajo, conectados en cascada.

Para la selección de los componentes se ha seguido el siguiente procedimiento:

o Para el filtro paso alto:

- Hemos escogido C6 = C4 = 100 nF

35

Page 37: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

- R5 ==FC ·6··2

75 (Con una Frecuencia de corte F =

30 Hz)

Ωk

- R8//R9 =FC ·6··2·2

= 37’5 k . Ω

o Para el filtro paso bajo:

- Hemos escogido C7 = 4’7 nF

- C2//C7 = 2·C3 = 9’4 nF

- R1 = R2 ==FC ·7··2·2

8’2 (Con una Frecuencia de

corte F = 3000 Hz).

Ωk

o Los condensadores C5 y C1 son para quitar los niveles de continua que tiene la señal de salida del filtro paso alto y la que introduce el paso bajo respectivamente. Se han escogido aproximadamente 500 veces mayores que C7.

También se han incluido condensadores entre las patas Vcc y Gnd de los integrados para desacoplamiento de parásitos.

1.7.3.5 Etapa de Potencia

Para acabar, sólo nos queda amplificar la señal acústica para poderla oír por el auricular. Para este fin se ha escogido el integrado LM386, que es un chip de baja potencia diseñado para ser utilizado en aplicaciones de bajo consumo. Esta característica lo hace ideal para nuestra aplicación, ya que se trata de un sistema portátil alimentado a pilas. Este amplificador tiene asignada una ganancia interna de 20 dB con el fin de utilizar el mínimo número posible de componentes externos, aunque añadiendo una resistencia entre las patas 8 y 1 se obtiene fácilmente una ganancia de 200 dB. En la entrada pondremos un condensador para filtrar la tensión continua y también pondremos un potenciómetro para regular la tensión de entrada al integrado (divisor de tensión) y de esta forma el volumen de salida del auricular. En la figura 18 se muestra la configuración escogida para esta etapa. Es la configuración con los mínimos componentes externos que aconseja el fabricante (ganancia de 20 dB).

36

Page 38: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

Figura 20. Etapa de potencia

37

Page 39: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.8 Descripción del Software. Diagramas de Flujo En éste apartado se mostrarán las diferentes subrutinas que forman el

programa, acompañadas de una breve explicación que facilitará su comprensión.

Podemos dividir el programa en dos grandes partes: control del tiempo restante para cada jugador y reproducción de un mensaje de audio. Éstas dos partes están construidas a partir de una serie de subrutinas, algunas de las cuáles se muestran a continuación:

1. Inicialización del sistema (INICIALIZAR).

2. Programa principal (PRINCIPAL, INICIO, PARTIDA, CMP_SET).

3. Subrutina de atención a la interrupción (ISR).

4. Subrutina para disminuir un segundo (CADASECA, CADASECB).

5. Subrutina para actualizar las variables que mandamos al display (ACTCARA, ACTCARB).

6. Subrutina para poner un determinado modo de partida (SETCUENTA, SETMANUAL).

7. Subrutinas para esperar a que cambie el conmutador de partida (ESPERAJUGA, ESPERAJUGB).

8. Subrutina para escribir en la EPROOM del PIC el modo de partida actual (GUARDAREE).

9. Subrutinas para reproducir el tiempo restante de un jugador (TIEMPOA_A, REP_HORAAA, REP_MINAA, REP_SECAA, ENVIAR_A, SEGREPA).

10. Otras subrutinas.

En los siguientes apartados se muestra el diagrama de flujo de estas subrutinas, con una pequeña explicación de lo que hace cada una de sus partes. 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, excepto las que se han creído necesarias.

Hay que remarcar que en la memoria de cálculo se facilita el listado del programa en código ensamblador, y que al lado de cada instrucción encontraremos un comentario aclaratorio de la función que realiza.

38

Page 40: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de
Page 41: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.8.1 Programa Principal

El programa principal está dividido en 4 subrutinas: principal, inicio, partida y cmp_set. La subrutina principal simplemente llama a inicio. Cada vez que se inicie una nueva partida sin apagar el aparato volveremos a esta subrutina, donde se inicializan ciertas variables utilizadas en el programa y donde se espera a que se cambie el conmutador de jugador activo para empezar la partida. Cuando sucede esto se llama a la subrutina partida. Durante el transcurso de toda una partida el programa se mantendrá en ésta subrutina, controlando si ha cambiado el conmutador y si se ha pulsado algún botón de petición de tiempo o si se han pulsado los botones set y mode a la vez para empezar una nueva partida. En esta subrutina se comprueba si estamos en modo Fischer, y en tal caso cada vez que un jugador para su reloj se aumentan dos segundos al reloj de éste.

También se controla desde principal si hay que continuar la reproducción de algún mensaje. Los mensajes que emite el aparato pueden ser de dos o de tres palabras. Si quedan 2 horas justas el mensaje será “dos horas”, mientras que si quedan 2 horas y 30 minutos el mensaje será “dos horas treinta”. Lo mismo sucede con los minutos; puede ser un mensaje sólo de minutos o de minutos y segundos. Cuando sólo queden segundos el mensaje sólo será de dos palabras (por ejemplo “veinte segundos”). Todas las palabras que se han grabado en la EPROM son de 1’024 s. Cuando hay una petición del tiempo restante, la interrupción producida por el TIMER0 empieza a llevar la cuenta del tiempo transcurrido desde que empezó la reproducción de la primera palabra y avisa al programa principal mediante las banderas reproA, ftmpA, reproB y ftmpB cuando ya ha transcurrido este tiempo.

Cmp_set es una subrutina que está dentro de principal y que hace las comprobaciones explicadas anteriormente.

En las páginas que siguen podemos ver los diagramas de flujo de éstas subrutinas.

40

Page 42: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

INICIO

PUESTA A 0 DE VARIABLES DECONTROL DE PARTIDA Y DEREPRODUCCIÓN DE AUDIO

INICIALIZAMOS LOS CONTADORESPARA CALCULAR 1 SEGUNDO (TICSA, TICSB = 244; TICSA1, TICSB1 = 4)

INICILIZAMOS LOS CONTADORES PARACALCULAR 1'1 SEGUNDOS DE REPRODUCCIÓN DE

UN MENSAJE (CNTMPA, CNTMPB = 179;CNTMPA1, CNTMPB1 = 6)

CONMUTADOREN POSICIÓN A?

MODO SET?

SUB. COGEREE

SUB. ESPERAJUGB

SUB. ESPERAJUGA

SUB. SETCUENTA

CONMUTADOREN A?

CONMUTADOREN B?

CORRE EL RELOJ DE B(JUEGAB = 1, AUXB = 1,

AUXA = 0)

INICIALIZAMOSEL TIMER(TMR0 = 0)

CORRE EL RELOJ DE A(JUEGAA = 1, AUXA = 1,

AUXB = 0)

INICIALIZAMOSEL TIMER(TMR0 = 0)

SUB. CMP_SET

NO

SI

NO NO NO

SI SI SI

41

Page 43: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

PARTIDA

CONMUTADOREN B?

CORRE RELOJ DEA

(JUEGAA = 1)

PARA RELOJ DEB

(JUEGAB = 0)

MODOFISCHER?

CORRIA ELRELOJ DEL

JUGADOR B?

AUMENTA 2SEGUNDOSAL RELOJ B

SUB. ACTCARB

AUXFLAGB2 = 2?

QUITO LABANDERA DEL

JUGADOR B(AUXFLAGB = 0,AUXFLAGB2 = 0)

AUXFLAGB= 0?

CORRIA ELRELOJ DEL

JUGADOR B?

AUXFLAGB2 =AUXFLAGB2 + 1

AUXB = 0

AUXA = 1

SUB. CMP_SET

NO

NO NO NO

SI SI

SI

NO

SI

SI

SI

NO

(Continua en la página siguiente)

42

Page 44: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

CONMUTADOREN A?

CORRE RELOJ DE B(JUEGA B = 1)

PARA RELOJ DE A(JUEGA A = 0)

MODOFISCHER?

CORRIA ELRELOJ DEL

JUGADOR A?

AUMENTA 2SEGUNDOSAL RELOJ A

SUB. ACTCARA

QUITO LABANDERA DEL

JUGADOR A(AUXFLAGA = 0,AUXFLAGA2 = 0)

AUXFLAGA= 0?

CORRIA ELRELOJ DEL

JUGADOR A?

AUXFLAGA2 =AUXFLAGA2 + 1

AUXA = 0

AUXB = 1

SUB. CMP_SET

AUXFLAGA2= 2?

SUB. CMP_SETNO

SI

SI

SI

NO NO NO

SI

NO

SI

SI

NO

NO(Continua de lapágina anterior)

43

Page 45: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

44

CMP_SET

PULSADOALGÚNBOTÓN?

MODE Y SETPULSADOS A LAVEZ DURANTE 1

SEGUNDO?

BOTÓN SETPULSADO?

BOTÓNMODE

PULSADO?

BOTÓNDOWN

PULSADO?

BOTÓN UPPULSADO?

SUB. P ART IDA

PARAMOS LOS 2RELOJES

JUEGAA = 0JUEGAB = 0

SUB. INICIO

SUB. TIEMPOB_A

SUB. ESPERAMODE

SUB. TIEMPOA_B

SUB. ESPERAUP

CONMUTADOREN A?

CONMUTADOREN B?

FTMPA > 0?

FTMPB > 0?

PARAMOSRELOJES

JUEGAA = 0JUEGAB = 0

REPROA= 0?

SUB. SEGREPA

REPROB =0?

SUB. SEGREPB

SI

SI

SI

SUT. TIEMPA_A

SUB. TIEMPOB_B

SUB. ESPERADOWN

SI

NO

NO

NO

NO

NO

NO

SI

SI

NO NO

SISI

SI NO

NO SI

SI NO

SINO

MODO REPRO.AUTOMÁTICA

PARA A?

MODO REPRO.AUTOMÁTICA

PARA B?

PORTA = SECA-2

PORTA = SECB-2

SI

SI

NO

NO

Page 46: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.8.2 Subrutina de Atención a la Interrupción (ISR).

El control del tiempo restante se lleva a cabo a través de la interrupción que produce el TIMER0 del PIC16F873 cuando se desborda1. Cuando sucede esto, el µC atiende a una determinada línea de programa que lo hará saltar a la subrutina de interrupción. Esta subrutina también realiza el refresco de los dígitos del display (cada vez que se ejecuta isr se actualiza un nuevo dígito) y de las variables que contienen el valor de dichos dígitos (esto sucede cada segundo – llamada a actcarA, actcarB-).

ISR

SALVAMOS EL REGISTRO DETRABAJO W Y EL DE ESTADO

INICIALIZAMOS LAS VARIABLES(CAR) DE LOS DÍGITOS 4 Y 5 DEL

DISPLAY

ESTAMOS ENMODO SET?

ACTUALIZAMOS LASVARIABLES (CAR) DE

LOS DÍGITOS 4 Y 5 DELDISPLAY

AUMENTAMOS EL CONTADORQUE LLEVA LA CUENTA DEL

DÍGITO A MANDAR AL PORTC(DIGCNT = DIGCNT +1)

TOCA MANDARCAR5 AL PORTC?

ENVIAMOS AL PORTC LAVARIABLE CAR DEL DÍGITO QUE

TOCA ACTUALIZAR

CORRE ELTIEMPO DE

A?

CORRE ELTIEMPO DE

B?

DECREMENTAMOSEL CONTADOR DE

A

CONTADORDE A = 0?

SUB.CADASECA

INIZIALIZAMOSCONTADOR DE

ADECREMENTAMOS EL CONTADOR

DE B

CONTADORDE B = 0?

SUB.CADASECB

ENVIAMOSCAR5 ALPORTC

INIZIALIZAMOSCONTADOR DE

B

SI

NO

NO

NO

NO

SI

SI

SI

SI

SI

NO

NO

45

1 Nota: véase el apartado 1.7.1.1 El Timer.

Page 47: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

SE ESTÁ REPRODUCIENDOUN MENSAJE POR EL

AURICULAR A?(REPROA = 1?)

DECREMENTAR CONTADOR PARA CALCULAR 1'1 s.(CNTMPA --)

HA PASADO YA1'1 s.?

(CNTMPA=0?)

ESTÁBAMOSREPRODUCIENDO LAPRIMERA PALABRA?

(FTMPA= 3?)

ESTÁBAMOSREPRODUCIENDO LASEGUNDA PALABRA?

(FTMPA= 2?)

ESTÁBAMOSREPRODUCIENDO LATERCERA PALABRA?

(FTMPA= 1?)

INDICAMOS QUE TOCA ENVIAR LA SEGUNDAPALABRA

(FTMPA= 2)

INDICAMOS QUE TOCA ENVIAR LA TERCERAPALABRA

(FTMPA= 1)

INDICAMOS QUE HA TERMINADO EL MENSAJE(FTMPA= 0)

INDICAMOS QUE SE HA TERMINADO LAREPRODUCCIÓN POR EL ALTAVOZ A.

(REPROA = 0)

INICIAMOS EL CONTADOR DE A Y SUAUXILIAR.

(CNTMPA = 179, CNTMPA1 =3)

REALIZAMOS LA MISMA COMPROBACIÓN PARA ELAURICULAR DE B

RESTAURAMOS EL REGISTRO DE TRABAJO W Y EL DEESTADO

RETURN

SI

NO

SI

SI SI SI

NO

NO NO NO

Ésta rutina también lleva la cuenta del tiempo que ha pasado desde que se empezó la reproducción de la última palabra, y controla cuántas palabras quedan para reproducir el mensaje completo.

46

Page 48: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.8.3 Subrutina para Disminuir un Segundo

Las dos subrutinas siguientes son llamadas desde isr cada segundo que pasa para el reloj del jugador A y del B respectivamente.

D

CADASECA

FINA = 1?SI

ECREMENTA 1 SEGUNDOAL RELOJ DE A

SUB. ACTCARA

RELOJ DE A = 0?

HA PASADO YA ELCONTROL? (CAIDA

BANDERA)FLAGA = 1?

XTRTMPA = 1?

FLAGA = 1

AUXFLAGA = 1

XTRTMPA = 0

VOLCAMOSVARIABLES DE

FINISH ENVARIABLES

DEL RELOJ A

RETURN

NO

SI

NO

NO

FINA = 1SI

NO

SI

QUEDAMENOS DE 1MINUTO ?

SI

NO

PONEMOS MODO DEREPRODUCCIÓN

AUTOMÁTICA PARA A(AUTO = 1)

47

Page 49: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

48

CADASECB

FINB = 1?SI

DECREMENTA 1 SEGUNDOAL RELOJ DE B

SUB. ACTARB

RELOJ DE B = 0?

HA PASADO YA ELCONTROL? (CAIDA

BANDERA)FLAGB= 1?

XTRTMPB = 1?

FLAGB = 1

AUXFLAGB = 1

XTRTMPB = 0

VOLCAMOSVARIABLES DE

FINISH ENVARIABLES

DEL RELOJ B

RETURN

NO

SI

NO

NO

FINB = 1SI

NO

QUEDAMENOS DE 1

MINUT O ?

NO

SI

SI

PONEMOS MODO DEREPRODUCCIÓN

AUTOMÁTICA PARA B(AUTO = 3)

Page 50: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.8.4 Subrutina para Actualizar las Variables que Mandamos al Display

Las dos subrutinas siguientes se llaman en diversos puntos del programa, y sirven para actualizar las variables que mandaremos al PORTC del PIC (para imprimir un dígito en el display) con los valores de las horas, minutos y segundos que hay que representar.

ACTCARA

HORAA = 0?

DECENAS DEMINUTO = 0?

(MINDEA = 0?)

ACTUALIZAR DÍGITOS DELDISPLAY CON UNIDADES DE

MINUTO, DECENAS DESEGUNDO Y UNIDADES DE

SEGUNDO.CAR1 = MINUNACAR2 = SECDEACAR3 = SECUNA

ACTUALIZAR DÍGITOS DELDISPLAY CON LA HORA Y

LAS DECENAS Y UNIDADESDE MINUTO.

CAR1 = HORAACAR2 = MINDEACAR3 = MINUNA

NO

NO

SI

SI

RETURN

49

Page 51: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

ACTCARB

HORAB = 0?

DECENAS DEMINUTO = 0?

(MINDEB = 0?)

ACTUALIZAR DÍGITOS DELDISPLAY CON UNIDADES DE

MINUTO, DECENAS DESEGUNDO Y UNIDADES DE

SEGUNDO.CAR6 = MINUNBCAR7 = SECDEBCAR8 = SECUNB

ACTUALIZAN DÍGITOS DELDISPLAY CON LA HORA Y

LAS DECENAS Y UNIDADESDE MINUTO.

CAR6 = HORABCAR7 = MINDEBCAR8 = MINUNB

NO

NO

SI

SI

RETURN

50

Page 52: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.8.5 Subrutina para Poner un Determinado Modo de Partida

Las dos siguientes subrutinas son llamadas desde el programa principal cuando se deja pulsado un segundo el botón set . La subrutina setcuenta presenta por pantalla un modo de partida diferente cada vez que se aprieta el botón mode. Si volvemos a presionar un segundo el botón set, el aparato queda preparado para empezar una partida con la nueva configuración de tiempo.

Setmanual es llamada cuando, estando en el modo de selección de nueva partida, y apretando el botón mode llegamos a la posición 72 de la EEPROM del PIC. En esta posición está guardada la configuración de la nueva partida que ha sido puesta manualmente por un usuario. Setmanual se encarga de gestionar la nueva configuración manual de la partida.

SETCUENTA

OFFSEET =POSICIÓN 72 DE LAEEPROM DEL PIC?

BOTÓN MODEPULSADO?

BOTÓN SETPULSADO 1SEGUNDO?

GUARDAMOS EL OFFSET ENLA POSICIÓN 0 DE LA EEPROM

DEL PIC. (SUB. ESCRIBIREE)

SUB. INICIO

SUB. SETMANUAL

SUB. ESPERAMODE

OFFSET = OFFSET + 12

OFFSET =POSICIÓN 72 DE LAEEPROM DEL PIC?

SUB. SETMANUAL

SUB. COGEREE

SI

SI

NO

SI

NO

SI

NO

NO

51

Page 53: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

SET MANUAL

SUB. COGEREE

CARGAMOS EL TIEMPODE FINISH EN LAS

VARIABLES DEL RELOJ B

SUB. ACTCARA

SUB. ACT CARB

INICIALIZAMOS VARIABLESAUXILIARES

(M = 0, SEC = 0, AUXFLAGA = 1,AUXFLAGB = 0)

BOT ÓN UPP ULSADO?

SEC = 0

BOTÓN MODEPULSADO?

BOTÓN SETPULSADO?

SUB. GUARDAREE

SUB. COGEREE

AUXFLAGA = 0AUXFLAGB = 0

SUB.GUARDAREE

OFFSET = 0

SUB. COGEREE

AUXFLAGA = 0AUXFLAGB = 0

SUB. ESP ERAMODE

RETURN

M = 0?AUMENT AMOS 1MINUT O AL RELOJ B

AUMENT AMOS 1 MINUT OAL RELOJ A

RELOJ B = 0

SUB. ACT CARB

BOT ÓN DOW NP ULSADO?

RELOJ A = 0

SUB. ACT CARA

SUB. ESP ERADOW N

SUB. ESP ERAUP

BOT ÓN DOW NP ULSADO?

SUB. ESP ERADOW N

M = 0?

M = 1

AUXFLAGB = 1AUXFLAGA = 0

M = 0

AUXFLAGB = 0AUXFLAGA = 1

BOT ÓNDOW N

P ULSADO

NO

NO

NO

NO

SI

SI

SI

NO

SI

SI

NO

SI

NO

SI

NO

SI

52

Page 54: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.8.6 Subrutinas para Esperar a que Cambie el Conmutador de Partida

Éstas dos subrutinas sólo se ejecutan al inicio de una nueva partida. Su función es esperar a que se pulse el botón set durante un segundo para poner un nuevo tiempo de partida, o que se cambie la posición del conmutador de partida para empezar a disminuir el tiempo de uno de los dos relojes.

ESPERAJUGA

SUB. CMPSET

SETMODE = 1?

CONMUTADOREN POSICIÓN

A?

SUB. TMP20(ESPERAMOS 20 ms)

CONMUTADOREN POSICIÓN

A?

RETURN

SI

NO

NO

NO

SI

SI

53

Page 55: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

ESPERAJUGB

SUB. CMPSET

SETMODE =1

CONMUTADOREN POSICIÓN

B?

SUB. TMP20(ESPERAMOS 20 ms)

CONMUTADOREN POSICIÓN

B?

RETURN

SI

NO

NO

NO

SI

SI

54

Page 56: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.8.7 Subrutina para Escribir en la EPROOM del PIC la Configuración de Partida Actual

GUARDAREE

VARIABLESRELOJ B = 0?

XTRTMP = 0

VARIABLESRELOJ A =

XTRTMP = 0?

GUARDAMOS VARIABLESRELOJ A EN EEPROM DEL

PIC (TIEMPO DE CONTROL)

GUARDAMOSXTRTMP = 1 EN

EEPROM DEL PIC

GUARDAMOS VARIABLESRELOJ B EN EEPROM DELPIC (TIEMPO DE FINISH)

RETURN

GUARDAMOS TIEMPO DEFINISH = 0 EN LA EEPROM

DEL PIC

GUARDAMOSXTRTMP = 0 ENEEPROM DEL PIC

XTRTMP = 1

XTRTMP =0?

GUARDAMOSVARIABLES RELOJ B EN

EEPROM DEL PIC(TIEMPO DE CONTROL)

OFFSET = 0

TODAS LAS VARIABLES =0

(RELOJ A, RELOJ B,XTRTMP)

SI

NO

NO

SI

NO

SI SI

NO

Esta subrutina se llama desde setmanual y su función es poner los valores del tiempo restante de la nueva configuración de partida a partir de la posición 72 de la EPROM del PIC.

0?

55

Page 57: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.8.8 Subrutinas para Reproducir el Tiempo Restante de un Jugador

Las subrutinas que se muestran a continuación se encargan de gestionar la reproducción de un mensaje por el auricular del jugador A.

TiempoA_A se ejecuta cuando el jugador A hace una petición para saber cuanto tiempo le queda. También existe la subrutina tiempoB_A, que mandaría por el auricular del jugador A el tiempo que le queda al jugador B.

Rep_horaAA prepara las variables msg1A, msg2A y msg3A, para mandar un mensaje del tipo “una hora trece” por el auricular A. Rep_minAA hace lo mismo pero para mandar un mensaje del tipo “dos minutos quince”, y rep_secAA las prepara para mandar un mensaje de sólo segundos (“cinco segundos”).

SegrepA continua la reproducción del mensaje en curso por el auricular A mandando la dirección de la siguiente palabra a reproducir por el auricular A.

No se han incluido los diagramas de flujo de las subrutinas que gestión los mensajes del jugador B porque son análogas a las del A.

56

Page 58: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

TIEMPOA_A

SE HA TERMINADO LAREPRODUCCIÓN POR EL

AURICULAR A?(FTMPA = 0?)

HORAS DELRELOJ A = 0?(HORAA = 0?)

SUB. CALC_MINA

MINUTOS DELRELOJ A = 0?(MINA = 0?)

SUB. CALC_SECA

SEGUNDOS DELRELOJ A = 0?(SECA = 0?)

NO SE REPRODUCEAUDIO

SUB. ESPERADOWN

SUB. REP_SECAA

RETURN

SUB. REP_HORAAA

SUB. REP_MINAA

NO

SI

NO

SI

NO

SI

NO

SI

Estamos en modo dereproducciónautomática?

SI

NO

57

Page 59: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de
Page 60: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

REP_MINAA

CARGAMOS LA PRIMERAVARIABLE QUE MANDAREMOS AL

PORTA CON LA DIRECCIÓN DELMENSAJE. (MSG1A = MINA - 1)

CARGAMOS SEGUNDAVARIABLE. (MSGA2A = 0x3C)

SUB. CALC_SECA

SECA = 0?

CARGAMOS TERCERAVARIABLE (MSG3A = SECA - 1)

MENSAJE DE TRES PALABRASFTMPA =A3

EMPIEZA REPRODUCCIÓN DELMENSAJE POR EL AURICULAR A

(REPROA = 1)

SUB. ENVIARA

RETURN

MENSAJE DE DOSPALABRAS(FTMPA = 2)

CARGAMOS TERCERAVARIABLE (MSG3A =

0x3C)

SI

NO

59

Page 61: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de
Page 62: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

ENVIARA

ENVIAMOS LADIRECCIÓN DEL PRIMER

MENSAJE AL PORTA.(PORTA = MSAG1A)

SUB. TMP500

PORTB [0] = 1

SUB. TMP500

PORTB [0] = 0

SUB. TMP500

RETURN

61

Page 63: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

SEGREPA

INDICAMOS QUE ESTAMOSREPRODUCIENDO UN

MENSAJE POR ELAURICULAR A.(REPROA = 1)

FTMPA = 2?(TOCA REPRODUCIR

EL SEGUNDOMENSAJE?)

ENVIAMOS AL PORTA ELÚLTIMO MENSAJE. (PORTA =

MSG3A)

ENVIAMOS AL PORTAEL SEGUNDO MENSAJE.

(PORTA = MSG2A)

SUB. TMP500

PORTB [0] = 1

SUB. TMP500

PORTB [0] = 0

SUB. TMP500

RETURN

SI

NO

62

Page 64: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

1.8.1 Otras Subrutinas

Existen en el programa una serie de subrutinas de las cuales no es necesario mostrar su diagrama de flujo ya que es fácilmente deducible su función a partir del listado del programa. Entre ellas hay subrutinas que sirven para comprobar si se ha presionado algún botón, para filtrar posibles rebotes en la pulsación de éstos, para calcular los minutos o segundos que quedan para cada uno de los jugadores, etc.

A continuación se muestra un ejemplo de dos de ellas. Cmpset sirve para comprobar si se ha pulsado el botón set durante un segundo y calc_minA sirve para calcular los minutos que quedan para el jugador A.

CMPSET

BOTÓN SETPULSADO?

SUB. TMPSEC(ESPERAMOS 1 SEGUNDO)

BOTÓN SETPULSADO?

SETMODE = 1?(ESTAMOS ENMODO SET ?)

SETMODE = 0(QUITAMOS EL MODO SET)

SETMODE = 1(PONEMOS MODO SET)

SUB. ESPERASET

RETURN

SI

SI

SI

NO

NO

NO

63

Page 65: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Memoria descriptiva.

CALC_MINA

MINA = 0

MINDEA = MINDEA x 10

MINA = MINUNA + MINA

MINA = MINA + 1

RETURN

64

Page 66: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

2. MEMORIA DE CÁLCULO.

65

Page 67: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

2.1 Listado del Programa en Código Ensamblador ;-------------------------------------------------------------------------; ; RELOJ DE AJEDREZ PARA CIEGOS. ; ; ------------------------------ ; ; Enero '02 Carlos Massa Amado ([email protected]) ; ; ; ; ; ;-------------------------------------------------------------------------; LIST P=16F873 #INCLUDE "p16f873.inc" __config H'3D39' ; bits de configuración del PIC: ; oscilador XT, deshabilitamos Watchdog timer, ; brown out reset, low voltage programming, ; flash program memory write y code protect off. ;-------------------------------------------------------------------------; ; Definición de variables ; ;-------------------------------------------------------------------------; ;------------------------ Referentes al Jugador A ------------------------; horaA EQU H'20' ; en estas variables guardaremos el tiempo mindeA EQU H'21' ; que queda para el jugador A minunA EQU H'22' secdeA EQU H'23' secunA EQU H'24' ehoraA EQU H'25' ; estas variables son para guardar el tiempo emindeA EQU H'26' ; de Finish, mientras no ha caído la bandera eminunA EQU H'27' esecdeA EQU H'28' esecunA EQU H'29' juegaA EQU H'2A' ; nos indica si está jugando el jugador A flagA EQU H'2B' ; nos indica si ha caído la bandera de A finA EQU H'2C' ; nos indica si ha terminado el tiempo de A ticsA EQU H'2D' ; contador para calcular el tiempo que pasa ticsA1 EQU H'2E' ; y una variable auxiliar para este cálculo auxA EQU H'2F' ; para el modo Fischer xtrtmpA EQU H'30' ; nos indica si es partida a Finish o Control + Finish ;------------------------ Referentes al Jugador B ------------------------; horaB EQU H'31' ; en estas variables guardaremos el tiempo mindeB EQU H'32' ; que queda para el jugador B minunB EQU H'33' secdeB EQU H'34' secunB EQU H'35' ehoraB EQU H'36' ; estas variables son para guardar el tiempo emindeB EQU H'37' ; que queda después de la caída de bandera eminunB EQU H'38' esecdeB EQU H'39'

66

Page 68: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

esecunB EQU H'3A' juegaB EQU H'3B' ; nos indica si está jugando el jugador B flagB EQU H'3C' ; nos indica si ha caído la bandera de B finB EQU H'3D' ; nos indica si ha terminado el tiempo de B ticsB EQU H'3E' ; contador para calcular el tiempo que pasa ticsB1 EQU H'3F' ; y una variable auxiliar para este cálculo auxB EQU H'40' ; para el modo Fischer xtrtmpB EQU H'41' ; nos indica si es partida a Finish o Control + Finish ;------------------ Referentes al Módulo del Display ---------------------; car1 EQU H'42' ; en estas variables guardamos el valor car2 EQU H'43' ; que vamos a mandar por el puerto C, car3 EQU H'44' ; a la eprom (byte alto) y a los decodificador car4 EQU H'45' ; (byte bajo), para activar sólo uno de car5 EQU H'46' ; los 8 displays de siete segmentos con car6 EQU H'47' ; su valor correspondiente car7 EQU H'48' car8 EQU H'49' ;--------------------------- Variables globales --------------------------; setmode EQU H'4A' ; indica si estamos en el modo set (poner cuenta inicial) digcnt EQU H'4B' ; contador para el multiplexado del display r1 EQU H'4C' ; utilizada para calcular tiempo en milisegundos r2 EQU H'4D' ; idem w_temp EQU H'4E' ; var para el registro W (Working register -acumulador-) w_temp1 EQU H'CE' ; definida en el banco 1 también (requisito del PIC16F873) status_temp EQU H'4F' ; variable temporal para guardar el registro de estado sec EQU H'50' ; para calcular un segundo offset EQU H'51' ; offset de la EEPROM. Relojes como la última partida m EQU H'52' ; auxiliar nsecmov EQU H'53' ; nos indica si es partida tipo Fischer o no. auxflagA EQU H'54' ; variables auxiliares auxflagB EQU H'55' auxflagA2 EQU H'56' auxflagB2 EQU H'57' aux EQU H'58' aux1 EQU H'59' aux2 EQU H'5A' ;--------------------- Referentes al Módulo de Audio ---------------------; ftmpA EQU H'5B' ; flag para saber que mensage hay que enviar reproA EQU H'5C' ; = 1 -> reproduciendo audio, = 0 -> no rep. cntmpA EQU H'5D' ; contador para calcular 1'1 s cntmpA1 EQU H'5E' ; auxiliar de cntmpA minA EQU H'5F' ; valor de los minutos de A secA EQU H'60' ; valor de los segundos de A msg1A EQU H'61' ; variables para guardar la dirección de la msg2A EQU H'62' ; eprom del módulo de Audio donde se encuentran msg3A EQU H'63' ; los mensajes de audio. ftmpB EQU H'64' ; variables análogas a las del jugador A reproB EQU H'65' cntmpB EQU H'66' cntmpB1 EQU H'67' minB EQU H'68'

67

Page 69: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

secB EQU H'69' msg1B EQU H'6A' msg2B EQU H'6B' msg3B EQU H'6C' auto EQU H'6D' ; para el modo de reproducción automática auto1 EQU H'6E' ;-------------------------------------------------------------------------; ; Definición de bits utilizados ; ;-------------------------------------------------------------------------; #DEFINE b_jugA D'4' ; botón del jugador A #DEFINE b_jugB D'5' ; botón del jugador B #DEFINE b_set D'2' ; botón set #DEFINE b_mode D'3' ; botón modo #DEFINE b_up D'6' ; botón up #DEFINE b_next D'7' ; botón next ;-------------------------------------------------------------------------; ; Definición de Macros ; ;-------------------------------------------------------------------------; banco0 MACRO ; salta al banco 0 BCF STATUS,RP0 BCF STATUS,RP1 ENDM banco1 MACRO ; salta al banco 1 BSF STATUS,RP0 BCF STATUS,RP1 ENDM banco2 MACRO ; salta al banco 2 BCF STATUS,RP0 BSF STATUS,RP1 ENDM banco3 MACRO ; salta al banco 3 BSF STATUS,RP0 BSF STATUS,RP1 ENDM strobeA MACRO ; ponemos PORTB[0] = 1 CALL tmp500 ; durante 500 us BSF PORTB,0 ; y después lo volvemos a dejar BCF PORTB,1 ; a PORTB[0] = 0 CALL tmp500 BCF PORTB,0 CALL tmp500 ENDM strobeB MACRO ; ponemos PORTB[1] = 1 CALL tmp500 ; durante 500 us BCF PORTB,0 ; y después lo volvemos a dejar

68

Page 70: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

BSF PORTB,1 ; a PORTB[1] = 0 CALL tmp500 BCF PORTB,1 CALL tmp500 ENDM carga MACRO ; para cargar la variable que mandaremos MOVWF m ; al PORTA, con la dirección del mensaje DECF m ; guardado en la EPROM que queremos reproducir MOVF m,W ENDM ;-------------------------------------------------------------------------; ; Definimos la dirección de inició del programa principal ; ; i de la rutina de atención a la interrupción ; ;-------------------------------------------------------------------------; ORG 0 GOTO principal ; programa principal ORG 4 GOTO isr ; rutina de atención a la interrupción ;-------------------------------------------------------------------------; ; Rutina de Inicialización ; ; ; ; - Configuramos el PORTA y PORTC cómo todo de salidas ; ; y el PORTB[0..1] : salidas, PORTB[2..7] : entradas ; ; ; ; - Configuramos el TIMER0, con el preescaler a 1:2. ; ; ; ; - Habilitamos las resistencias de pull-up del PORTB ; ; ; ; - Inicializamos todas las variables. ; ; ; ;-------------------------------------------------------------------------; inicializar banco0 CLRF PORTA CLRF PORTB ; inicializamos los puertos CLRF PORTC ; limpiando los latches de salida banco1 ; vamos al banco 1 de memoria MOVLW H'07' ; configuramos PORTA como MOVWF ADCON1 ; I/O digital CLRF TRISA ; programamos PORTA todo salidas MOVLW H'FC' ; PORTB[0..1] salidas MOVWF TRISB ; PORTB[2..7] entradas CLRF TRISC ; PORTC todo salidas 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 BSF PORTC,7 ; hacemos un reset a la maquina de estados CALL tmp500 ; implementada en la FPGA. BCF PORTC,7

69

Page 71: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

BCF PORTB,0 ; ponemos PORTB[0..1] = 00 BCF PORTB,1 MOVLW H'A0' ; habilitamos interrupciones: MOVWF INTCON ; GIE y T0IE = 1, T0IF = 0 MOVLW H'00' ; ponemos a 0 las variables que indican: MOVWF juegaA ; que esta activo el jugador A MOVWF juegaB ; idem para el B MOVWF auxA MOVWF auxB MOVWF xtrtmpA MOVWF xtrtmpB MOVWF nsecmov MOVWF setmode ; indicamos que no estamos en modo set MOVWF aux MOVWF aux1 MOVLW H'10' ; inicializamos las variables de salida MOVWF car1 ; por el PORTC poniendo en el byte alto MOVLW H'00' ; de estas la dirección del display de MOVWF car2 ; 7-segmentos que tienen que activar. MOVLW H'30' ; esta dirección se manda al decodificador MOVWF car3 ; y este es el responsable de activar el MOVLW H'20' ; display. MOVWF car4 MOVLW H'50' ; la parte baja contiene el valor del MOVWF car5 ; carácter que se representará en el display MOVLW H'40' ; y que va a ser mandado a la eprom. MOVWF car6 MOVLW H'70' MOVWF car7 MOVLW H'60' MOVWF car8 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 ;-------------------------------------------------------------------------; ; Esta es la rutina de interrupción a la que se da ; ; servicio cada vez que el timer se desborda. ; ;-------------------------------------------------------------------------; isr MOVWF w_temp ; salvamos el registro w SWAPF STATUS,W ; y el registro de estado banco0 ; vamos al banco 0 MOVWF status_temp ; no hemos cambiado ningún flag MOVF car4,W ; reseteamos la variable car4 ANDLW H'F0' MOVWF car4 MOVF car5,W ; reseteamos la variable car5 ANDLW H'F0' MOVWF car5 BTFSC setmode,0 ; estamos en modo set? GOTO fiactcar5 ; si, continúa

70

Page 72: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

BTFSS juegaA,0 ; no, actualizamos el dígito 4 del GOTO juegaA_0 ; display, que es el que nos da BTFSS auxflagA,0 ; información sobre si juega el GOTO flagA_0 ; jugador A o no, y si ha caído MOVLW H'0E' ; su bandera o no. IORWF car4,f GOTO fiactcar4 juegaA_0 BTFSS auxflagA,0 GOTO jueg_flagA_0 MOVLW H'0C' IORWF car4,f GOTO fiactcar4 flagA_0 MOVLW H'0A' IORWF car4,f GOTO fiactcar4 jueg_flagA_0 MOVLW H'0F' IORWF car4,f fiactcar4 BTFSS juegaB,0 ; hacemos lo mismo con las GOTO juegaB_0 ; variables flagB y juegaB BTFSS auxflagB,0 ; del jugador B para el dígito 5 GOTO flagB_0 ; del display. BTFSC aux,0 GOTO cambio MOVLW H'0B' IORWF car5,f MOVLW H'04' ADDLW H'42' ; le sumamos la dirección de car1 MOVWF FSR ; y hacemos un acceso indirecto MOVF INDF,W ; a la posición resultado de la suma MOVWF PORTC MOVF car5,W ; reseteamos la variable car5 ANDLW H'F0' MOVWF car5 MOVLW H'0D' IORWF car5,f MOVLW H'04' ADDLW H'42' ; le sumamos la dirección de car1 MOVWF FSR ; y hacemos un acceso indirecto MOVF INDF,W ; a la posición resultado de la suma MOVWF PORTC BSF aux,0 GOTO fiactcar5 cambio MOVLW H'0D' IORWF car5,f MOVLW H'04' ADDLW H'42' ; le sumamos la dirección de car1 MOVWF FSR ; y hacemos un acceso indirecto MOVF INDF,W ; a la posición resultado de la suma MOVWF PORTC MOVF car5,W ; reseteamos la variable car5 ANDLW H'F0' MOVWF car5 MOVLW H'0B' IORWF car5,f MOVLW H'04' ADDLW H'42' ; le sumamos la dirección de car1 MOVWF FSR ; y hacemos un acceso indirecto MOVF INDF,W ; a la posición resultado de la suma MOVWF PORTC BCF aux,0

71

Page 73: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

GOTO fiactcar5 juegaB_0 BTFSS auxflagB,0 GOTO jueg_flagB_0 MOVLW H'0D' IORWF car5,f GOTO fiactcar5 flagB_0 MOVLW H'0B' IORWF car5,f GOTO fiactcar5 jueg_flagB_0 MOVLW H'0F' IORWF car5,f fiactcar5 BTFSS setmode,0 ; estamos en modo set? GOTO siguiente ; no, continúa MOVLW H'0E' ; si, lo indicamos IORWF car4,f MOVLW H'0E' IORWF car5,f BTFSS auxflagA,0 GOTO $+5 MOVLW H'0E' IORWF car4,f MOVLW H'0F' IORWF car5,f BTFSS auxflagB,0 GOTO $+5 MOVLW H'0E' IORWF car5,f MOVLW H'0F' IORWF car4,f siguiente INCF digcnt,f ; aumentamos el contador MOVF digcnt,W ; que nos indica el dígito a imprimir ANDLW H'07' ; desenmascaramos los 3 primeros bits BTFSS juegaB,0 GOTO $+d'11' BTFSS auxflagB,0 GOTO $+9 MOVWF aux2 MOVWF aux1 MOVLW H'04' SUBWF aux1,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+2 ; aux1 <> 3 GOTO $+6 ; aux1 = 4 MOVF aux2,W ADDLW H'42' ; le sumamos la dirección de car1 MOVWF FSR ; y hacemos un acceso indirecto MOVF INDF,W ; a la posición resultado de la suma MOVWF PORTC ; imprimimos el dígito en el display 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 cont ; si no ha llegado a 0 continua DECFSZ ticsA1

72

Page 74: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

GOTO contA CALL cadasecA ; si es 0 ejecutar cadasecA MOVLW H'F4' ; y poner ticsA al valor inicial MOVWF ticsA ; ticsA = 244 MOVLW H'04' MOVWF ticsA1 GOTO cont ; volver de la ISR quienjuega2 BTFSS juegaB,0 ; corre el reloj del jugador B? GOTO cont ; no, volver de la ISR DECFSZ ticsB,f ; si, decrementa el contador de tiempo B GOTO cont ; si no ha llegado a 0 continua DECFSZ ticsB1 GOTO contB CALL cadasecB ; si es 0 ejecutar cadasecB MOVLW H'F4' ; y poner ticsB al valor inicial MOVWF ticsB ; ticsB = 244 MOVLW H'04' MOVWF ticsB1 GOTO cont contA MOVLW H'F4' ; y poner ticsA al valor inicial MOVWF ticsA GOTO cont contB MOVLW H'F4' ; y poner ticsB al valor inicial MOVWF ticsB cont INCF ftmpA,f ; Falta algún mensaje por reproducir? DECFSZ ftmpA,f GOTO $+2 ; si (ftmpA <> 0) GOTO $+7 ; no (ftmpA = 0) BTFSS reproA,0 ; estamos reproduciendo algún mensaje ahora? GOTO $+5 ; no (reproA = 0) DECFSZ cntmpA,W ; si. Pasados 1’1 segundos? GOTO $+2 ; no han pasado aun los 1'1 segundos. (cntmpA <> 0) GOTO $+2 ; cntmpA = 0 DECF cntmpA DECFSZ cntmpA,W GOTO cont2 ; cntmpA <> 0 DECFSZ cntmpA1,f ; cntmpA = 0 GOTO rescont ; cntmpA1 <> 0 BCF reproA,0 ; Si ha pasado 1'1 segundos. (cntmpA1 = 0) MOVLW H'03' ; Toca reproducir algún mensaje más? Cuál? SUBWF ftmpA,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+8 ; ftmpA <> 3 MOVLW H'02' ; ftmpA = 3 MOVWF ftmpA MOVLW H'B3' MOVWF cntmpA MOVLW H'06' MOVWF cntmpA1 GOTO cont2 MOVLW H'02' SUBWF ftmpA,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+4 ; ftmpA <> 2 MOVLW H'01' ; ftmpA = 2 MOVWF ftmpA GOTO $-D'11'

73

Page 75: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

DECFSZ ftmpA,W GOTO cont2 ; ftmpA <> 0 MOVLW H'00' ; ftmpA = 0 MOVWF ftmpA GOTO $-D'16' rescont MOVLW H'B3' ; restauramos valor de los contadores del MOVWF cntmpA ; tiempo de reproducción de cada mensaje (1'1 s.) cont2 INCF ftmpB,f ; hacemos la misma comprobación para el altavoz B. DECFSZ ftmpB,f GOTO $+2 ; ftmpB <> 0 GOTO $+7 ; ftmpB = 0 BTFSS reproB,0 GOTO $+5 ; reproB = 0 DECFSZ cntmpB,W ; reproB = 1 GOTO $+2 ; cntmpB <> 0 GOTO $+2 ; cntmpB = 0 DECF cntmpB DECFSZ cntmpB,W GOTO restaura ; cntmpB <> 0 DECFSZ cntmpB1,f ; cntmpB = 0 GOTO rescont2 ; cntmpB1 <> 0 BCF reproB,0 ; cntmpB1 = 0 MOVLW H'03' SUBWF ftmpB,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+8 ; ftmpB <> 3 MOVLW H'02' ; ftmpB = 3 MOVWF ftmpB MOVLW H'B3' MOVWF cntmpB MOVLW H'06' MOVWF cntmpB1 GOTO restaura MOVLW H'02' SUBWF ftmpB,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+4 ; ftmpB <> 2 MOVLW H'01' ; ftmpB = 2 MOVWF ftmpB GOTO $-D'11' DECFSZ ftmpB,W GOTO restaura ; ftmpB <> 0 MOVLW H'00' ; ftmpB = 0 MOVWF ftmpB GOTO $-D'16' rescont2 MOVLW H'B3' MOVWF cntmpB restaura 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

74

Page 76: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

;-------------------------------------------------------------------------; ; Esta rutina se llama desde la ISR cada ; ; segundo que pasa para el jugador A. ; ;-------------------------------------------------------------------------; cadasecA BTFSC finA,0 ; se ha terminado el tiempo total de A? RETURN ; si, volver sin hacer nada. DECF secunA,f ; no, decremento un segundo el contador INCFSZ secunA,W ; eran las unidades de segundo = 0? GOTO $+d'19' ; no, actualizar variables salida PORTC MOVLW H'09' ; si, poner las unidades a 9 MOVWF secunA DECF secdeA,f ; y decrementar las decenas de segundo INCFSZ secdeA,W ; eran las decenas de segundo = 0? GOTO $+d'14' ; no, actualizar variables salida PORTC MOVLW H'05' ; si, poner las decenas a 5 MOVWF secdeA DECF minunA,f ; decrementar las unidades de minuto INCFSZ minunA,W ; eran las unidades de minuto = 0? GOTO $+9 ; no, actualizar variables salida PORTC MOVLW H'09' ; si, poner las unidades a 9 MOVWF minunA DECF mindeA,f ; decrementar las decenas de minuto INCFSZ mindeA,W ; eran las decenas de minuto = 0? GOTO $+4 ; no, actualizar variables de salida PORTC MOVLW H'05' ; si, poner las decenas a 5 MOVWF mindeA DECF horaA,f ; y decrementar la hora CALL actcarA ; actualizamos las variables de salida por el PORTC MOVF secunA,f ; comprobamos si el contador es = 0 BTFSS STATUS,Z GOTO autoA MOVF secdeA,f BTFSS STATUS,Z GOTO autoA MOVF minunA,f BTFSS STATUS,Z GOTO autoA MOVF mindeA,f BTFSS STATUS,Z GOTO autoA MOVF horaA,f BTFSS STATUS,Z GOTO autoA ; si no lo es comprobamos si queda menos de 1 min. BTFSS flagA,0 ; si el contador = 0 miramos si está bandera puesta GOTO extraA ; si no, comprobamos si hay tiempo de Finish fiA BSF finA,0 RETURN extraA BTFSS xtrtmpA,0 ; comprobamos si hay tiempo de Finish GOTO fiA ; no hay BSF flagA,0 ; si hay, ponemos la bandera BSF auxflagA,0 ; y su auxiliar BCF xtrtmpA,0 ; quitamos el indicador de tiempo de finish MOVF esecunA,W ; y volcamos las variables de tiempo de Finish MOVWF secunA ; en las variables de tiempo de Control, que son MOVF esecdeA,W ; las que maneja el programa en todo momento

75

Page 77: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

MOVWF secdeA MOVF eminunA,W MOVWF minunA MOVF emindeA,W MOVWF mindeA MOVF ehoraA,W MOVWF horaA RETURN autoA MOVF horaA,f BTFSS STATUS,Z RETURN MOVF minunA,f BTFSS STATUS,Z RETURN MOVF mindeA,f BTFSS STATUS,Z RETURN MOVLW H'01' ; queda menos de 1 minuto MOVWF auto ; ponemos el modo de reproducción automática MOVWF auto1 RETURN ;-------------------------------------------------------------------------; ; Esta rutina se llama desde la ISR cada ; ; segundo que pasa para el jugador B. ; ;-------------------------------------------------------------------------; ;--------------- Comentarios análogos a la función cadasecA --------------; cadasecB BTFSC finB,0 RETURN DECF secunB,f INCFSZ secunB,W GOTO $+d'19' MOVLW H'09' MOVWF secunB DECF secdeB,f INCFSZ secdeB,W GOTO $+d'14' MOVLW H'05' MOVWF secdeB DECF minunB,f INCFSZ minunB,W GOTO $+9 MOVLW H'09' MOVWF minunB DECF mindeB,f INCFSZ mindeB,W GOTO $+4 MOVLW H'05' MOVWF mindeB DECF horaB,f CALL actcarB MOVF secunB,f BTFSS STATUS,Z GOTO autoB

76

Page 78: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

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 BTFSS flagB,0 GOTO extraB fiB BSF finB,0 RETURN extraB BTFSS xtrtmpB,0 GOTO fiB BSF flagB,0 BSF auxflagB,0 BCF xtrtmpB,0 MOVF esecunB,W MOVWF secunB MOVF esecdeB,W MOVWF secdeB MOVF eminunB,W MOVWF minunB MOVF emindeB,W MOVWF mindeB MOVF ehoraB,W MOVWF horaB RETURN autoB MOVF horaB,f BTFSS STATUS,Z RETURN MOVF minunB,f BTFSS STATUS,Z RETURN MOVF mindeB,f BTFSS STATUS,Z RETURN MOVLW H'03' ; queda menos de 1 minuto MOVWF auto ; ponemos el modo de reproducción automática MOVWF auto1 RETURN ;-------------------------------------------------------------------------; ; Rutina para actualizar las variables ; ; de salida por el PORTC, para el jugador A. ; ;-------------------------------------------------------------------------; actcarA MOVF horaA,f ; actualizamos las variables de salida PORTC BTFSS STATUS,Z ; horaA = 0? GOTO acthoraA ; no, saltar a acthoraA MOVF mindeA,f ; horaA = 0 BTFSS STATUS,Z ; decenas de minuto = 0? GOTO acthoraA ; no, saltar a acthoraA

77

Page 79: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

MOVF car1,W ANDLW H'F0' MOVWF car1 MOVF minunA,W ; si, actualizar variables salida PORTC IORWF car1,f ; con unidades de minuto MOVF car2,W ANDLW H'F0' MOVWF car2 MOVF secdeA,W ; decenas de segundo IORWF car2,f MOVF car3,W ANDLW H'F0' MOVWF car3 MOVF secunA,W ; y unidades de segundo. IORWF car3,f RETURN acthoraA MOVF car1,W ANDLW H'F0' MOVWF car1 MOVF horaA,W ; actualizamos el dígito 1 con IORWF car1,f ; la hora MOVF car2,W ANDLW H'F0' MOVWF car2 MOVF mindeA,W ; el 2 con las decenas de minutos IORWF car2,f ; la hora MOVF car3,W ANDLW H'F0' MOVWF car3 MOVF minunA,W ; y el 3 con las unidades de minutos IORWF car3,f ; referentes al jugador A RETURN ;-------------------------------------------------------------------------; ; Rutina para actualizar las variables ; ; de salida por el PORTC, para el jugador A. ; ;-------------------------------------------------------------------------; actcarB MOVF horaB,f BTFSS STATUS,Z ; horaB = 0? GOTO acthoraB ; no, saltar a acthoraB MOVF mindeB,f BTFSS STATUS,Z GOTO acthoraB MOVF car6,W ANDLW H'F0' MOVWF car6 MOVF minunB,W IORWF car6,f MOVF car7,W

78

Page 80: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

ANDLW H'F0' MOVWF car7 MOVF secdeB,W IORWF car7,f MOVF car8,W ANDLW H'F0' MOVWF car8 MOVF secunB,W IORWF car8,f RETURN acthoraB MOVF car6,W ANDLW H'F0' MOVWF car6 MOVF horaB,W ; actualizamos el dígito 6 con IORWF car6,f ; la hora MOVF car7,W ANDLW H'F0' MOVWF car7 MOVF mindeB,W ; el 7 con las decenas de minutos IORWF car7,f MOVF car8,W ANDLW H'F0' MOVWF car8 MOVF minunB,W ; y el 8 con las unidades de minutos IORWF car8,f ; referentes al jugador B RETURN ;-------------------------------------------------------------------------; ; Esta es la rutina principal, el programa empieza aquí ; ;-------------------------------------------------------------------------; principal CALL inicializar ; configuramos puertos, TMR0, etc. ;------- Volveremos a este punto cuando se termine una partida -----------; inicio CALL cogeree ; ponemos constantes de la eeprom en las variables de juego MOVLW H'00' ; ponemos a 0 las variables que indican: MOVWF finA ; que ha terminado el tiempo del A MOVWF finB ; idem para el B MOVWF flagA ; y que está la bandera puesta MOVWF flagB MOVWF ftmpA ; y los flags referentes al audio MOVWF reproA MOVWF ftmpB MOVWF reproB MOVWF auxflagB MOVWF auxflagB2 MOVWF auxflagA MOVWF auxflagA2 MOVWF auto MOVWF auto1 MOVLW H'F4'

79

Page 81: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

MOVWF ticsA ; inicializamos ticsA = 244 MOVWF ticsB ; inicializamos ticsB = 244 MOVLW H'04' MOVWF ticsA1 ; ticsA1 = 4 MOVWF ticsB1 ; y ticsB1 = 4 MOVLW H'B3' MOVWF cntmpA MOVWF cntmpB ; ponemos los contadores = 179 MOVLW H'06' MOVWF cntmpA1 MOVWF cntmpB1 ; y sus auxiliares = 6 BTFSS PORTB,b_jugA ; conmutador en posición del jugador A? GOTO esperaA ; si, empieza juego cuando se conmute a posición B GOTO esperaB ; no, empieza juego cuando se conmute a posición A esperaA CALL esperajugA GOTO cmpboton esperaB CALL esperajugB ;-------------------------------------------------------------------------; ; Este bucle espera a que se apriete un botón ; ; y va a la subrutina de servicio de este. ; ; A este punto podemos llegar porque ha empezado ; ; la partida o porque estamos en modo set. ; ;-------------------------------------------------------------------------; cmpboton BTFSC setmode,0 ; estamos en modo set? GOTO setcuenta ; si, ir a configurar tiempo partida BTFSS PORTB,b_jugA ; no, conmutador en posición del jugador A? GOTO empiezaB ; si, empezar a contar tiempo para A BTFSS PORTB,b_jugB ; no, conmutador en posición del jugador B? GOTO empiezaA ; si, contar tiempo para B GOTO cmpboton ; no, comprobar de nuevo si botón pulsado ;-------------------------------------------------------------------------; ; Cuando cambia de posición el conmutador de jugada del jugador A ; ; y el B, hay que actualizar la variable correspondiente de indicación ; ; de jugador activo (juegaA o juegaB). También hay que poner ticsA ; ; o ticsB, respectivamente, a su valor inicial. Y por último, ; ; hay que resetear el TMR0, ya que podría tener cualquier valor. ; ;-------------------------------------------------------------------------; empiezaA BSF juegaA,0 ; indicamos que juega el jugador A BSF auxA,0 BCF auxB,0 CLRF TMR0 ; reseteamos el TMR0 GOTO cmp_set ; y entramos en el bucle de partida empiezaB BSF juegaB,0 ; indicamos que juega el jugador B BCF auxA,0 BSF auxB,0

80

Page 82: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

CLRF TMR0 ; reseteamos el TMR0 GOTO cmp_set ; y entramos en el bucle de partida ;-------------------------------------------------------------------------; ; Una vez ha empezado la partida, nos mantenemos en un bucle ; ; mirando si hay alguna tecla pulsada, para indicar por la ; ; salida de audio el tiempo restante, si cambia el conmutador ; ; de jugador activo, o si se han pulsado simultáneamente el ; ; botón SET y MODE, para salir de la partida en curso e ir otra ; ; vez al principio del programa. ; ;-------------------------------------------------------------------------; partida BTFSS PORTB,b_jugB ; comprobamos si se ha cambiado GOTO jugB_puls ; de jugador activo BTFSC PORTB,b_jugA ; comprobación por si la partida está parada GOTO cmp_set BSF juegaB,0 ; indicamos que juega el jugador B BCF juegaA,0 ; y que deja de jugar el jugador A BTFSC nsecmov,0 ; comprobamos si estamos en modo Fischer GOTO $+d'15' ; si lo estamos MOVLW D'2' SUBWF auxflagA2,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+3 ; auxflagB2 <> 2 CLRF auxflagA ; auxflagB2 = 2 CLRF auxflagA2 BTFSS auxflagA,0 GOTO $+4 BTFSS auxA,0 ; corría el reloj del jugadorA? GOTO cmp_set ; no INCF auxflagA2,f ; si CLRF auxA BSF auxB,0 GOTO cmp_set BTFSC auxA,0 ; corría el reloj del jugadorA? GOTO $+2 ; si GOTO $+5 ; no CALL aumenta2A ; no, ha conmutado el reloj CALL actcarA ; aumentamos 2 segundos al contador BCF auxA,0 ; al reloj del jugador A BSF auxB,0 ; y actualizamos variables de control cmp_set BTFSS auto,0 ; estamos en modo de reproducción automática? GOTO noauto ; no BTFSS auto,1 GOTO siautoA CLRF auto ; si, reproducción automática altavoz B CALL calc_secB DECF secB carga MOVWF PORTA strobeB GOTO noauto siautoA CLRF auto ; si, reproducción automática altavoz A CALL calc_secA DECF secA

81

Page 83: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

carga MOVWF PORTA strobeA noauto BTFSS PORTB,b_set ; miramos si se ha pulsado algún botón GOTO set_puls BTFSS PORTB,b_mode GOTO mode_puls BTFSS PORTB,b_next CALL tiempoA_A BTFSS PORTB,b_up CALL tiempoB_A BTFSS PORTB,b_jugA ; miramos que uno de los dos pulsadores GOTO $+5 ; de jugador activo esté pulsado BTFSS PORTB,b_jugB GOTO $+3 BCF juegaB,0 ; si ninguno de los dos está pulsado BCF juegaA,0 ; lo indicamos para parar la partida. BTFSC ftmpA,0 ; falta algún mensaje por reproducir? GOTO $+6 ; Si. (ftmpA <> 0) BTFSC ftmpA,1 GOTO $+4 ; Si. (ftmpA <> 0) BTFSC ftmpA,2 GOTO $+2 ; Si. (ftmpA <> 0) GOTO $+4 ; No. (ftmpA = 0) BTFSC reproA,0 ; Estamos reproduciendo algún mensaje ahora? GOTO $+2 ; Si. Continúa. (reproA <> 0) CALL segrepA ; No. Mandar el siguiente mensaje al altavoz A. BTFSC ftmpB,0 ; hacemos lo mismo para el altavoz del jugador B GOTO $+6 ; ftmpB <> 0 BTFSC ftmpB,1 GOTO $+4 ; ftmpB <> 0 BTFSC ftmpB,2 GOTO $+2 ; ftmpB <> 0 GOTO partida ; ftmpB = 0 BTFSC reproB,0 GOTO partida ; reproB <> 0 CALL segrepB ; reproB = 0 GOTO partida ; volvemos a comprobar los botones jugB_puls BSF juegaA,0 ; indicamos que juega el jugador A BCF juegaB,0 ; y que deja de jugar el jugador B BTFSC nsecmov,0 ; comprobamos si estamos en modo Fischer GOTO $+d'15' ; si lo estamos MOVLW D'2' SUBWF auxflagB2,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+3 ; auxflagB2 <> 2 CLRF auxflagB ; auxflagB2 = 2 CLRF auxflagB2 BTFSS auxflagB,0 GOTO $+4 BTFSS auxB,0 ; corría el reloj del jugadorA? GOTO cmp_set ; no INCF auxflagB2,f ; si CLRF auxB BSF auxA,0 GOTO cmp_set

82

Page 84: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

BTFSC auxB,0 ; corría el reloj del jugadorA? GOTO $+2 ; si GOTO cmp_set ; no CALL aumenta2B ; no, ha conmutado el reloj CALL actcarB ; aumentamos 2 segundos al contador BSF auxA,0 ; al reloj del jugador A BCF auxB,0 ; y actualizamos variables de control GOTO cmp_set set_puls CALL tmpsec ; esperamos un segundo BTFSC PORTB,b_set ; sigue set pulsado? GOTO peticiontmp ; no, solo se quería pedir el tiempo BTFSC PORTB,b_mode ; si, b_mode pulsado? peticiontmp GOTO tiempoB_en_B ; botón mode no pulsado BCF juegaA,0 ; no juega BCF juegaB,0 ; nadie GOTO inicio ; volvemos al inicio del programa mode_puls CALL tmpsec ; esperamos un segundo BTFSC PORTB,b_mode ; sigue mode pulsado? GOTO peticiontmp2 ; no, solo se quería pedir el tiempo BTFSC PORTB,b_set ; si, b_set pulsado? peticiontmp2 GOTO tiempoA_en_B ; botón set no pulsado BCF juegaA,0 ; no juega BCF juegaB,0 ; nadie GOTO inicio ; volvemos al inicio del programa tiempoA_en_B CALL tiempoA_B ; llamadas a subrutinas que se encargan GOTO partida ; de reproducir el tiempo por los altavoces tiempoB_en_B CALL tiempoB_B GOTO partida ;-------------------------------------------------------------------------; ; Rutina para poner la cuenta inicial de la próxima partida ; ;-------------------------------------------------------------------------; setcuenta MOVLW D'72' ; hemos llegado al modo 72? SUBWF offset,W ; será cero si hemos llegado BTFSC STATUS,Z CALL setmanual ; si hemos llegado BTFSS PORTB,b_mode ; no. mode pulsado? GOTO modepuls ; pulsado CALL tmp20 ; no pulsado, esperamos por si hay rebotes BTFSC PORTB,b_mode ; segunda comprobación GOTO setpuls ; no pulsado modepuls CALL esperamode ; esperamos a que se suelte el boton MOVLW D'12' ; mode pulsado, aumentamos offset ADDWF offset,F ; para mostrar el siguiente modo MOVLW D'72' ; hemos llegado al modo 72? SUBWF offset,W ; será cero si hemos llegado BTFSC STATUS,Z GOTO $+3 CALL cogeree ; no ha llegado GOTO setcuenta CALL setmanual ; si ha llegado setpuls CALL cmpset BTFSC setmode,0 ; set pulsado un segundo?

83

Page 85: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

GOTO setcuenta ; no pulsado banco2 MOVF offset,W ; pulsado, guardamos el offset MOVWF EEDATA ; para que la próxima vez que MOVLW H'00' ; se encienda el reloj, se empiece MOVWF EEADR ; con la cuenta seleccionada CALL escribiree GOTO inicio setmanual CALL cogeree ; ponemos en el display la última cuenta inicial MOVLW H'08' ; cargamos el tiempo de Finish en el reloj B ADDWF offset,W CALL leeree MOVWF horaB MOVLW H'09' ADDWF offset,W CALL leeree MOVWF mindeB MOVLW H'0A' ADDWF offset,W CALL leeree MOVWF minunB CALL actcarA ; actualizamos variables de salida al PORTC CALL actcarB MOVLW H'00' ; inicializamos variables auxiliares MOVWF m MOVWF sec BCF auxflagB,0 BSF auxflagA,0 resetmanual BTFSS PORTB,b_up ; botón up pulsado? GOTO upsetmanual ; si CLRF sec ; no BTFSS PORTB,b_next ; botón next pulsado? GOTO nextsetmanual ; si BTFSS PORTB,b_mode ; no. Botón mode pulsado? GOTO modepulsrest BTFSC PORTB,b_set ; botón set pulsado? GOTO resetmanual CALL guardaree ; guardamos la cuenta inicial puesta manualmente CALL cogeree ; y la representamos en el display BCF auxflagB,0 BCF auxflagA,0 RETURN modepulsrest CALL guardaree ; mostramos la siguiente cuenta inicial guardada CLRF offset ; en la memoria EEPROM CALL cogeree BCF auxflagB,0 BCF auxflagA,0 CALL esperamode RETURN upsetmanual MOVLW H'10' ; sec > 17 ? Si se deja el botón up pulsado más SUBWF sec,W ; de un segundo, se incrementa el contador BTFSC STATUS,C ; automáticamente en incrementos de 1. GOTO $+8 ; sec > 17 INCF sec,f ; sec < 17 CALL tmp20 BTFSS PORTB,b_up ; esperamos a que se suelte el botón

84

Page 86: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

GOTO upsetmanual ; aun no está soltado CALL tmp20 ; soltado, esperamos por si hay rebotes BTFSS PORTB,b_up ; segunda comprobación GOTO upsetmanual ; no está soltado, seguir comprobando CALL tmp20 CALL tmp20 CALL tmp20 BTFSC m,0 GOTO $+d'23' ; m = 1 CALL calc_minA ; m = 0 MOVLW D'59' SUBWF minA,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+6 ; minA <> 59 MOVLW D'9' ; minA = 59 SUBWF horaA,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+2 ; horaA <> 9 CLRF horaA ; horaA = 9 CALL aumentamA CALL actcarA BCF m,0 BTFSC PORTB,b_next ; botón next pulsado? GOTO resetmanual ; no CLRF horaA ; si, ponemos el display a 0 CLRF mindeA CLRF minunA CALL actcarA CALL esperanext CALL esperaup GOTO resetmanual CALL calc_minB MOVLW D'59' SUBWF minB,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+6 ; minB <> 59 MOVLW D'9' ; minB = 59 SUBWF horaB,W ; si resultado = 0 ---> Z=1 BTFSS STATUS,Z GOTO $+2 ; horaB <> 9 CLRF horaB ; horaB = 9 CALL aumentamB CALL actcarB BSF m,0 BTFSC PORTB,b_next GOTO resetmanual CLRF horaB CLRF mindeB CLRF minunB CALL actcarB CALL esperanext CALL esperaup GOTO resetmanual nextsetmanual CALL esperanext ; este código es para poner el tiempo de MOVLW H'01' ; Control o el tiempo de Finish ADDWF m,f DECFSZ m,f GOTO $+5

85

Page 87: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

BSF m,0 ; m valía 0 BSF auxflagB,0 BCF auxflagA,0 GOTO resetmanual BCF m,0 ; m valía 1 BCF auxflagB,0 BSF auxflagA,0 GOTO resetmanual ;-------------------------------------------------------------------------; ; Rutina para esperar a que se suelte el botón del jugador A ; ;-------------------------------------------------------------------------; esperajugA CALL cmpset ; botón set pulsado durante 1 segundo? BTFSC setmode,0 RETURN BTFSS PORTB,b_jugA ; esperamos a que se suelte el botón GOTO esperajugA ; aun no está soltado CALL tmp20 ; soltado, esperamos por si hay rebotes BTFSS PORTB,b_jugA ; segunda comprobación GOTO esperajugA ; no está soltado, seguir comprobando RETURN ; finalmente soltado, volver ;-------------------------------------------------------------------------; ; Rutina para esperar a que se suelte el botón del jugador B ; ;-------------------------------------------------------------------------; esperajugB CALL cmpset ; botón set pulsado durante 1 segundo? BTFSC setmode,0 RETURN ; si, volvemos BTFSS PORTB,b_jugB ; no, esperamos a que se suelte el botón GOTO esperajugB ; aun no está soltado CALL tmp20 ; soltado, esperamos por si hay rebotes BTFSS PORTB,b_jugB ; segunda comprobación GOTO esperajugB ; no está soltado, seguir comprobando RETURN ; finalmente soltado, volver ;-------------------------------------------------------------------------; ; Rutina para esperar a que se suelte el botón set ; ;-------------------------------------------------------------------------; esperaset BTFSC juegaA,0 ; si ha empezado la partida CALL partida_aux ; miramos que no se cambie de jugador BTFSC juegaB,0 CALL partida_aux BTFSS PORTB,b_set ; esperamos a que se suelte el botón GOTO esperaset ; aun no está soltado CALL tmp20 ; soltado, esperamos por si hay rebotes BTFSS PORTB,b_set ; segunda comprobación GOTO esperaset ; no está soltado, seguir comprobando RETURN ; finalmente soltado, volver

86

Page 88: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

;-------------------------------------------------------------------------; ; Rutina para esperar a que se suelte el botón mode ; ;-------------------------------------------------------------------------; esperamode BTFSC juegaA,0 ; si ha empezado la partida CALL partida_aux ; miramos que no se cambie de jugador BTFSC juegaB,0 CALL partida_aux BTFSS PORTB,b_mode ; esperamos a que se suelte el botón GOTO esperamode ; aun no está soltado CALL tmp20 ; soltado, esperamos por si hay rebotes BTFSS PORTB,b_mode ; segunda comprobación GOTO esperamode ; no está soltado, seguir comprobando RETURN ; finalmente soltado, volver ;-------------------------------------------------------------------------; ; Rutina para esperar a que se suelte el botón up ; ;-------------------------------------------------------------------------; esperaup BTFSC juegaA,0 ; si ha empezado la partida CALL partida_aux ; miramos que no se cambie de jugador BTFSC juegaB,0 CALL partida_aux BTFSS PORTB,b_up ; esperamos a que se suelte el botón GOTO esperaup ; aun no está soltado CALL tmp20 ; soltado, esperamos por si hay rebotes BTFSS PORTB,b_up ; segunda comprobación GOTO esperaup ; no está soltado, seguir comprobando RETURN ; finalmente soltado, volver ;-------------------------------------------------------------------------; ; Rutina para esperar a que se suelte el botón next ; ;-------------------------------------------------------------------------; esperanext BTFSC juegaA,0 ; si ha empezado la partida CALL partida_aux ; miramos que no se cambie de jugador BTFSC juegaB,0 CALL partida_aux BTFSS PORTB,b_next ; esperamos a que se suelte el botón GOTO esperanext ; aun no está soltado CALL tmp20 ; soltado, esperamos por si hay rebotes BTFSS PORTB,b_next ; segunda comprobación GOTO esperanext ; no está soltado, seguir comprobando RETURN ; finalmente soltado, volver ;-------------------------------------------------------------------------; ; Rutina que sirve para poder cambiar de jugador activo en ; ; caso de que se deje pulsado un botón de petición de audio ; ;-------------------------------------------------------------------------; partida_aux BTFSS PORTB,b_jugA ; comprobamos si se ha cambiado GOTO jugA_puls_aux ; de jugador activo BTFSS PORTB,b_jugB GOTO jugB_puls_aux jugA_puls_aux BCF juegaA,0 ; indicamos que juega el jugador A BSF juegaB,0 ; y que deja de jugar el jugador B

87

Page 89: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

RETURN jugB_puls_aux BCF juegaB,0 ; indicamos que juega el jugador B BSF juegaA,0 ; y que deja de jugar el jugador A RETURN ;-------------------------------------------------------------------------; ; Rutina para mirar si el botón set está pulsado durante ; ; 1 segundo e indicar si estamos o no en modo set ; ;-------------------------------------------------------------------------; cmpset BTFSC PORTB,b_set ; comprobamos si está pulsado RETURN ; no lo está, volvemos CALL tmpsec ; pulsado, esperamos un segundo BTFSC PORTB,b_set ; segunda comprobación RETURN ; no pulsado, volver ; después de 1 segundo sigue pulsado BTFSC setmode,0 ; estábamos en modo set? GOTO modosetoff ; si, lo quitamos MOVLW H'01' ; no, ponemos el modo set MOVWF setmode GOTO modoseton modosetoff MOVLW H'00' MOVWF setmode ; quitamos el modo set modoseton CALL esperaset ; y esperamos a que se suelte el botón RETURN ;-------------------------------------------------------------------------; ; Rutina para aumentar 1 hora al reloj del jugadorA. ; ;-------------------------------------------------------------------------; aumentahA GOTO $+d'31' ;-------------------------------------------------------------------------; ; Rutina para aumentar 1 min. al reloj del jugadorA. ; ;-------------------------------------------------------------------------; aumentamA GOTO $+d'16' ;-------------------------------------------------------------------------; ; Rutina para aumentar 2 seg. al reloj del jugadorA. ; ;-------------------------------------------------------------------------; aumenta2A BTFSC secunA,3 ; secunA >= 8 ? GOTO $+4 ; si MOVLW H'02' ; no, aumentamos 2 segundos ADDWF secunA,f RETURN ; y volvemos de la rutina MOVF secunA,W ; enmascaramos los 3 bits de menos peso ANDLW H'07' ; para sumar los 2 segundos MOVWF secunA MOVLW H'05' ; secdeA > 5 ? SUBWF secdeA,W BTFSC STATUS,C GOTO $+3 ; si

88

Page 90: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

INCF secdeA,f ; no, sumamos 1 RETURN CLRF secdeA ; 5 + 1 = 6 ---> secdeA = 0 MOVLW H'09' SUBWF minunA,W ; minunA > 8 ? BTFSC STATUS,C GOTO $+3 ; minunA = 9 INCF minunA,f ; minunA < 9 --> sumamos 1 RETURN CLRF minunA ; 9 + 1 = 10 ---> minunA = 0 MOVLW H'05' ; mindeA >= 5 ? SUBWF mindeA,W BTFSC STATUS,C GOTO $+3 ; si INCF mindeA,f ; no, sumamos 1 RETURN CLRF mindeA ; 5 + 1 = 6 ---> mindeA = 0 MOVLW H'09' ; horaA < 9 ? SUBWF horaA,W BTFSC STATUS,C RETURN ; no, volvemos INCF horaA ; si, aumentamos 1 RETURN ;-------------------------------------------------------------------------; ; Rutina para aumentar 1 hora al reloj del jugadorB. ; ;-------------------------------------------------------------------------; aumentahB GOTO $+d'31' ;-------------------------------------------------------------------------; ; Rutina para aumentar 1 min. al reloj del jugadorB. ; ;-------------------------------------------------------------------------; aumentamB GOTO $+d'16' ;-------------------------------------------------------------------------; ; Rutina para aumentar 2 seg. al reloj del jugadorB. ; ;-------------------------------------------------------------------------; aumenta2B BTFSC secunB,3 ; secunB >= 8 ? GOTO $+4 ; si MOVLW H'02' ; no, aumentamos 2 segundos ADDWF secunB,f RETURN ; y volvemos de la rutina MOVF secunB,W ; enmascaramos los 3 bits de menos peso ANDLW H'07' ; para sumar los 2 segundos MOVWF secunB MOVLW H'05' ; secdeB > 5 ? SUBWF secdeB,W BTFSC STATUS,C GOTO $+3 ; si INCF secdeB,f ; no, sumamos 1 RETURN CLRF secdeB ; 5 + 1 = 6 ---> secdeB = 0 MOVLW H'09' SUBWF minunB,W ; minunB > 8 ? BTFSC STATUS,C GOTO $+3 ; minunB = 9

89

Page 91: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

INCF minunB,f ; minunB < 9 --> sumamos 1 RETURN CLRF minunB ; 9 + 1 = 10 ---> minunB = 0 MOVLW H'05' ; mindeB >= 5 ? SUBWF mindeB,W BTFSC STATUS,C GOTO $+3 ; si INCF mindeB,f ; no, sumamos 1 RETURN CLRF mindeB ; 5 + 1 = 6 ---> mindeB = 0 MOVLW H'09' ; horaB < 9 ? SUBWF horaB,W BTFSC STATUS,C RETURN ; no, volvemos INCF horaB ; si, aumentamos 1 RETURN ;-------------------------------------------------------------------------; ; Rutina para retrasar 1 seg., basada en la rutina tmp20. ; ;-------------------------------------------------------------------------; tmpsec MOVLW D'50' ; para contar un segundo llamamos MOVWF sec ; 50 veces a la rutina que cuenta CALL tmp20 ; 20 milisegundos BTFSC juegaA,0 ; si ha empezado la partida CALL partida_aux ; miramos que no se cambie de jugador BTFSC juegaB,0 CALL partida_aux DECFSZ sec, f GOTO $-6 RETURN ;-------------------------------------------------------------------------; ; Rutina para retrasar 20 miliseg., basada en el tiempo de instrucción. ; ; El tiempo de instrucción es de 4 microsegundos (cristal de 1 MHz). ; ;-------------------------------------------------------------------------; tmp20 MOVLW 0x28 ; 4961 ciclos MOVWF r1 retardo0 MOVLW 0x28 MOVWF r2 retardo1 DECFSZ r2, f GOTO retardo1 DECFSZ r1, f GOTO retardo0 MOVLW 0x0b ; 34 ciclos MOVWF r1 retardo2 DECFSZ r1, f GOTO retardo2 NOP ; 1 ciclos RETURN ; 4 ciclos

90

Page 92: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

;-------------------------------------------------------------------------; ; Rutina para retrasar 500 us. ; ;-------------------------------------------------------------------------; tmp500 MOVLW 0x29 ; 124 ciclos MOVWF r1 DECFSZ r1, f GOTO $-1 NOP ; 1 ciclo RETURN ;-------------------------------------------------------------------------; ; Rutina para coger de la EEPROM del PIC la cuenta inicial. ; ;-------------------------------------------------------------------------; cogeree MOVLW H'01' ; 1a posición de la eeprom + ADDWF offset,W ; offset desde el principio en W CALL leeree ; leemos un byte de la EEPROM MOVWF nsecmov ; y lo ponemos en el registro. MOVLW H'02' ; hacemos lo mismo sucesivamente para ADDWF offset,W ; todos los registros de los dos jugadores CALL leeree MOVWF xtrtmpA MOVWF xtrtmpB MOVLW H'03' ADDWF offset,W CALL leeree MOVWF horaA MOVWF horaB MOVLW H'04' ADDWF offset,W CALL leeree MOVWF mindeA MOVWF mindeB MOVLW H'05' ADDWF offset,W CALL leeree MOVWF minunA MOVWF minunB MOVLW H'06' ADDWF offset,W CALL leeree MOVWF secdeA MOVWF secdeB MOVLW H'07' ADDWF offset,W CALL leeree MOVWF secunA MOVWF secunB MOVLW H'08' ADDWF offset,W CALL leeree

91

Page 93: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

MOVWF ehoraA MOVWF ehoraB MOVLW H'09' ADDWF offset,W CALL leeree MOVWF emindeA MOVWF emindeB MOVLW H'0A' ADDWF offset,W CALL leeree MOVWF eminunA MOVWF eminunB MOVLW H'0B' ADDWF offset,W CALL leeree MOVWF esecdeA MOVWF esecdeB MOVLW H'0C' ADDWF offset,W CALL leeree MOVWF esecunA MOVWF esecunB CALL actcarA ; actualizamos variables de salida por el PORTC CALL actcarB RETURN ;-------------------------------------------------------------------------; ; Rutina para escribir en la EEPROM del PIC la cuenta inicial. ; ; Ponemos el Tiempo de Control en las variables de tiempo del ; ; jugador A y el B, y el tiempo de Finish en las variables ; ; correspondientes. ; ;-------------------------------------------------------------------------; guardaree MOVLW H'01' ADDWF minunB,f DECFSZ minunB,f GOTO $+d'11' ; minunB <> 0 MOVLW H'01' ; minunB = 0 ADDWF mindeB,f DECFSZ mindeB,f GOTO $+7 ; mindeB <> 0 MOVLW H'01' ; mindeB = 0 ADDWF horaB,f DECFSZ horaB,f GOTO $+3 ; horaB <> 0 CLRF xtrtmpA ; horaB = 0 GOTO $+3 MOVLW H'01' MOVWF xtrtmpA MOVLW H'01' ADDWF minunA,f

92

Page 94: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

DECFSZ minunA,f GOTO $+d'11' ; minunA <> 0 MOVLW H'01' ; minunA = 0 ADDWF mindeA,f DECFSZ mindeA,f GOTO $+7 ; mindeA <> 0 MOVLW H'01' ; mindeA = 0 ADDWF horaA,f DECFSZ horaA,f GOTO $+3 ; horaA <> 0 GOTO horaAno0 ; horaA = 0 RETURN BTFSS xtrtmpA,0 GOTO $+3 ; xtrtmpA = 0 GOTO xtrtmpA1 ; xtrtmpA = 1 RETURN banco2 MOVF horaA,W MOVWF EEDATA MOVLW D'75' MOVWF EEADR CALL escribiree banco2 MOVF mindeA,W MOVWF EEDATA MOVLW D'76' MOVWF EEADR CALL escribiree banco2 MOVF minunA,W MOVWF EEDATA MOVLW D'77' MOVWF EEADR CALL escribiree xtrtmpcont banco2 MOVLW H'00' MOVWF EEDATA MOVLW D'80' MOVWF EEADR CALL escribiree banco2 MOVLW H'00' MOVWF EEDATA MOVLW D'81' MOVWF EEADR CALL escribiree banco2 MOVLW H'00' MOVWF EEDATA MOVLW D'82' MOVWF EEADR CALL escribiree

93

Page 95: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

banco2 MOVF xtrtmpA,W MOVWF EEDATA MOVLW D'74' MOVWF EEADR CALL escribiree RETURN xtrtmpA1 banco2 MOVF horaA,W MOVWF EEDATA MOVLW D'75' MOVWF EEADR CALL escribiree banco2 MOVF mindeA,W MOVWF EEDATA MOVLW D'76' MOVWF EEADR CALL escribiree banco2 MOVF minunA,W MOVWF EEDATA MOVLW D'77' MOVWF EEADR CALL escribiree banco2 MOVF horaB,W MOVWF EEDATA MOVLW D'80' MOVWF EEADR CALL escribiree banco2 MOVF mindeB,W MOVWF EEDATA MOVLW D'81' MOVWF EEADR CALL escribiree banco2 MOVF minunB,W MOVWF EEDATA MOVLW D'82' MOVWF EEADR CALL escribiree banco2 MOVF xtrtmpA,W MOVWF EEDATA MOVLW D'74' MOVWF EEADR CALL escribiree RETURN horaAno0 BTFSC xtrtmpA,0

94

Page 96: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

GOTO xtrtmpA2 ; xtrtmpA = 1 CLRF offset ; xtrtmpA = 0 banco2 MOVF xtrtmpA,W MOVWF EEDATA MOVLW D'74' MOVWF EEADR CALL escribiree banco2 MOVLW H'00' MOVWF EEDATA MOVLW D'75' MOVWF EEADR CALL escribiree banco2 MOVLW H'00' MOVWF EEDATA MOVLW D'76' MOVWF EEADR CALL escribiree banco2 MOVLW H'00' MOVWF EEDATA MOVLW D'77' MOVWF EEADR CALL escribiree banco2 MOVLW H'00' MOVWF EEDATA MOVLW D'80' MOVWF EEADR CALL escribiree banco2 MOVLW H'00' MOVWF EEDATA MOVLW D'81' MOVWF EEADR CALL escribiree banco2 MOVLW H'00' MOVWF EEDATA MOVLW D'82' MOVWF EEADR CALL escribiree RETURN xtrtmpA2 banco2 MOVF horaB,W MOVWF EEDATA MOVLW D'75' MOVWF EEADR CALL escribiree

95

Page 97: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

banco2 MOVF mindeB,W MOVWF EEDATA MOVLW D'76' MOVWF EEADR CALL escribiree banco2 MOVF minunB,W MOVWF EEDATA MOVLW D'77' MOVWF EEADR CALL escribiree GOTO xtrtmpcont ;-------------------------------------------------------------------------; ; Rutina para leer un byte de la memoria de datos EEPROM ; ;-------------------------------------------------------------------------; leeree banco2 ; vamos al banco 2 de memoria MOVWF EEADR ; ponemos la dirección a leer en EEADR banco3 BCF EECON1,EEPGD ; apuntamos a la memoria de datos BSF EECON1,RD ; empezamos la operación de lectura banco2 ; volvemos al banco 2 MOVF EEDATA,W ; ponemos al byte leído en W banco0 RETURN ;-------------------------------------------------------------------------; ; Rutina para escribir un byte en la memoria de datos EEPROM ; ;-------------------------------------------------------------------------; escribiree banco3 ; vamos al banco 3 de memoria BCF EECON1,EEPGD ; apuntamos a la memoria de datos BSF EECON1,WREN ; habilitamos la escritura BCF INTCON,GIE ; deshabilitamos interrupciones MOVLW H'55' ; secuencia de instrucciones MOVWF EECON2 ; especial requerida por MOVLW H'AA' ; Microchip MOVWF EECON2 BSF EECON1,WR ; empezar la operación de escritura BSF INTCON,GIE ; habilitamos interrupciones BCF EECON1,WREN ; deshabilitamos la escritura BTFSC EECON1,WR ; esperamos a que termine la GOTO $-1 ; operación de escritura banco0 RETURN ;-------------------------------------------------------------------------; ; Rutina que reproduce el tiempo que queda para ; ; el jugador A, en el altavoz del jugador A. ; ;-------------------------------------------------------------------------; tiempoA_A BTFSS auto1,0 ; si estamos en modo de repro. automática GOTO $+3 ; no hacemos caso de la petición de audio

96

Page 98: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

BTFSS auto1,1 RETURN MOVF horaA,W ; copiamos horaA a una variable auxiliar MOVWF m ; para no modificarla ADDWF m,f BTFSC ftmpA,0 ; Faltan mensajes por reproducir en altavoz A? RETURN ; si. BTFSC ftmpA,1 RETURN ; si. BTFSC ftmpA,2 RETURN ; si. (ftmpA <> 0) DECFSZ m,f ; no. (ftmpA = 0) GOTO rhAA ; horaA <> 0 CALL calc_minA ; horaA = 0 DECFSZ minA,f GOTO rmAA ; minA <> 0 CALL calc_secA ; minA = 0 DECFSZ secA,f GOTO rsAA ; secA <> 0 CALL esperanext ; secA = 0 RETURN rhAA CALL rep_horaAA CALL esperanext RETURN rmAA CALL rep_minAA CALL esperanext RETURN rsAA CALL rep_secAA CALL esperanext RETURN ;-------------------------------------------------------------------------; ; Rutina que reproduce el tiempo que queda para ; ; el jugador B, en el altavoz del jugador A. ; ;-------------------------------------------------------------------------; tiempoB_A BTFSS auto1,0 ; si estamos en modo de repro. automática GOTO $+3 ; no hacemos caso de la petición de audio BTFSS auto1,1 RETURN MOVF horaB,W MOVWF m ADDWF m,f BTFSC ftmpA,0 RETURN BTFSC ftmpA,1 RETURN BTFSC ftmpA,2 RETURN ; ftmpA <> 0 DECFSZ m,f ; ftmpA = 0 GOTO rhBA ; horaB <> 0 CALL calc_minB ; horaB = 0 DECFSZ minB,f GOTO rmBA ; minB <> 0

97

Page 99: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

CALL calc_secB ; minB = 0 DECFSZ secB,f GOTO rsBA ; secB <> 0 CALL esperaup ; secB = 0 RETURN rhBA CALL rep_horaBA CALL esperaup RETURN rmBA CALL rep_minBA CALL esperaup RETURN rsBA CALL rep_secBA CALL esperaup RETURN ;-------------------------------------------------------------------------; ; Rutina que reproduce el tiempo que queda para ; ; el jugador B, en el altavoz del jugador B. ; ;-------------------------------------------------------------------------; tiempoB_B BTFSS auto1,0 ; si estamos en modo de repro. automática GOTO $+3 ; no hacemos caso de la petición de audio BTFSC auto1,1 RETURN MOVF horaB,W MOVWF m ADDWF m,f BTFSC ftmpB,0 RETURN BTFSC ftmpB,1 RETURN BTFSC ftmpB,2 RETURN ; ftmpB <> 0 DECFSZ m,f ; ftmpB = 0 GOTO rhBB ; horaB <> 0 CALL calc_minB ; horaB = 0 DECFSZ minB,f GOTO rmBB ; minB <> 0 CALL calc_secB ; minB = 0 DECFSZ secB,f GOTO rsBB ; secB <> 0 CALL esperaset ; secB = 0 RETURN rhBB CALL rep_horaBB CALL esperaset RETURN rmBB CALL rep_minBB CALL esperaset RETURN rsBB CALL rep_secBB CALL esperaset RETURN

98

Page 100: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

;-------------------------------------------------------------------------; ; Rutina que reproduce el tiempo que queda para ; ; el jugador A, en el altavoz del jugador B. ; ;-------------------------------------------------------------------------; tiempoA_B BTFSS auto1,0 ; si estamos en modo de repro. automática GOTO $+3 ; no hacemos caso de la petición de audio BTFSC auto1,1 RETURN MOVF horaA,W MOVWF m ADDWF m,f BTFSC ftmpB,0 RETURN BTFSC ftmpB,1 RETURN BTFSC ftmpB,2 RETURN ; ftmpB <> 0 DECFSZ m,f ; ftmpB = 0 GOTO rhAB ; horaB <> 0 CALL calc_minA ; horaB = 0 DECFSZ minA,f GOTO rmAB ; minB <> 0 CALL calc_secA ; minB = 0 DECFSZ secA,f GOTO rsAB ; secB <> 0 CALL esperamode ; secB = 0 RETURN rhAB CALL rep_horaAB CALL esperamode RETURN rmAB CALL rep_minAB CALL esperamode RETURN rsAB CALL rep_secAB CALL esperamode RETURN ;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de Horas y ; ; minutos (A) por el altavoz del jugador A. ; ;-------------------------------------------------------------------------; rep_horaAA MOVF horaA,W carga MOVWF msg1A ; msg1A = dirección de la EPROM del MOVLW H'3D' ; Módulo de Audio donde está la hora MOVWF msg2A ; msg2A = dirección de la EPROM del CALL calc_minA ; Módulo de Audio donde está el msg "Horas" DECFSZ minA,f GOTO $+6 ; minA <> 0

99

Page 101: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

MOVLW H'02' ; minA = 0 MOVWF ftmpA MOVLW H'3D' ; si minutos de A = 0, no reproducir mensaje MOVWF msg3A ; de minutos GOTO $+8 MOVF minA,W carga MOVWF msg3A ; si minutos de A <> 0, msg3A = dirección de MOVLW H'03' ; la EPROM del Módulo de Audio donde están los minutos MOVWF ftmpA BSF reproA,0 CALL enviarA RETURN ;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de minutos y ; ; segundos (A) por el altavoz del jugador A. ; ;-------------------------------------------------------------------------; rep_minAA MOVF minA,W carga MOVWF msg1A ; msg1A = dirección de la EPROM del MOVLW H'3C' ; Módulo de Audio donde están los minutos MOVWF msg2A ; msg2A = dirección de la EPROM del CALL calc_secA ; Módulo de Audio donde está el msg "Minutos" DECFSZ secA,f GOTO $+6 ; secA <> 0 MOVLW H'02' ; secA = 0 MOVWF ftmpA MOVLW H'3C' ; si segundos de A = 0, no reproducir mensaje MOVWF msg3A ; de segundos GOTO $+8 MOVF secA,W carga MOVWF msg3A ; si segundos de A <> 0, msg3A = dirección de MOVLW H'03' ; la EPROM del Módulo de Audio donde están los segundos MOVWF ftmpA BSF reproA,0 CALL enviarA RETURN ;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de segundos ; ; (A) por el altavoz del jugador A. ; ;-------------------------------------------------------------------------; rep_secAA MOVF secA,W carga MOVWF msg1A ; msg1A = dirección de la EPROM del MOVLW H'3B' ; Módulo de Audio donde están los segundos MOVWF msg3A ; msg3A = dirección de la EPROM del MOVLW H'02' ; Módulo de Audio donde está el msg "Segundos" MOVWF ftmpA BSF reproA,0

100

Page 102: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

CALL enviarA RETURN ;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de Horas y ; ; minutos (B) por el altavoz del jugador A. ; ;-------------------------------------------------------------------------; rep_horaBA MOVF horaB,W carga MOVWF msg1A MOVLW H'3D' MOVWF msg2A CALL calc_minB DECFSZ minB,f GOTO $+6 ; minB <> 0 MOVLW H'02' ; minB = 0 MOVWF ftmpA MOVLW H'3D' MOVWF msg3A GOTO $+8 MOVF minB,W carga MOVWF msg3A MOVLW H'03' MOVWF ftmpA BSF reproA,0 CALL enviarA RETURN ;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de minutos y ; ; segundos (B) por el altavoz del jugador A. ; ;-------------------------------------------------------------------------; rep_minBA MOVF minB,W carga MOVWF msg1A MOVLW H'3C' MOVWF msg2A CALL calc_secB DECFSZ secB,f GOTO $+6 ; secB <> 0 MOVLW H'02' ; secB = 0 MOVWF ftmpA MOVLW H'3C' MOVWF msg3A GOTO $+8 MOVF secB,W carga MOVWF msg3A MOVLW H'03' MOVWF ftmpA BSF reproA,0 CALL enviarA RETURN

101

Page 103: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de segundos ; ; (B) por el altavoz del jugador A. ; ;-------------------------------------------------------------------------; rep_secBA MOVF secB,W carga MOVWF msg1A MOVLW H'3B' MOVWF msg3A MOVLW H'02' MOVWF ftmpA BSF reproA,0 CALL enviarA RETURN ;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de Horas y ; ; minutos (B) por el altavoz del jugador B. ; ;-------------------------------------------------------------------------; rep_horaBB MOVF horaB,W carga MOVWF msg1B MOVLW H'3D' MOVWF msg2B CALL calc_minB DECFSZ minB,f GOTO $+6 ; minB <> 0 MOVLW H'02' ; minB = 0 MOVWF ftmpB MOVLW H'3D' MOVWF msg3B GOTO $+8 MOVF minB,W carga MOVWF msg3B MOVLW H'03' MOVWF ftmpB BSF reproB,0 CALL enviarB RETURN ;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de minutos y ; ; segundos (B) por el altavoz del jugador B. ; ;-------------------------------------------------------------------------; rep_minBB MOVF minB,W carga MOVWF msg1B MOVLW H'3C' MOVWF msg2B CALL calc_secB DECFSZ secB,f GOTO $+6 ; secB <> 0

102

Page 104: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

MOVLW H'02' ; secB = 0 MOVWF ftmpB MOVLW H'3C' MOVWF msg3B GOTO $+8 MOVF secB,W carga MOVWF msg3B MOVLW H'03' MOVWF ftmpB BSF reproB,0 CALL enviarB RETURN ;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de segundos ; ; (B) por el altavoz del jugador B. ; ;-------------------------------------------------------------------------; rep_secBB MOVF secB,W carga MOVWF msg1B MOVLW H'3B' MOVWF msg3B MOVLW H'02' MOVWF ftmpB BSF reproB,0 CALL enviarB RETURN ;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de Horas y ; ; minutos (A) por el altavoz del jugador B. ; ;-------------------------------------------------------------------------; rep_horaAB MOVF horaA,W carga MOVWF msg1B MOVLW H'3D' MOVWF msg2B CALL calc_minA DECFSZ minA,f GOTO $+6 ; minA <> 0 MOVLW H'02' ; minA = 0 MOVWF ftmpB MOVLW H'3D' MOVWF msg3B GOTO $+8 MOVF minA,W carga MOVWF msg3B MOVLW H'03' MOVWF ftmpB BSF reproB,0 CALL enviarB RETURN

103

Page 105: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de minutos y ; ; segundos (A) por el altavoz del jugador B. ; ;-------------------------------------------------------------------------; rep_minAB MOVF minA,W carga MOVWF msg1B MOVLW H'3C' MOVWF msg2B CALL calc_secA DECFSZ secA,f GOTO $+6 ; secA <> 0 MOVLW H'02' ; secA = 0 MOVWF ftmpB MOVLW H'3C' MOVWF msg3B GOTO $+8 MOVF secA,W carga MOVWF msg3B MOVLW H'03' MOVWF ftmpB BSF reproB,0 CALL enviarB RETURN ;-------------------------------------------------------------------------; ; Rutina para mandar un mensaje de segundos ; ; (A) por el altavoz del jugador B. ; ;-------------------------------------------------------------------------; rep_secAB MOVF secA,W carga MOVWF msg1B MOVLW H'3B' MOVWF msg3B MOVLW H'02' MOVWF ftmpB BSF reproB,0 CALL enviarB RETURN ;-------------------------------------------------------------------------; ; Enviamos msg1A al PORTA ; ;-------------------------------------------------------------------------; enviarA MOVF msg1A,W ; ponemos la dirección del mensaje MOVWF PORTA ; en el PORTA strobeA RETURN ;-------------------------------------------------------------------------; ; Enviamos msg1B al PORTA ; ;-------------------------------------------------------------------------;

104

Page 106: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

enviarB MOVF msg1B,W MOVWF PORTA strobeB RETURN ;-------------------------------------------------------------------------; ; Rutina que continua la reproducción de ; ; un mensaje por el altavoz A ; ;-------------------------------------------------------------------------; segrepA BSF reproA,0 ; indicamos que se está reproduciendo MOVF ftmpA,W ; audio por el altavoz A SUBLW H'02' ; Si W=1 -> ftmpA=1 ; W=0 -> ftmpA=2 MOVWF m BTFSC m,0 GOTO $+3 ; W = 1 -> ftmpA=1 MOVF msg2A,W ; W = 0 -> ftmpA=2 GOTO $+2 MOVF msg3A,W MOVWF PORTA strobeA RETURN ;-------------------------------------------------------------------------; ; Rutina que continua la reproducción de ; ; un mensaje por el altavoz B ; ;-------------------------------------------------------------------------; segrepB BSF reproB,0 MOVF ftmpB,W SUBLW H'02' ; Si W=1 -> ftmpB=1 ; W=0 -> ftmpB=2 MOVWF m BTFSC m,0 GOTO $+3 ; W = 1 -> ftmpB=1 MOVF msg2B,W ; W = 0 -> ftmpB=2 GOTO $+2 MOVF msg3B,W MOVWF PORTA strobeB RETURN ;-------------------------------------------------------------------------; ; Calculamos los minutos restantes del jugador A ; ;-------------------------------------------------------------------------; calc_minA CLRF minA MOVLW H'09' MOVWF m MOVF mindeA,W ADDWF mindeA,W DECFSZ m,f GOTO $-2 ; m <> 0 ADDWF minunA,W ; m = 0 MOVWF minA

105

Page 107: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

INCF minA,f RETURN ;-------------------------------------------------------------------------; ; Calculamos los segundos restantes del jugador A ; ;-------------------------------------------------------------------------; calc_secA CLRF secA MOVLW H'09' MOVWF m MOVF secdeA,W ADDWF secdeA,W DECFSZ m,f GOTO $-2 ; m <> 0 ADDWF secunA,W ; m = 0 MOVWF secA INCF secA,f RETURN ;-------------------------------------------------------------------------; ; Calculamos los minutos restantes del jugador B ; ;-------------------------------------------------------------------------; calc_minB CLRF minB MOVLW H'09' MOVWF m MOVF mindeB,W ADDWF mindeB,W DECFSZ m,f GOTO $-2 ; m <> 0 ADDWF minunB,W ; m = 0 MOVWF minB INCF minB,f RETURN ;-------------------------------------------------------------------------; ; Calculamos los segundos restantes del jugador B ; ;-------------------------------------------------------------------------; calc_secB CLRF secB MOVLW H'09' MOVWF m MOVF secdeB,W ADDWF secdeB,W DECFSZ m,f GOTO $-2 ; m <> 0 ADDWF secunB,W ; m = 0 MOVWF secB INCF secB,f RETURN

106

Page 108: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos Memoria de Cálculo.

;-------------------------------------------------------------------------; ; 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 ; modo 1 DE 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 ; modo 2 DE 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ; modo 3 DE 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0 ; modo 4 DE 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ; modo 5 DE 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0 ; modo 6 DE 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; modo manual DE 43,6F,70,79,72,69,67,68,74,3A,43,61 ; Copyright en hexadecimal. DE 72,6C,6F,73,2D,4D,61,73,73,61,2D,41 DE 6D,61,64,6F,2E END

107

Page 109: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Plános.

3. PLÁNOS.

108

Page 110: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Plános.

3.1 Placa 1 (Módulo de Control y Módulo del Display)

3.1.1 Esquema Eléctrico Placa 1

3.1.2 Situación de Componentes Placa 1

3.1.3 Máscara de Cara de Componentes Placa 1

3.1.4 Máscara de Cara de Soldaduras Placa 1

3.2 Placa 2 (Módulo de Audio)

3.2.1 Esquema eléctrico Placa 2

3.2.2 Situación de Componentes Placa 2

3.2.3 Máscara de Cara de Componentes Placa 2

3.2.4 Máscara de Cara de Soldaduras Placa 2

109

Page 111: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

110

Page 112: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

111

Page 113: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

112

Page 114: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

113

Page 115: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

114

Page 116: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

115

Page 117: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

116

Page 118: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

117

Page 119: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Presupuesto.

4. PRESUPUESTO.

118

Page 120: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Presupuesto.

4.1 Presupuesto de Diseño del Prototipo

Horas de diseño Ingeniero: 252 horas X 38’84 € = 9.787,68 €

El precio del material utilizado se puede ver detallado en la siguiente tabla:

Nº Descripción del componente Precio unitario (€)

Cantidad Subtotal (€)

1 Condensador 68 p 0’02 2 0’04

2 Condensador 1 n 0’02 1 0’02

3 Condensador 4’7 n 0’02 6 0’12

4 Condensador 10 n 0’02 1 0’02

5 Condensador 47 n 0’02 2 0’04

6 Condensador 100 n 0’02 4 0’08

7 Condensador 2’2 u 0’03 4 0’12

8 Condensador 10 u 0’03 2 0’06

9 Condensador 47 u 0’03 13 0’39

10 Condensador 220 u 0’03 2 0’06

11 Resistencia ¼ W. de 10 0’01 2 0’02

12 Resistencia ¼ W. de 100 0’01 1 0’01

13 Resistencia ¼ W. de 1 k 0’01 8 0’08

14 Resistencia ¼ W. de 4k7 0’01 1 0’01

15 Resistencia ¼ W. de 8k2 0’01 4 0’04

16 Resistencia ¼ W. de 10 k 0’08 1 0’08

17 Resistencia ¼ W. de 18 k 0’08 1 0’08

18 Resistencia ¼ W. de 68 k 0’08 2 0’16

19 Resistencia ¼ W. de 75 k 0’08 6 0’48

20 Resistencia ¼ W. de 100 k 0’08 4 0’32

21 Potenciómetro 10 k 0’12 2 0’24

22 Potenciómetro 100 k 0’12 2 0’24

23 Integrado M27C256 2’72 1 2’72

24 Integrado LM324N 0’43 3 1’29

119

Page 121: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Presupuesto.

25 Integrado 74HCT238 0’57 7 3’99

26 Integrado TLC7528 1’70 1 1’70

27 Integrado LM555N 0’18 1 0’18

28 Integrado LM386N 0’52 2 1’04

29 Integrado AM27C040 6’78 1 6’78

30 Integrado EPM7128ELC84 23’33 1 23’33

31 Integrado PIC16F873 8’59 1 8’59

32 Cristal 1 MHz. 2’05 1 2’05

33 Display LCD 8 Dígitos 22’14 1 22’14

34 Diodo 1N4004 0’19 1 0’19

35 Diodo 1N750 0’19 1 0’19

36 Regulador de Tensión 78L05 0’18 1 0’18

37 Zócalo 8 patas torneado 0’19 3 0’57

38 Zócalo 14 patas torneado 0’22 3 0’66

39 Zócalo 16 patas torneado 0’22 7 1’54

40 Zócalo 20 patas torneado 0’25 1 0’25

41 Zócalo 28 patas torneado 0’27 2 0’54

42 Zócalo 32 patas torneado 0’31 1 0’31

43 Zócalo PGA 84 patas 3’19 1 3’19

44 Conector Cable Plano Macho 0’55 1 0’55

45 Conector Cable Plano Hembra 0’38 1 0’38

46 Pulsador color rojo 0’87 2 1’74

47 Pulsador color verde 0’87 2 1’74

48 Conmutador 3’16 1 3’16

49 Auricular mono Uni Tone 1’38 2 2’76

50 Tornillo 0’05 4 0’2

51 Rosca hembra 0’02 8 0’16

52 Caja de madera 15’96 1 15’96

53 Placa Positiva D. Cara 16X10 4’27 2 8’54

TOTAL: 119’98 €

120

Page 122: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Presupuesto.

El reloj ha sido diseñado de manera que se pueda poner en producción el sistema completo o solamente el reloj digital de ajedrez, sin el Módulo de Audio. A continuación se presenta el presupuesto del prototipo sin el Módulo de Audio.

Nº Descripción del componente Precio unitario (€)

Cantidad Subtotal (€)

1 Condensador 68 p 0’02 2 0’04

2 Condensador 47 u 0’03 2 0’06

3 Resistencia ¼ W. de 100 0’01 1 0’01

4 Resistencia ¼ W. de 1 k 0’01 2 0’02

5 Resistencia ¼ W. de 4k7 0’01 1 0’01

6 Resistencia ¼ W. de 10 k 0’08 1 0’08

7 Resistencia ¼ W. de 18 k 0’08 1 0’08

8 Cristal 1 MHz. 2’05 1 2’05

9 Integrado M27C256 2’72 1 2’72

10 Integrado LM324N 0’43 1 0’43

11 Integrado PIC16F873 8’59 1 8’59

12 Integrado 74HCT238 0’57 7 3’99

13 Display LCD 8 Dígitos 22’14 1 22’14

14 Diodo 1N750 0’19 1 0’19

15 Regulador de Tensión 78L05 0’18 1 0’18

16 Zócalo 28 patas torneado 0’27 2 0’54

17 Zócalo 16 patas torneado 0’22 7 1’54

18 Zócalo 14 patas torneado 0’22 1 0’22

19 Pulsador color rojo 0’87 2 1’74

20 Pulsador color verde 0’87 2 1’74

21 Conmutador 3’16 1 3’16

22 Caja de madera 15’96 1 15’96

23 Placa Positiva D. Cara 16X10 4’27 1 4’27

TOTAL: 69’76 €

121

Page 123: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Presupuesto.

Para desarrollar este proyecto, se han utilizado los siguientes instrumentos:

• Fuente de alimentación asimétrica: +5 V, GND.

• Osciloscopio.

• Analizador lógico.

• Grabador del PIC16F873

• Grabador de EPROM.

• PC.

La escuela disponía de todos estos aparatos, por tanto no se ha tenido que hacer ningún tipo de inversión específica para llevar a cabo el desarrollo del proyecto.

Para realizar el montaje de este prototipo no se ha utilizado ningún medio de producción, se ha montado todo manualmente.

Precio de montaje operario:

• Reloj digital sin Módulo de Audio: 6 horas X 8’07 hora

€ = 48’42 €

• Reloj digital con Módulo de Audio: 12 horas X 8’07 hora

€ = 96’84 €

En la siguiente tabla se resume el presupuesto total del diseño del prototipo, con y sin el Módulo de Audio:

RELOJ DIGITAL DE AJEDREZ

SIN MÓDULO DE AUDIO

CON MÓDULO DE AUDIO

Horas Diseño: 6.787’68 € 9.787,68 €

Material utilizado: 69’76 € 119’98 €

Amortización equipo: 0 € 0 €

Horas montaje: 48’42 € 96’84 €

TOTAL: 6.905’86 € 10.004’5 €

122

Page 124: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Presupuesto.

4.2 Presupuesto de Puesta en Fabricación

La realización del circuito impreso de este aparato se realizará en una línea

electrónica ya existente y se compartirá la producción con otros productos. Por tanto habrá muy poca inversión específica.

En la siguiente tabla podemos ver los precios para una previsión de ventas de 100.000 unidades del producto:

Nº Descripción del componente Precio unitario (€)

Cantidad Subtotal (€)

1 Condensador 68 p 0’02 2 0’04

2 Condensador 1 n 0’02 1 0’02

3 Condensador 4’7 n 0’02 6 0’12

4 Condensador 10 n 0’02 1 0’02

5 Condensador 47 n 0’02 2 0’04

6 Condensador 100 n 0’02 4 0’08

7 Condensador 2’2 u 0’03 4 0’12

8 Condensador 10 u 0’03 2 0’06

9 Condensador 47 u 0’03 13 0’39

10 Condensador 220 u 0’03 2 0’06

11 Resistencia ¼ W. de 10 0’01 2 0’02

12 Resistencia ¼ W. de 100 0’01 1 0’01

13 Resistencia ¼ W. de 1 k 0’01 8 0’08

14 Resistencia ¼ W. de 4k7 0’01 1 0’01

15 Resistencia ¼ W. de 8k2 0’01 4 0’04

16 Resistencia ¼ W. de 10 k 0’05 1 0’05

17 Resistencia ¼ W. de 18 k 0’05 1 0’05

18 Resistencia ¼ W. de 68 k 0’05 2 0’10

19 Resistencia ¼ W. de 75 k 0’05 6 0’30

20 Resistencia ¼ W. de 100 k 0’05 4 0’20

21 Potenciómetro 10 k 0’08 2 0’16

22 Potenciómetro 100 k 0’08 2 0’16

123

Page 125: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Presupuesto.

23 Integrado M27C256 2’03 1 2’03

24 Integrado LM324N 0’34 3 1’02

25 Integrado 74HCT238 0’48 7 3’36

26 Integrado TLC7528 1’62 1 1’62

27 Integrado LM555N 0’10 1 0’10

28 Integrado LM386N 0’42 2 0’84

29 Integrado AM27C040 4’39 1 4’39

30 Integrado EPM7128ELC84 16’71 1 16’71

31 Integrado PIC16F873 4’80 1 4’80

32 Cristal 1 MHz. 2’05 1 2’05

33 Display LCD 8 Dígitos 18’13 1 18’13

34 Diodo 1N4004 0’10 1 0’10

35 Diodo 1N750 0’10 1 0’10

36 Regulador de Tensión 78L05 0’11 1 0’11

37 Zócalo 8 patas torneado 0’15 3 0’45

38 Zócalo 14 patas torneado 0’18 3 0’54

39 Zócalo 16 patas torneado 0’18 7 1’26

40 Zócalo 20 patas torneado 0’21 1 0’21

41 Zócalo 28 patas torneado 0’23 2 0’46

42 Zócalo 32 patas torneado 0’28 1 0’28

43 Zócalo PGA 84 patas 2’79 1 2’79

44 Conector Cable Plano Macho 0’45 1 0’45

45 Conector Cable Plano Hembra 0’28 1 0’28

46 Pulsador color rojo 0’76 2 1’52

47 Pulsador color verde 0’76 2 1’52

48 Conmutador 3 1 3

49 Auricular mono Uni Tone 1’20 2 2’40

50 Tornillo 0’03 4 0’12

51 Rosca hembra 0’02 8 0’16

52 Caja de madera 10’20 1 10’20

124

Page 126: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Presupuesto.

53 Placa Positiva D. Cara 16X10 3’19 2 6’38

TOTAL: 89’45 €

Y para el reloj sin el Módulo de Audio:

Nº Descripción del componente Precio unitario (€)

Cantidad Subtotal (€)

1 Condensador 68 p 0’02 2 0’04

2 Condensador 47 u 0’03 2 0’06

3 Resistencia ¼ W. de 100 0’05 1 0’05

4 Resistencia ¼ W. de 1 k 0’01 2 0’02

5 Resistencia ¼ W. de 4k7 0’01 1 0’01

6 Resistencia ¼ W. de 10 k 0’05 1 0’05

7 Resistencia ¼ W. de 18 k 0’05 1 0’05

8 Cristal 1 MHz. 2’05 1 2’05

9 Integrado M27C256 2’03 1 2’03

10 Integrado LM324N 0’34 1 0’34

11 Integrado PIC16F873 4’80 1 4’80

12 Integrado 74HCT238 0’48 7 3’36

13 Display LCD 8 Dígitos 18’13 1 18’13

14 Diodo 1N750 0’10 1 0’10

15 Regulador de Tensión 78L05 0’11 1 0’11

16 Zócalo 28 patas torneado 0’23 2 0’46

17 Zócalo 16 patas torneado 0’18 7 1’26

18 Zócalo 14 patas torneado 0’18 1 0’18

19 Pulsador color rojo 0’76 2 1’52

20 Pulsador color verde 0’76 2 1’52

21 Conmutador 3 1 3

22 Caja de madera 10’20 1 10’20

23 Placa Positiva D. Cara 16X10 3’19 1 3’19

TOTAL: 52’53 €

125

Page 127: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Presupuesto.

Para realizar el montaje de este prototipo no se utilizará ningún medio de producción, se montará todo manualmente.

Precio de montaje operario:

• Reloj digital sin Módulo de Audio: 6 horas X 5’54 hora

€ = 33’24 €

• Reloj digital con Módulo de Audio: 12 horas X 5’54 hora

€ = 66’48 €

En la siguiente tabla se resume el presupuesto total de puesta en fabricación, con y sin el Módulo de Audio:

RELOJ DIGITAL DE AJEDREZ

SIN MÓDULO DE AUDIO

CON MÓDULO DE AUDIO

Amortización Horas Diseño: € 10'0

000.100€ 9.787'68

=

Material utilizado: 52’53 € 89’45 €

Amortización equipo: 0 € 0 €

Horas montaje: 33’24 € 66’48 €

TOTAL: 85’84 € 156’03 €

€ 07'0000.100

€ 6.787'68=

126

Page 128: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Bibliografía.

5. BIBLIOGRAFÍA.

127

Page 129: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Bibliografía.

5.1 Libros Consultados [1] José María Angulo U., Ignacio Angulo M. Microcontroladores Pic. Diseño Práctico de

Aplicaciones. Ed. Mc.Graw-Hill. 1998. [2] M. Aumiaux. El Empleo de los Microprocesadores. Ed. Toray-masson. 1981. [3] John P. Hayes. Diseño Lógico Digital. Ed. Addison-Wesley Iberoamericana. 1996. [4] Don A. Meador. Laplace Circuit Análisis and Active Filtres. Ed. Prentice Hall [5] Bruce Carter. Flter Design in Thirty Seconds. Texas Instruments application Report.

Diciembre 2001. [6] Luís Martinez Salamero, Alberto Poveda López, Luís García Vicuña, Francesc Guijoan

Gispert, Antonio F. Sánchez García, Francesc J. Sánchez Robert. Funcions Electròniques. Ed. UPC 1993.

[7] PFC: Gispert Jimenez, David. Gravador Digital de Missatges de Veu. URV 1999. [8] PFC: Esguevillas Cuadrado, Francisco Javier. Sistema de Gestión de Mensajes de Voz.

URV 1997. [9] PIC16F87X Data Sheet. Microchip 2001.

128

Page 130: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Bibliografía.

5.2 Páginas Web Consultadas [10] http://www.microchip.com [11] http://www.altera.com [12] http://quantum.ucting.udg.mx/~mariocc/sisdos11.html [13] http://personal.redestb.es/castillo/program1.html [14] http://www.epanorama.net [15] http://www.web-tronics.com/74hc-high-speed-series.html [16] http://www.farnell.com

129

Page 131: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Proyecto Final de Carrera

Reloj de Ajedrez para Ciegos

VOLUMEN 2: ANEXO A. MANUAL DEL USUARIO

AUTOR: Carlos Massa Amado.

DIRECTOR: José Luis Ramírez Falo.

FECHA: Enero / 2002.

Page 132: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Manual del usuario.

MANUAL DEL USUARIO

1 Diagrama del Prototipo

2 Como Iniciar una Partida

3 Como Configurar un Nuevo Modo de Partida

4 Como Configurar el Modo Manual

5 Como Parar el Reloj

6 Como Escuchar el Tiempo Restante

1

Page 133: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Manual del usuario.

1 Diagrama del Prototipo

p t

Figura 1. Diagrama del Reloj de Aje (a) vista superior (b) vi

Como se puede observar en la figura 1botones y conectores:

• Un conmutador de partida para para

• Cuatro botones para pedir el tiempocomo para configurar el tiempo de l

2

Mode Se

Next U

drez para Ciegos; sta frontal.

, el reloj cuenta con los siguientes

r el reloj del jugador que lo pulsa.

restante propio y del adversario, así a partida.

Page 134: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Manual del usuario.

• Un interruptor de Encendido / Apagado.

• Dos conectores para dos auriculares.

• Una pantalla LCD de ocho dígitos donde se muestra el tiempo restante para cada jugador.

La pantalla está dividida en dos grupos de cuatro dígitos cada uno. Los cuatro de la izquierda muestran información del tiempo restante para el jugador A y los cuatro de la derecha para el jugador B. Para mostrar el tiempo se usan 3 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, y si ha caído la bandera de alguno de los dos jugadores.

2 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, cambie de posición el conmutador de partida. El tiempo del jugador que tiene el conmutador levantado empezará a correr.

En caso de que esté jugando una partida y quiera iniciar una nueva sin tener que apagar el reloj, pulse a la vez el botón mode y el botón up durante aproximadamente un segundo. Aparecerá en pantalla de nuevo el tiempo configurado para la última partida. El reloj queda listo para empezar a jugar.

3 Como Configurar un Nuevo Modo de Partida

Después de encender el reloj pulse el botón set durante aproximadamente un segundo para cambiar la configuración de la partida. Aparecerá el símbolo en los dos dígitos centrales para indicarle que se encuentra en modo de configuración del tiempo de partida. Pulsando el botón mode podrá cambiar entre los seis modos que vienen predefinidos con el reloj y el modo manual. La secuencia de configuraciones que se mostrarán en pantalla es la siguiente:

3

Page 135: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Manual del usuario.

Vea el apartado 4 para configurar una partida en Modo Manual.

Para seleccionar cualquiera de estos modos y empezar una nueva partida, vuelva a pulsar el botón set durante aproximadamente un segundo mientras se representa la configuración deseada en pantalla. Desaparecerá el símbolo en los dos dígitos centrales y el reloj queda listo para empezar una nueva partida cambiando el conmutador de posición.

4 Como Configurar el Modo Manual

El apartado 3 muestra como llegar hasta la configuración en Modo Manual. Una vez esté en este tipo de configuración, verá en pantalla la última configuración de tiempo que se hizo manualmente. Los tres primeros dígitos corresponden al tiempo de Control y los tres últimos al tiempo de Finish. El tiempo de partida que configuremos servirá para los dos jugadores. Si desea jugar una nueva partida con el tiempo representado en pantalla, pulse el botón set durante un segundo. Desaparecerá el símbolo en los dos dígitos centrales y el reloj queda listo para empezar una nueva partida cambiando el conmutador de posición.

Si desea cambiar el tiempo puede realizar las siguientes acciones:

• Pulse el botón next para conmutar entre el tiempo de Control y el tiempo de Finish. El símbolo cambia entre el cuarto y el quinto dígito, según queramos configurar el tiempo de Control o de Finish, respectivamente. Para configurar uno de los dos, dejar el símbolo en la posición que se quiera configurar.

• Pulsar el botón up una vez para aumentar un minuto al contador. Dejar pulsado este botón para aumentar rápidamente el contador en incrementos de un minuto. El tiempo se muestra en formato minutos.segundos o horas.minutos. Si se quiere poner a cero el contador, pulsar el botón next mientras se tiene el botón up pulsado.

• Una vez tenga el tiempo de Control y/o el tiempo de Finish configurados a su gusto, pulse el botón set durante aproximadamente un segundo. Desaparecerá el símbolo en los dos dígitos centrales y el reloj queda listo para empezar una nueva partida cambiando el conmutador de posición.

4

Page 136: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Manual del usuario.

5 Como Parar el Reloj

Es posible parar el reloj en el transcurso de una partida poniendo el conmutador en posición central. En este estado los dos dígitos se ponen en blanco y los dos relojes están parados. Para continuar la partida basta con poner el conmutador en cualquiera de las dos posiciones posibles. Esta prestación es de ayuda cuando se requiere la intervención del árbitro para discutir una jugada conflictiva.

6 Como Escuchar el Tiempo Restante

Para poder escuchar el tiempo restante conecte un auricular en cada conector. Durante el transcurso de una partida, los botones set, mode, next y up sirven para hacer una petición de audio del tiempo restante. Cada jugador tiene dos botones: uno para escuchar su tiempo restante y otro para escuchar el tiempo de su contrincante. Pulsando el botón que se encuentra más cerca de usted, escuchará el tiempo restante que le queda, en el formato horas.minutos o minutos.segundos. Pulsando el otro botón escuchará el tiempo restante de su contrincante.

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.

5

Page 137: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Proyecto Final de Carrera

Reloj de Ajedrez para Ciegos

VOLUMEN 3: ANEXO B. ESQUEMAS Y SIMULACIÓN DE LA FPGA CON MAX + PLUS II DE ALTERA.

CHIPS UTILIZADOS.

AUTOR: Carlos Massa Amado.

DIRECTOR: José Luis Ramírez Falo.

FECHA: Enero / 2002.

Page 138: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

ANEXO B

1 Esquemas y Simulación de la FPGA con MAX+PLUS II de Altera.

2 Chips Utilizados

1

Page 139: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

1 Esquemas y Simulación de la FPGA con MAX+PLUS II de Altera

En las páginas que siguen se han incluido los esquemas generados para implementar el interface entre el Módulo de Control y el Módulo de audio. También se ha incluido parte del archivo de simulación .scf generado con el programa MAX+PLUS II, y el archivo .rpt de información de la implementación del circuito en la FPGA.

A continuación se enumeran los esquemas y códigos que se han incluido por orden de aparición:

• Esquema general del Modulo de Audio

• Código del bloque Control_modulo_audio

• Código del bloque latch_pic

• Esquema del bloque Latch_a_o_b

• Esquema del bloque Contador13a

• Esquema del bloque Contador13b

• Esquema del bloque Cnt_a_o_b

• Formas de onda de las entradas y salidas de la FPGA

• Archivo de información .rpt

2

Page 140: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

3

Page 141: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

SUBDESIGN Control_Modulo_Audio

(

clk, reset : INPUT;

pic_c1, pic_c0, and_cnt_a, and_cnt_b : INPUT;

Z[3..0] : OUTPUT;

)

VARIABLE

cma: MACHINE OF BITS (Z[3..0])

WITH STATES (

s0 = B"1101",

s1 = B"0110",

s2 = B"0010",

s3 = B"1010",

s4 = B"0010");

BEGIN

cma.clk = clk;

cma.reset = reset;

TABLE

cma, pic_c1, pic_c0, and_cnt_a, and_cnt_b => cma;

s0, 0, 0, x, x => s0;

s0, 0, 1, x, x => s1;

s0, 1, 0, x, x => s3;

s1, 0, 0, 1, x => s0;

s1, 0, 0, 0, x => s1;

s1, 1, 0, 0, x => s2;

s2, x, x, 1, x => s3;

s2, x, x, 0, x => s2;

s3, 0, 0, x, 1 => s0;

s3, 0, 0, x, 0 => s3;

s3, 0, 1, x, 0 => s4;

4

Page 142: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

s4, x, x, x, 1 => s1;

s4, x, x, x, 0 => s4;

END TABLE;

END;

SUBDESIGN latch_pic

(

clk, reset, PIC_D[5..0], PIC_C[1..0] : INPUT;

PIC_DA[5..0], PIC_DB[5..0] : OUTPUT;

)

VARIABLE

ss: MACHINE WITH STATES (s0, s1, s2);

A[5..0], B[5..0] : LATCH;

BEGIN

ss.clk = clk;

ss.reset = reset;

CASE ss IS

WHEN s0 =>

A[5..0].ENA = GND;

B[5..0].ENA = GND;

A[5..0].D = A[5..0].Q;

B[5..0].D = B[5..0].Q;

PIC_DA[5..0] = A[5..0].Q;

PIC_DB[5..0] = B[5..0].Q;

IF (PIC_C1&!PIC_C0) THEN

ss = s1;

5

Page 143: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

ELSIF (!PIC_C1&PIC_C0) THEN

ss = s2;

ELSE

ss=s0;

END IF;

WHEN s1 =>

A[5..0].ENA = VCC;

B[5..0].ENA = GND;

A[5..0].D = PIC_D[5..0];

B[5..0].D = B[5..0].Q;

PIC_DA[5..0] = A[5..0].Q;

PIC_DB[5..0] = B[5..0].Q;

ss=s0;

WHEN s2 =>

A[5..0].ENA = GND;

B[5..0].ENA = VCC;

B[5..0].D = PIC_D[5..0];

A[5..0].D = A[5..0].Q;

PIC_DA[5..0] = A[5..0].Q;

PIC_DB[5..0] = B[5..0].Q;

ss=s0;

END CASE;

END;

6

Page 144: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

7

Page 145: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

8

Page 146: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

9

Page 147: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

10

Page 148: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

SIMULACIÓN DEL FUNCIONAMIENTO DE LA FPGA. ENTRADAS / SALIDAS.

11

Page 149: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

ARCHIVO .RPT GENERADO EN LA COMPILACIÓN

Project Information d:\max2work\modulo_audio.dir\modulo_audio.rpt MAX+plus II Compiler Report File Version 10.1 06/12/2001 Compiled: 01/02/2002 00:03:49 Copyright (C) 1988-2001 Altera Corporation Any megafunction design, and related net list (encrypted or decrypted), support information, device programming or simulation file, and any other associated documentation or information provided by Altera or a partner under Altera's Megafunction Partnership Program may be used only to program PLD devices (but not masked PLD devices) from Altera. Any other use of such megafunction design, net list, support information, device programming or simulation file, or any other related documentation or information is prohibited for any other purpose, including, but not limited to modification, reverse engineering, de-compiling, or use with any other silicon devices, unless such use is explicitly licensed under a separate agreement with Altera or a megafunction partner. Title to the intellectual property, including patents, copyrights, trademarks, trade secrets, or maskworks, embodied in any such megafunction design, net list, support information, device programming or simulation file, or any other related documentation or information provided by Altera or a megafunction partner, remains with Altera, the megafunction partner, or their respective licensors. No other licenses, including any licenses needed under any third party's intellectual property, are provided herein. ***** Project compilation was successful ** DEVICE SUMMARY ** Chip/ Input Output Bidir Shareable POF Device Pins Pins Pins LCs Expanders % Utilized modulo_audio EPM7128ELC84-7 10 20 0 64 2 50 % User Pins: 10 20 0 Project Information d:\max2work\modulo_audio.dir\modulo_audio.rpt ** PROJECT COMPILATION MESSAGES ** Warning: GLOBAL primitive on node 'clk' feeds logic -- non-global signal usage may result Project Information d:\max2work\modulo_audio.dir\modulo_audio.rpt

12

Page 150: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

** AUTO GLOBAL SIGNALS ** INFO: Signal 'clk' chosen for auto global Clock Project Information d:\max2work\modulo_audio.dir\modulo_audio.rpt ** PIN/LOCATION/CHIP ASSIGNMENTS ** Actual User Assignments Assignments (if different) Node Name modulo_audio@83 clk modulo_audio@64 EPROM0 modulo_audio@68 EPROM1 modulo_audio@63 EPROM2 modulo_audio@70 EPROM3 modulo_audio@54 EPROM4 modulo_audio@61 EPROM5 modulo_audio@60 EPROM6 modulo_audio@65 EPROM7 modulo_audio@58 EPROM8 modulo_audio@56 EPROM9 modulo_audio@55 EPROM10 modulo_audio@69 EPROM11 modulo_audio@67 EPROM12 modulo_audio@57 EPROM13 modulo_audio@45 EPROM14 modulo_audio@51 EPROM15 modulo_audio@46 EPROM16 modulo_audio@50 EPROM17 modulo_audio@48 EPROM18 modulo_audio@30 PIC_C0 modulo_audio@11 PIC_C1 modulo_audio@4 PIC_D0 modulo_audio@6 PIC_D1 modulo_audio@8 PIC_D2 modulo_audio@21 PIC_D3 modulo_audio@9 PIC_D4 modulo_audio@5 PIC_D5 modulo_audio@10 RESET modulo_audio@73 Z0 Project Information d:\max2work\modulo_audio.dir\modulo_audio.rpt ** STATE MACHINE ASSIGNMENTS ** |latch_pic:12|ss: MACHINE OF BITS (

13

Page 151: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

|latch_pic:12|ss~2, |latch_pic:12|ss~1 ) WITH STATES ( s0 = B"00", s1 = B"01", s2 = B"11" ); |control_modulo_audio:26|cma: MACHINE OF BITS ( |control_modulo_audio:26|cma~1, |control_modulo_audio:26|Z3~, |control_modulo_audio:26|Z2~, |control_modulo_audio:26|Z1~, |control_modulo_audio:26|Z0~ ) WITH STATES ( s0 = B"01101", s1 = B"00110", s2 = B"00010", s3 = B"01010", s4 = B"10010" ); Project Information d:\max2work\modulo_audio.dir\modulo_audio.rpt ** FILE HIERARCHY ** |latch_pic:12| |latch_a_o_b:13| |cnt_a_o_b:16| |contador13a:22| |contador13a:22|7493:1| |contador13a:22|7493:26| |contador13a:22|7493:21| |contador13b:23| |contador13b:23|7493:1| |contador13b:23|7493:26| |contador13b:23|7493:21| |control_modulo_audio:26| Device-Specific Information: d:\max2work\modulo_audio.dir\modulo_audio.rpt modulo_audio ***** Logic for device 'modulo_audio' compiled without errors.

14

Page 152: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

Device: EPM7128ELC84-7 Device Options: Turbo Bit = ON Security Bit = OFF MultiVolt I/O = OFF R R R R R R E E E E E E P P P P P P V S S S S S S I R I I I I I C E E E V E E E C E C C C C C C R R R C R R R _ S _ _ G _ _ _ I G G G c G V V V C V V V C E D D N D D D N N N N l N E E E I E E E 1 T 4 2 D 1 5 0 T D D D k D D D D O D D D -----------------------------------------------------------------_ / 11 10 9 8 7 6 5 4 3 2 1 84 83 82 81 80 79 78 77 76 75 | RESERVED | 12 74 | RESERVED VCCIO | 13 73 | Z0 RESERVED | 14 72 | GND RESERVED | 15 71 | RESERVED RESERVED | 16 70 | EPROM3 RESERVED | 17 69 | EPROM11 RESERVED | 18 68 | EPROM1 GND | 19 67 | EPROM12 RESERVED | 20 66 | VCCIO PIC_D3 | 21 65 | EPROM7 RESERVED | 22 EPM7128ELC84-7 64 | EPROM0 RESERVED | 23 63 | EPROM2 RESERVED | 24 62 | RESERVED RESERVED | 25 61 | EPROM5 VCCIO | 26 60 | EPROM6 RESERVED | 27 59 | GND RESERVED | 28 58 | EPROM8 RESERVED | 29 57 | EPROM13 PIC_C0 | 30 56 | EPROM9 RESERVED | 31 55 | EPROM10 GND | 32 54 | EPROM4 |_ 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 _| ------------------------------------------------------------------ R R R R R V R R R G V R E E G E R E E R V E E E E E C E E E N C E P P N P E P P E C S S S S S C S S S D C S R R D R S R R S C E E E E E I E E E I E O O O E O O E I R R R R R O R R R N R M M M R M M R O V V V V V V V V T V 1 1 1 V 1 1 V E E E E E E E E E 4 6 8 E 7 5 E D D D D D D D D D D D N.C. = No Connect. This pin has no internal connection to the device. VCCINT = Dedicated power pin, which MUST be connected to VCC (5.0 volts). VCCIO = Dedicated power pin, which MUST be connected to VCC (5.0 volts).

15

Page 153: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

GND = Dedicated ground pin or unused dedicated input, which MUST be connected to GND. RESERVED = Unused I/O pin, which MUST be left unconnected. Device-Specific Information: d:\max2work\modulo_audio.dir\modulo_audio.rpt modulo_audio ** RESOURCE USAGE ** Shareable External Logic Array Block Logic Cells I/O Pins Expanders Interconnect A: LC1 - LC16 0/16( 0%) 7/ 8( 87%) 0/16( 0%) 0/36( 0%) B: LC17 - LC32 0/16( 0%) 1/ 8( 12%) 0/16( 0%) 0/36( 0%) C: LC33 - LC48 0/16( 0%) 1/ 8( 12%) 0/16( 0%) 0/36( 0%) D: LC49 - LC64 0/16( 0%) 0/ 8( 0%) 0/16( 0%) 0/36( 0%) E: LC65 - LC80 16/16(100%) 5/ 8( 62%) 9/16( 56%) 21/36( 58%) F: LC81 - LC96 16/16(100%) 7/ 8( 87%) 3/16( 18%) 23/36( 63%) G: LC97 - LC112 16/16(100%) 7/ 8( 87%) 0/16( 0%) 18/36( 50%) H: LC113 - LC128 16/16(100%) 1/ 8( 12%) 6/16( 37%) 33/36( 91%) Total dedicated input pins used: 1/4 ( 25%) Total I/O pins used: 29/64 ( 45%) Total logic cells used: 64/128 ( 50%) Total shareable expanders used: 2/128 ( 1%) Total Turbo logic cells used: 64/128 ( 50%) Total shareable expanders not available (n/a): 16/128 ( 12%) Average fan-in: 6.17 Total fan-in: 395 Total input pins required: 10 Total fast input logic cells required: 0 Total output pins required: 20 Total bidirectional pins required: 0 Total logic cells required: 64 Total flipflops required: 33 Total product terms required: 223 Total logic cells lending parallel expanders: 0 Total shareable expanders in database: 2 Synthesized logic cells: 0/ 128 ( 0%)

16

Page 154: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

Device-Specific Information: d:\max2work\modulo_audio.dir\modulo_audio.rpt modulo_audio ** INPUTS ** Shareable Expanders Fan-In Fan-Out Pin LC LAB Primitive Code Total Shared n/a INP FBK OUT FBK Name 83 - - INPUT G 0 0 0 0 0 19 0 clk 30 (37) (C) INPUT 0 0 0 0 0 1 6 PIC_C0 11 (5) (A) INPUT 0 0 0 0 0 1 6 PIC_C1 4 (16) (A) INPUT 0 0 0 0 0 0 2 PIC_D0 6 (13) (A) INPUT 0 0 0 0 0 0 2 PIC_D1 8 (11) (A) INPUT 0 0 0 0 0 0 2 PIC_D2 21 (19) (B) INPUT 0 0 0 0 0 0 2 PIC_D3 9 (8) (A) INPUT 0 0 0 0 0 0 2 PIC_D4 5 (14) (A) INPUT 0 0 0 0 0 0 2 PIC_D5 10 (6) (A) INPUT 0 0 0 0 0 1 6 RESET Code: s = Synthesized pin or logic cell t = Turbo logic cell + = Synchronous flipflop / = Slow slew-rate output ! = NOT gate push-back r = Fitter-inserted logic cell G = Global Source. Fan-out destinations counted here do not include destinations that are driven using global routing resources. Refer to the Auto Global Signals, Clock Signals, Clear Signals, Synchronous Load Signals, and Synchronous Clear Signals Sections of this Report File for information on which signals' fan-outs are used as Clock, Clear, Preset, Output Enable, and synchronous Load signals. Device-Specific Information: d:\max2work\modulo_audio.dir\modulo_audio.rpt modulo_audio ** OUTPUTS ** Shareable Expanders Fan-In Fan-Out

Pin LC LAB Primitive Code Total Shared n/a INP FBK OUT FBK Name 64 99 G OUTPUT t 0 0 0 1 3 0 0 EPROM0 68 105 G OUTPUT t 0 0 0 1 3 0 0 EPROM1 63 97 G OUTPUT t 0 0 0 1 3 0 0 EPROM2 70 109 G OUTPUT t 0 0 0 1 3 0 0 EPROM3 54 83 F OUTPUT t 0 0 0 1 3 0 0 EPROM4 61 94 F OUTPUT t 0 0 0 1 3 0 0 EPROM5 60 93 F OUTPUT t 0 0 0 1 3 0 0 EPROM6 65 101 G OUTPUT t 0 0 0 1 3 0 0 EPROM7 58 91 F OUTPUT t 0 0 0 1 3 0 0 EPROM8 56 86 F OUTPUT t 0 0 0 1 3 0 0 EPROM9

17

Page 155: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

55 85 F OUTPUT t 0 0 0 1 3 0 0 EPROM10 69 107 G OUTPUT t 0 0 0 1 3 0 0 EPROM11 67 104 G OUTPUT t 0 0 0 1 3 0 0 EPROM12 57 88 F OUTPUT t 0 0 0 1 4 0 0 EPROM13 45 67 E OUTPUT t 0 0 0 1 4 0 0 EPROM14 51 77 E OUTPUT t 0 0 0 1 4 0 0 EPROM15 46 69 E OUTPUT t 0 0 0 1 4 0 0 EPROM16 50 75 E OUTPUT t 0 0 0 1 4 0 0 EPROM17 48 72 E OUTPUT t 0 0 0 1 4 0 0 EPROM18 73 115 H FF + t 1 0 1 3 30 1 4 Z0 Code: s = Synthesized pin or logic cell t = Turbo logic cell + = Synchronous flipflop / = Slow slew-rate output ! = NOT gate push-back r = Fitter-inserted logic cell

18

Page 156: Proyecto Final de Carrera - deeea.urv.catdeeea.urv.cat/public/PROPOSTES/pub/pdf/163pub.pdf · 1.7.2 Módulo del Display: Multiplexado de 8 Dígitos de 7 Segmentos 24 1 . Reloj de

Reloj de ajedrez para ciegos. Anexo B.

2 Chips Utilizados

A continuación se incluyen las hojas de características de los integrados utilizados para realizar el montaje del proyecto.

Enumeración por orden de aparición:

• Memoria M27C256

• Amplificador operacional LM324

• Demultiplexor 74HCT238

• DAC TLC7528

• Generador de señal LM555

• Amplificador de audio LM386

• Memoria AM27C040

• FPGA EPM7128ELC84

• Microcontrolador PIC16F873.

19