TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: mtristan en 24 de Octubre de 2009, 13:01:52
-
.
Después de trabajosos meses de programación (nunca me decidía a terminarlo), he aquí mi primer contribución a los proyectos del foro. Se trata de un reloj de ajedrez bastante completo (quería que no tuviera nada que envidiarle a ningún reloj comercial). Sus características:
- Tiempo inicial de 0 a 9hs 59min y 59seg
- Posibilidad de iniciar con tiempos diferentes para cada jugador
- Posibilidad de agregar tiempo luego de cada jugada en dos modalidades:
Tiempo adicional fijo: de 0 a 9min 59seg.
Tiempo adicional relativo: se agrega el tiempo que tardó el otro jugador en su turno anterior.
- Posibilidad de usar tiempo de demora de 0 a 59seg entre que inicia nuestro turno y el reloj comienza a descontarnos tiempo.
- Límite de jugadas de 0 a 999.
- Posibilidad de usar tiempo adicional y tiempo de demora a partir de un determinado número de jugadas mínimas (las jugadas para tiempo adicional son independientes de las de demora)
- Guarda hasta 5 configuraciones de tiempo diferentes.
- Posibilidad de pausar el juego y modificar el tiempo de cualquiera de los jugadores individualmente
- Menú de configuración fácil de entender y usar
Y lo mejor: mínima cantidad de componentes: un 16F628A, un LCD alfanumérico 16x02 y tres pulsadores con resistencias pull-up.
En mis pruebas utilizo un LCD que tal vez no sea del agrado de muchos, ya que no he visto que casi nadie lo use en este foro, el Winstar WH1602. Aunque por supuesto cualquier otro puede ser usado, siempre que se modifique correctamente el archivo de subrutinas que acompaña al programa principal (todo adjunto a este mensaje).
No tengo mi cámara conmigo, pero esta tarde o mañana subiré alguna foto del prototipo (en protoboard por el momento) y algunas intrucciones de uso para el que quiera ponerse manos a la obra (no pude esperar para subir el proyecto, mil perdones :angel:)
¡Hasta entonces!
-
anda gran trabajo en ASM...a la espera de un videillo... :-/ :-/
-
A ver esas fotos. Enhorabuena y gracias por compartirlo
-
suena muy interesante uno más a la cola para ver el video y fotos
felicidades por el trabajo
-
:-/ Felicidades! Y en ASM !!! :mrgreen:
Saludos!
-
.
Pues he aquí una foto de cómo quedó:
(http://img405.imageshack.us/img405/5087/pa250004.jpg) (http://img405.imageshack.us/i/pa250004.jpg/)
(Los pulsadores negros corresponden a JD y JI. El rojo a OK. El LED verde me gusta ponerlo cada vez que uso el protoboard para asegurarme que está conectada la alimentación)
Cada vez que se energiza el reloj, el LCD se inicializa y muestra la primer pregunta ¿Iniciar iguales?:
(http://img36.imageshack.us/img36/4743/pa250006v.th.jpg) (http://img36.imageshack.us/i/pa250006v.jpg/)
Si se presiona el pulsador JI (del lado de la opción SI) nos mostrará lo siguiente:
(http://img11.imageshack.us/img11/1815/pa250007.th.jpg) (http://img11.imageshack.us/i/pa250007.jpg/)
Los números de la primer línea son los que iremos cambiando hasta llegar al valor numérico deseado, corresponden al formato h:mm:ss (horas, minutos y segundos). En la segunda línea se muestra una flecha apuntando hacia arriba, indicando el dígito que se está modificando en ese momento. Para esto pulsamos JD y JI para incrementar o decrementar el númeo sobre la flecha. Una vez llegado al número buscado, pulsamos el botón OK y la flecha se mueve hacia la izquierda; ahora modificamos el nuevo número sobre la flecha. Si llegamos al último número de la izquierda y pulsamos OK, la flecha va a parar al primero de la derecha. Si al momento de la pregunta se eligió la opción NO, tendremos que hacer esto 2 veces, una para cada jugador. El display va a mostrar una flecha a la derecha o a la izquierda según estemos ingresando el tiempo para el jugador de la derecha o la izquierda.
(http://img199.imageshack.us/img199/3971/pa250008q.th.jpg) (http://img199.imageshack.us/i/pa250008q.jpg/)
Una vez llegado al tiempo inicial deseado, mantenemos pulsado OK y apretamos JI o JD (cualquiera de los dos) y pasamos a la pregunta siguiente: ¿Tiempo adicional?
Si elegimos NO, pasamos a la próxima pregunta. Si elegimos sí, nos dará a elegir entre las dos modalidades posibles: relativo (REL) o fijo (FIJO). Elegimos fijo y aparecerá algo similar a lo que mostró a la hora de ingresar el tiempo inicial, solo que en el formato m:ss. El modo de modificar este tiempo es el mismo que en el paso anterior. Ahora nos pedirá el mínimo de jugadas necesarias para que el reloj comienenze a usar el tiempo adicional; mostrará LUEGO DE J 000.
(http://img38.imageshack.us/img38/9093/pa250009.th.jpg) (http://img38.imageshack.us/i/pa250009.jpg/)
Modificamos los números 000 y el tiempo inicial se activará "luego de la jugada" que hayamos ingresado.
(http://img514.imageshack.us/img514/6567/pa250010.th.jpg) (http://img514.imageshack.us/i/pa250010.jpg/)
Ahora la siguiente pregunta será ¿Tiempo de demora? Si elegimos NO, pasamos a la próxima pregunta. Si elegimos SI, ingresamos los segundos de demora que queramos y las jugadas mínimas para que se activen.
Siguiente pregunta: ¿Jugadas máximas? Elegimos que NO y pasamos a la siguiente pregunta (en realidad seteamos también en 999 el número de jugadas máximas). Elegimos SI e ingresamos el número de jugadas máximas (vale la pena aclarar que el número que seleccionemos será el número máximo "inclusive" de jugadas máximas).
Siguiente pregunta: ¿Guardar configuración?. Elegimos NO y pasamos a la pantalla principal del juego (por fin). Elegimos SI y pedirá ingresar el número de posición en el cual guardamos la configuración.
Ahora sí: la pantalla principal del juego:
(http://img195.imageshack.us/img195/4328/pa250011t.th.jpg) (http://img195.imageshack.us/i/pa250011t.jpg/)
En la línea superior muestra los tiempo actuales de cada jugador. En la inferioir (de izquierda a derecha) el tiempo adicional seleccionado, las jugadas totales (se inician en 000) y el tiempo de demora seleccionado. El signo de exclamación al lado de los tiempos adicional y de demora indica que aún no se alcanzaron las jugadas mínimas para que se activen; desaparecen cuando las se llega a tales jugadas.
Para pausar el juego en cualquier momento, pulsamos OK y aparecerá en el centro de la línea superior la letra P acompañada de una flecha que indica cuál jugador estaba en su turno antes de entrar en modo pausa. Para salir de este modo, pulsamos OK nuevamente y sigue descontando al jugador al cual apunta la flecha. Para modificar el tiempo de cualquier jugador en modo pausa, presionamos el botón JD o JI, para modificar al jugador derecho o izquierdo respectivamente.
(http://img237.imageshack.us/img237/3034/pa250012.th.jpg) (http://img237.imageshack.us/i/pa250012.jpg/)
Por último, para cargar una configuración guardada anteriormente, mantenemos pulsado alguno de los pulsadores JI o JD (cualquiera de ellos) antes de energizar el reloj y lo sostenemos mientras lo energizamos hasta que el display pida la posición de la cual se quiere cargar. Luego de esto, se pasa directamente a la pantalla principal de juego.
.
Espero que haya gustado y que alguien se interese en hacerlo :mrgreen:. Estoy a disposición para cualquier consulta.
¡Saludos!
-
:-/ :-/ :-/ :-/ :-/ :-/ :-/ gran trabajo ...El ASM de lejitos :2]
-
Muy bien, felicitaciones. Te quedó excelente :-/ :-/ :-/
-
.
Muchas gracias por sus comentarios alagadores :oops: jaja.
La verdad el desafío no fue hacerlo en ASM, ¡Sino hacerlo sin ICSP ni simulador! Quién sabe cuántas veces lo saqué del protoboard, lo puse en el programador, lo devolví al protoboard, lo saqué devuelta, lo programé de vuelta...
-
Muy buen aporte, y te felicito por la claridad de la programación y los comentarios !!
-
Hola Estoy viendo tu reloj yo tambien juego ajedrez y siempre he querido hacer un reloj.....
No veo el equivalente a la bandera cuando se va a acabar el tiempo para que el jugador que este en este problema se apure
y no pierda por tiempo
Esta señalado en el LCD??? :?
Sergio
Gracias por compartir
-
Muy bueno el relojito, hay de todo en el foro desde relojes para ajedrez hasta relojes cariñosos (http://www.todopic.com.ar/foros/index.php?topic=28508.0).
Saludos
-
Muy bueno el reloj, y bueno programacion!
jajajajajajjaajjajjaja!!!! Reloj cariñoso!!! No habia visto!!! jajaja!!!
-
.
Por desgracia no pude incluir todo lo que me hubiese gustado en el reloj :sad:, debido a un tema de memoria del pic (no recuerdo bien los números, pero no me sobraron más de 20 bytes de memoria de programa). Incluso tuve que quitar pedazos y rehacer todo nuevamente para que me entrara.
Sería interesante poner un aviso (yo pensaba en hacer titilar el backlight, por ej) cuando el tiempo restante esté debajo de un cierto límite, y habilitar la modificación de los tiempos de retraso y demora durante las pausas, entre otras cosas . Pero para eso habría que poner otro microcontrolador, cosa que de momento no está en mis planes, pero animo a quien se anime y ofrezco mi ayuda si es necesario ;-).
-
.
Acá dejo un esquemático del reloj.
(http://img710.imageshack.us/img710/8752/relojajedrez.png) (http://img710.imageshack.us/img710/8752/relojajedrez.png)
Recuerdo al interesado que la disposición de los pines del Puerto A puede variar a su gusto, solo basta con modificar los números que aparecen debajo del comentario PORTA I/O, en el inicio del programa.
-
.
Ya tengo pensada y espero poder tener lista para fin de año la nueva versión del reloj. No quiero adelantar nada para no arruinar la sorpresa ;-)
Así que si alguien está por hacer su reloj, tal vez quiera esperar unos meses más.
¡Saludos!
-
Felicidades aunq soy algo nuevo en lo que es programacion en Pic, yo programo mas en PicBasic Pro, seria mucha molestia si alguien me explica como programar lo mismo en PicBasic Pro
-
.
Mm.. Yo de Basic no se nada. Pero como es de alto nivel seguramente el programa ocupe más memoria que en asm.. Y para este proyecto, con ese uC, me sobraron 20 bytes de memoria nomás. Así que no creo que pueda hacerse en un 16F628A en Basic. Sí con algún otro.
¡Saludos!
-
.
Mm.. Yo de Basic no se nada. Pero como es de alto nivel seguramente el programa ocupe más memoria que en asm.. Y para este proyecto, con ese uC, me sobraron 20 bytes de memoria nomás. Así que no creo que pueda hacerse en un 16F628A en Basic. Sí con algún otro.
¡Saludos!
Gracias por responder, yo tengo pensado usar un Pic16F877A con lo que el problema de memoria se puede resolver... :) Lo q no logro hacer son el manejo de interrupciones, o podria explicarnos la logica del programa de detener uno y poner el otro reloj a funcionar, yo vi un cronometro q usa interrupciones y yo trate de hacerlo asi solo q dos cronometros en retroceso pero no me funciona bien... Bueno agradeceria cualquier forma que me pueda apoyar...
De nuevo gracias por responder
-
Y ya q usted como varios q pasamos por este foro, amamos al ajedrez, que tal el proyecto de hacer un tablero con comunicacion a la PC de alta velocidad para captar todas las movidas incluso en la modalidad de ping-pong, asi hasta 3 minutos la partida, si usamos como una matriz se necesitaria 16 salidas y creo q un pic 16f877a soporta las 16 salidas, ahora para nuestra comunicacion con Pc un pic18f4550 me se las funciones de los pic mas no me se la forma de comunicarlos pic a pic ni pic a pc... Que tal si es usted asi de mucha mas experiencia q varios de nosotros puede usted proponer el tema y a ver si se interesan los expertos en comunicacion Pic-Pc y logramos nuestro tablero de ajedrez para retransmisiones o cosas por el estilo...
Salu2...
Y gracias por responder...
-
.
(...) podria explicarnos la logica del programa de detener uno y poner el otro reloj a funcionar (...)
Al iniciar la programación tuve que optar por 2 maneras de controlar los tiempos: una era tener registros en la ram que almacenaran los tiempos actuales de cada jugador en todo momento, y la otra era leer del módulo LCD los tiempos a medida que los necesitaba. Elegí esta última porque presentaba una ventaja: todo lo que tenía que hacer para cambiar de reloj era leer y escribir en posiciones distintas de la pantalla del LCD. Entonces lo que tengo guardadas son las direcciones desde donde tengo que leer/escribir:
LCDH1 ; VARIABLES PUNTERO A TIEMPO EN EL LCD.
LCDM10 ; GUARDAN LA INSTRUCCION PARA ACCEDER A LA DIRECCION DEL DDRAM DEL LCD CORRESPONDIENTE AL
LCDM1 ; JUGADOR AL CUAL SE LE ESTA MODIFICANDO EL TIEMPO).
LCDS10 ; POR EJ, SI SE LE ESTA RESTANDO TIEMPO AL DERECHO, EL REGISTRO LCDS1 GUARDARA 0x8F.
LCDS1
Cuando se pulsa para terminar el turno, lo único que hay que hacer es modificar estos registros y poner en ellos las direcciones correspondientes al reloj de la derecha o al de la izquierda. El programa hace siempre lo mismo, simplemente va a las direcciones indicadas por estos registros sin preguntarse nunca de cuál reloj está leyendo.
De esta forma, el uC nunca sabe cuánto tiempo tiene cada reloj, pero realmente no es necesario que lo sepa ;-)
Es más, aunque no esté implementado en esta versión, es posible retomar el programa sin problemas en caso de un reset, dado que los valores de tiempo están seguros en la memoria del LCD.
Sobre la posibilidad de un proyecto para una interfaz para PC con forma de tablero real.. Debo admitir que ya lo vengo pensando hace tiempo. La idea es tener un pequeño brazo robótico que mueva por el oponente, para poder jugar por internet de manera un poco más real. Ayer estuve viendo unos videos y se me ocurrió que podría empezarse con un tablero sin brazo, conectado a la PC (por USB, o lo que sea.. incluso podría ser bluetooth) que tenga casilleros más o menos transparentes y que, por medio de luces debajo de ellos, indiquen los movimientos contrarios. Lo más desafiante sería la implementación del soft para PC :?
Aunque por ahora no tengo planeado empezar con esto.. porque tengo varias cosas que terminar primero jajaja. Pero seguro lo haré pronto..
¡Saludos!
-
Gracias por el apoyo, cuando logre armarlo con el picbasic pro te lo paso... Salu2
-
mtristan si fueras tan amable de colgar le .hex porque he probado tu programa y se me cuelga creo que tengo alguna configuración mal colocada
-
.
Perdón, fue una torpeza no haber subido el hex en el primer mensaje :oops: Ahí lo adjunto (reloj_lcd.hex... si mal no recuerdo es éste :mrgreen:).
¿Cómo es eso de que se te cuelga? ¿Al compilar o ejecutándolo en el pic?
¡Saludos!
-
Se me colgaba ejecutando nunca iniciaba voy a probar con el hex que pones
-
.
Ok. Una duda ¿estabas simulando o probando en un uC real?
-
mtristan .....eres un G E N I OOOOOOOOOO.................... , Gracias
-
Muy bueno, lo voy a armar, gracias por compartirlo.