Archivos del proyecto: https://drive.google.com/file/d/0BwRjSZDe85-IU0c5aXdIMGRiMU0/view?usp=sharing&resourcekey=0-w2hZC8jVOetK8k9q3W4g9A
Reloj digital, utilizando displays de 7 segmentos para mostrar la hora. Cuenta con la opción de editar la hora utilizando botones, y con segundero para mejor visualización.
Características:
- Reloj de 12 horas.
- Se entra al "modo de edición" al presionar dicho botón.
- El segundero se reinicia al entrar al modo edición,
- Se aumenta la hora al presionar el botón hora, y los minutos al presionar el botón minuto.
- Para salir del modo edición, se presionan el botón de nuevo..
- Protoboard
- PIC16F628A
- Decodificador BCD a 7 Segmentos(74LS47)
- 6 Displays de 7 Segmentos de ánodo común
- 3 Push buttons
- 1 Led
- 3 Resistencias de 220 Ohms
- Batería de 9V
- Porta Pila
- Cable para conexiones
Diagrama de Conexiones
Nota: En el diagrama se omiten las conexiones a tierra y corriente del PIC y el decodificador por simplicidad, puedes ver el diagrama del PIC AQUÍ, y el decodificador AQUÍ, para ver en que pin conectarlos.
Funcionamiento
El microcontrolador PIC es el responsable de todas las funciones del circuito. El circuito proveerá las salidas en binario para poder mostrar los diferentes números en los displays mediante el puerto B.
Ejemplo: Si desearamos mostrar el número 7 en los display, daríamos el valor binario 0111, al puerto B, lo que el decodificador 74LS47 pasaría a las salidas para poder mostrar un 7 en los displays.
Ejemplo: Si desearamos mostrar el número 7 en los display, daríamos el valor binario 0111, al puerto B, lo que el decodificador 74LS47 pasaría a las salidas para poder mostrar un 7 en los displays.
De esta forma podemos mostrar el número que deseemos en los displays, pero debido a que las conexiones de los displays están multiplexadas, normalmente se mostraría el mismo número en todos los displays(algo que no nos conviene ya que queremos un reloj). Esto lo arreglará el PIC, prendiendo y apagando los displays en cuestión de segundos para poder dar la apariencia al ojo humano de que no están parpadeando, y muestran diferentes números. Si deseas saber más sobre multiplexación, puedes leer este post que realice con un ejemplo más sencillo.
Obviamente nosotros no queremos mostrar cualquier número en los displays, queremos mostrar la hora, usando un timer. Esto significa que los displays cambiarán con el tiempo, cada uno dependiendo de los demás. Por ejemplo cuando las unidades del segundero lleguen a un número mayor a 10, estos se deben reiniciar a 0, y sumar uno a la decena del segundero. Entonces cuando el segundero llegue a 6 (que serían 60 segundos), se debe reiniciar también, y aumentar 1 a los minutos, y así sucesivamente.
El PIC se encargara de toda esta lógica.
Pero medir los segundos no es tarea fácil, agregando además que tenemos que dar retrasos entre el código para poder visualizar correctamente los displays multiplexados, por esto me fue difícil ajustar el reloj lo más posible a los segundos, ya que no pude determinar cuanto tiempo tarda en ejecutar código, para compensarlo y ajustar el segundero lo mejor posible.
Ahora, el reloj sería inservible si solo se reiniciara al apagarlo y no nos diera la opción de editarlo. Por lo tanto se da la opción de editar las horas y minutos mediante dos push buttons. Al presionar el botán de editar, el reloj se detendrá y se pondrá a las 12:00, reiniciando los segundos a 0. Entonces presionando el botón hora, el PIC detectará el alto voltaje y aumentará en 1 las horas (que pasará a ser la 1, ya que es un reloj de 12 horas). Lo mismo con el botón de minutos.
Al desconectar el circuito, el reloj se reiniciará, y la próxima vez que se conecte estará en las 12 en punto.
Código
Pruebas
Las siguientes pruebas fueron hechas poniendo a funcionar el reloj, al mismo tiempo que el reloj de una computadora. Cabe destacar que estas pruebas no son perfectas, ya que existe el error humano de si en realidad empezaron los dos relojes al mismo tiempo(cosa que obviamente no sucedió). En la primera medición, hubo un total de 9 segundos de retraso en 1 hora, lo cual no es nada eficiente, y no sería aceptable en un reloj. En la segunda medición, después de algunas modificaciones a la programación del PIC, el retraso se redujo a poco menos de 1 segundo por hora, lo que sigue siendo ineficiente, pero fue lo más preciso a lo que pude llegar, sin utilizar un oscilador externo.
Las siguientes pruebas fueron hechas poniendo a funcionar el reloj, al mismo tiempo que el reloj de una computadora. Cabe destacar que estas pruebas no son perfectas, ya que existe el error humano de si en realidad empezaron los dos relojes al mismo tiempo(cosa que obviamente no sucedió). En la primera medición, hubo un total de 9 segundos de retraso en 1 hora, lo cual no es nada eficiente, y no sería aceptable en un reloj. En la segunda medición, después de algunas modificaciones a la programación del PIC, el retraso se redujo a poco menos de 1 segundo por hora, lo que sigue siendo ineficiente, pero fue lo más preciso a lo que pude llegar, sin utilizar un oscilador externo.
Medición 1 | Medición 2 | ||
Hora | Retraso | Hora | Retraso |
01:05 | Ninguno | 5:49 | Ninguno |
01:11 | 1 Segundo | 6:07 | Ninguno |
01:14 | 1 Segundo | 6:11 | Ninguno |
01:16 | 2 Segundos | 6:15 | Ninguno |
01:20 | 2 Segundos | 6:18 | Ninguno |
01:25 | 3 Segundos | 6:23 | Ninguno |
01:35 | 4 Segundos | 6:26 | Ninguno |
01:44 | 6 Segundos | 6:31 | Ninguno |
01:52 | 7 Segundos | 6:35 | Ninguno |
2:05 | 9 Segundos | 6:42 | Casi un segundo |
Fotos del Circuito:
Referencias:
Hola de casualidad no tienes el hex? me da error al compilar en la linea 18 : syntaxs error. o que programa usaste para compilar el soft, seria el pic basic? Saludos
ResponderEliminarHola, para compilarlo utilicé Mikrobasic PRO, que seguramente compila diferente a pic basic y por eso el error. De todas formas aquí puedes descargar todos los archivos del proyecto, incluyendo el .hex.
ResponderEliminarhttps://docs.google.com/open?id=0BwRjSZDe85-IU0c5aXdIMGRiMU0
Saludos :)
Buenas Tardes
ResponderEliminarPor favor podrias revisar el link del proyecto ya que no esta cargando bien, de todas formas te agradezco mucho por compartir este proyecto que me hacido de grana ayuda.
holaa oie me podrias pasar el circuito para poder armarlo en el protooo
ResponderEliminarnecesitoo ayudaa
Hola que tal... serias tan amable de pasar el diagrama en proteus, ya que tiene cortada algunas cosas.. desde ya muchas gracias, mi correo es luchorios2009@hotmail.com
ResponderEliminarhola emmanuel, una consulta, donde van las tres resistencias que citaste en la lista de materiales.
ResponderEliminarmuchas gracias.
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola Emanuel puedes pasarme el circuito en el proteus
Eliminarmi correo es este jhoncm_2310@hotmail.com GRASIAS
ResponderEliminaroye si me podrías pasar la imagen completa en proteus por favor abusando de tu generosidad, mi correo es lucro_mafalda@hotmail.com
ResponderEliminarMe podrias pasar la imagen completa porfa, planeo implementarlo esta semana, te lo agradeceria mucho, mi correo es: claudia.lorena.95@gmail.com :)
ResponderEliminarhola emmanuel si me podrias pasar la imagen completa del circuito espero aun la tengas xfas mi correo es carlos hernadez811@gmail.com
ResponderEliminarHola emmanuel me puedes apoyar con el digrama del circuito amigo estoy armando el mio en breve publicare las fotos
ResponderEliminarmontesdeoca.erik@gmail.com
Hola alguien podrías ayudarme con unas cuantas dudas ??? mi correo es tommasjurado17@gmail.com
ResponderEliminarbuen dia, necesito el codigo y este es el mejor que encontre, pero me marca errores que no se como solucionar, ya incluso instale el mikrobasic pro para poder hacerlo pero ni asi
ResponderEliminarme marca error 301 y 304 en la columna de symbol select6 =PORTB
Hola parte de la falta del diagrama quiero suponer que va a VDD es decir 5 volts, positivo ya lo arme en el proto y de mas pero no funciona correctamente con el hexadecimal que problema pudiera tener podrias compartirme el diagrama divinetsop@gmail.com
ResponderEliminar