Electronica e Informatica todo para los amantes y aficionados a la electronica

Reloj digital como hacer

Proyecto PIC - Reloj Digital

 
Descripción:

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..
Materiales:
 
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.
 
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

 
  1. program reloj
  2.   'Puertos de salida usados para multiplexar los displays
  3.  symbol select6 = PORTB.4
  4.   symbol select5 = PORTB.5
  5.   symbol select4 = PORTB.6
  6.   symbol select3 = PORTB.7
  7.   symbol select2 = PORTA.0
  8.   symbol select1 = PORTA.1
  9.   'Puertos de entrada para editar la hora del reloj
  10.  symbol hora = PORTA.2
  11.   symbol min = PORTA.3
  12.   symbol modificar = PORTA.4
  13.   'Puerto de salida usado para encender un led cuando
  14.  'se edite la hora
  15.  symbol led_editar = PORTA.6
  16.   'Arreglo con numeros binarios para mostrar los numeros
  17.  'en el display
  18.  const numeros as byte[10] = (%00000000, %00000001, %00000010, %00000011, %00000100, %00000101, %00000110, %00000111, %00001000, %00001001)
  19.   'Variables diversas usadas para contar, llevar registro
  20.  'del tiempo, y para control
  21.  dim cont as integer
  22.       digito1 as byte
  23.       digito2 as byte
  24.       digito3 as byte
  25.       digito4 as byte
  26.       digito5 as byte
  27.       digito6 as byte
  28.   dim editando as boolean
  29.  
  30.  'Còdigo que maneja los detalles para realizar
  31. 'la multiplexaciòn, apagando y prendiendo los displays
  32. 'cada ciertos milisegundos para dar la apariencia
  33. 'de que muestran diferentes nùmeros al mismo tiempo
  34. sub procedure display
  35.         PORTB = numeros[digito1]
  36.         select1 = 1
  37.         delay_ms(2)
  38.         PORTB = numeros[digito2]
  39.         select1 = 0
  40.         select2 = 1
  41.         delay_ms(1)
  42.         PORTB = numeros[digito3]
  43.         select2 = 0
  44.         select3 = 1
  45.         delay_ms(2)
  46.         PORTB = numeros[digito4]
  47.         select3 = 0
  48.         select4 = 1
  49.         delay_ms(2)
  50.         PORTB = numeros[digito5]
  51.         select4 = 0
  52.         select5 = 1
  53.         delay_ms(1)
  54.         PORTB = numeros[digito6]
  55.         select5 = 0
  56.         select6 = 1
  57.         delay_ms(2)
  58.         select6 = 0
  59.         INC(cont)
  60.   end sub
  61.   'Còdigo que maneja los detalles de la ediciòn
  62.  'del reloj cuando se presiona el botòn modificar.
  63.  'Nota: El reloj se reinicia a las 12 en punto al
  64.  'editarlo.
  65.  sub procedure editar
  66.     digito5 = 0
  67.     digito6 = 0
  68.     editando = True
  69.     hora = 0
  70.     min = 0
  71.     delay_ms(500)
  72.     'Mientras editando sea True
  73.    'repetir lo siguiente
  74.    while editando
  75.        'Si se presiona el botòn del puerto A.2(definido como 'hora')
  76.       'incrementar la hora, y realizar los càlculos para modificar el reloj
  77.        if hora = 1 then
  78.            hora = 0
  79.            digito2 = digito2 + 1
  80.            if digito2 > 9 then
  81.               digito2 = 0
  82.               digito1 = digito1 + 1
  83.            end if
  84.            if (digito2 = 3) and (digito1 = 1) then
  85.               digito1 = 0
  86.               digito2 = 1
  87.            end if
  88.            delay_ms(100)
  89.         end if
  90.         'Si se presiona el botòn del puerto A.3(definido como 'min')
  91.        'incrementar la hora, y realizar los càlculos para modificar el reloj
  92.        if min = 1 then
  93.            min = 0
  94.            digito4 = digito4 + 1
  95.            if digito4 > 9 then
  96.                digito4 = 0
  97.                digito3 = digito3 + 1
  98.                if digito3 > 5 then
  99.                   digito3 = 0
  100.                end if
  101.            end if
  102.            delay_ms(100)
  103.         end if
  104.         'Si se presiona el botòn del puerto A.4(definido como 'modificar')
  105.        'salir de la ediciòn de la hora, y volver al reloj
  106.        if modificar = 1 then
  107.            modificar = 0
  108.            editando = False
  109.         end if
  110.         display
  111.     wend
  112.   end sub
  113.  
  114. main:
  115.   'Inicializaciòn de algunas variables
  116.  'y configuraciòn del PIC
  117.  'Apagamos todos los comparadores
  118.  'para poder utilizar el puerto A como
  119.  'entrada
  120.  CMCON = 0x07
  121.   'Definimos todo B como salida
  122.  TRISB = %00000000
  123.   'Definimos entradas y salidas del puerto A
  124.  TRISA = %00011100
  125.   'Inicializaciòn de variables
  126.  'Nota: El reloj inicia a las 12 en punto al
  127.  'encenderse
  128.  digito1 = 1 'Decenas de la hora
  129.  digito2 = 2 'Unidades de la hora
  130.  digito3 = 0 'Decenas de los minutos
  131.  digito4 = 0 'Unidades de los minutos
  132.  digito5 = 0 'Decenas de los segundos
  133.  digito6 = 0 'Unidades de los segundos
  134.  select1 = 0 'Control del display 1
  135.  select2 = 0 'Control del display 2
  136.  select3 = 0 'Control del display 3
  137.  select4 = 0 'Control del display 4
  138.  select5 = 0 'Control del display 5
  139.  select6 = 0 'Control del display 6
  140.  hora = 0
  141.   min = 0
  142.   cont = 0
  143.   'Damos la salida 1 al puerto del led(A.6)
  144.  'NOTA: POR LA CONEXIÒN DE DICHO LED, 0 ES ENCENDIDO, 1 ES APAGADO, ES DECIR
  145.  'SE INVIERTE
  146.  led_editar = 1
  147.   'Ciclo infinito donde se realizan las operaciones
  148.  'del reloj
  149.  while TRUE
  150.     display
  151.     'Si se presiona el botòn de modificar, encendemos el led que avisa que se
  152.    'està editando la hora, y nos movemos al còdigo de editar.
  153.    if modificar = 1 then
  154.       modificar = 0
  155.       led_editar = 0
  156.       editar
  157.       led_editar = 1
  158.       cont = 50
  159.       delay_ms(500)
  160.     end if
  161.     if cont = 50 then
  162.       cont = 0
  163.       'Operaciones del reloj, que se encargan de saber que digitos incrementar
  164.      'cuando otros exceden el limite. Nota: Es un reloj de 12 horas.
  165.      digito6 = digito6 + 1
  166.       if digito6 > 9 then
  167.          digito6 = 0
  168.          digito5 = digito5 + 1
  169.          if digito5 > 5 then
  170.            digito5 = 0
  171.            digito4 = digito4 + 1
  172.            if digito4 > 9 then
  173.              digito4 = 0
  174.              digito3 = digito3 + 1
  175.              if digito3 > 5 then
  176.                digito3 = 0
  177.                digito2 = digito2 + 1
  178.                if digito2 > 9 then
  179.                  digito2 = 0
  180.                  digito1 = digito1 + 1
  181.                end if
  182.                if (digito2 = 3) and (digito1 = 1) then
  183.                  digito1 = 0
  184.                  digito2 = 1
  185.                end if
  186.              end if
  187.           end if
  188.          end if
  189.       end if
  190.     end if
  191.   wend
  192.  
  193. end.

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.

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:


 



Blogarama - Blog Directory