Esta vez me traigo un ejercicio de programación típico, el "juego de la vida" de John Horton Conway.
No le busqueis utilidad, porque no la tiene , es un simple juego de 0 jugadores
Citando a la wikipedia:
"El juego de la vida es el mejor ejemplo de un autómata celular; es en realidad un juego de cero jugadores, lo que quiere decir que su evolución está determinada por el estado inicial y no necesita ninguna entrada de datos posterior. El "tablero de juego" es una malla formada por cuadrados ("células") que se extiende por el infinito en todas las direcciones. Cada célula tiene 8 células vecinas, que son las que están próximas a ella, incluso en las diagonales. Las células tienen dos estados: están "vivas" o "muertas" (o "encendidas" y "apagadas"). El estado de la malla evoluciona a lo largo de unidades de tiempo discretas (se podría decir que por turnos). El estado de todas las células se tiene en cuenta para calcular el estado de las mismas al turno siguiente. Todas las células se actualizan simultáneamente.
Las transiciones dependen del número de células vecinas vivas:
* Una célula muerta con exactamente 3 células vecinas vivas "nace" (al turno siguiente estará viva).
* Una célula viva con 2 ó 3 células vecinas vivas sigue viva, en otro caso muere o permanece muerta (por "soledad" o "superpoblación"). "Como en otros proyectos anteriores, intenté utilizar los mínimos recursos posibles y aprovecharlos al máximo. En este caso han sido:
- PIC12F683
- LCD Nokia3310
- 2x QT100A
Como no disponía de memoria suficiente en el PIC, he dividido la pantalla con una rejilla y así convertir la matriz de 84x48 pixels en una matriz de 25x17 (405 celdas) que sí me caben en la RAM del PIC.
El siguiente problema ha sido al calcular la generación siguiente, ya que necesitaba dos matrices de RAM, una para la generación de entrada y otra para la de salida. Lo he solucionado calculando la generación siguiente línea a línea y usando una pila tipo LIFO de 2 niveles sobre 2 variables de tipo vector.
Los elementos se disponen de forma manual, con uno de los sensores capacitivos y de forma pseudoaleatoria. El programa en el modo de colocación de individuos, ejecuta una interrupción del TIMER1 cada 0.406ms (así solo cuenta de 0 a 405 que son los elementos de la matriz ) y cada vez que se toca el sensor, lee el valor del timer y activa la celda correspondiente.
El otro sensor inicia la simulación.
Durante la simulación es posible pausarla y una vez pausada, podemos continuar o reiniciar.
El circuitoEl circuito es muy simple, como he usado componentes de bajo consumo, está alimentado por una pila de botón tipo CR2032.
El PIC se conecta al LCD nokia y sólo es necesario un condensador de 47uF para la Vout del LCD.
Los QT100A únicamente incorporan 1 condensador de desacoplo de 100nf y una red RC que ajusta la sensibilidad del sensor.
La PCBYa la había posteado en el subforo de fabricación de PCBs.
A una cara y con todos los componentes en SMD. Existen 4 jumpers por la cara posterior.
En el diseño, no he tenido en cuenta que el encapsulado WSON6 de los QT100A posee un pad tipo GND en el centro y he tenido que cubrir con rotulador las pistas que pasan bajo el encapsulado para evitar cortocircuitos.
EL interruptor ON/OFF lo he aprovechado de un MP3 portable.
Simulacion con ProteusPor si queréis ver como funciona la simulación, os dejo los ficheros de ISIS para Proteus.
Necesitaréis instalar el modelo de simulación del componente "LCD 3310".
Lo podeis descargar de:
http://www.tanu-sha.narod.ru/nokia3310.htmlAquí os dejo un vídeo del funcionamiento:
DescargasFicheros EagleFotolito PCBCodigo HEX 12F683Ficheros ProteusFuentesPodeis ver el artículo en mi blog
radikaldesig.comSalu2