Programar sistema horario 12/24 (assembler)

Programación de un reloj LED, para que pueda mostrar la hora en cualquier formato (12h-24h). Esta modificación se realiza en un ‘Reloj-Fecha-Cronómetro-Temperatura‘ con 4 dígitos de 7 segmentos LED, de control serie. El controlador de este reloj está construido a partir del microprocesaror AT89S52, con encapsulado de 44 pines (SMD).

Sistema horario

El sistema horario de 24 horas es una convención de medición del tiempo, en la que el día se contabiliza de medianoche a medianoche. Con formato de 24 horas, las horas se empiezan a contar a partir de la medianoche, y se presenta con los números comprendidos entre el 0 y 23.

Sistema horario de 12/24 horas

El sistema de 24 horas es el más utilizado en la actualidad, y el sistema de 12 horas se utiliza principalmente para la comunicación oral, porque es más intuitivo. A pesar  de que el sistema de 24 horas es el más usado en comunicaciones escritas, en algunos países lo denominan como horario militar o astronómico, y prefieren realizar la presentación de la hora utilizando el sistema tradicional de 12 horas.

Esta actualización se realiza en el Reloj SMD que mostré anteriormente:

Construye un Reloj SMD

Planteamiento al programar el reloj

Cuando se programa el firmware de un reloj, es importante saber si el display de presentación es multiplexado o no, así como el valor de tiempo mínimo a mostrar.

  • Cuando el display es multiplexado, el microprocesador tiene que enviar la información con una cadencia mucho más rápida,  siempre superior a la persistencia del ojo humano. Si se quiere evitar el efecto de parpadeo, la frecuencia de refresco del display debería ser como mínimo de 50 Hz.
  • La cadencia de lectura de la información horaria debe ser igual o superior al valor del tiempo mínimo que se quiera mostrar en el display. Si el reloj muestra décimas de segundos, el microprocesador tendría que leer la información del chip RTC con una cadencia mínima de 1/10 segundos, cada 100 mSeg.

Funcionamiento del reloj

A pesar de que el Reloj SMD no es multiplexado, porque la presentación se realiza enviando los datos en serie (registro de desplazamiento), lo he programado con una frecuencia de refresco muy alta.

CPU: Reloj SERIE

 

Display: Reloj SERIE

Esto lo hice así, porque utilicé la estructura de programa del reloj de esfera rotante FC-209, el cuál si era multiplexado.

Reloj LED con 2 alarmas

Antes de presentar la hora en el display por primera vez, el microprocesador tiene que leer la información del chip RTC (DS1302). Y si el reloj muestra segundos, la lectura se debería hacer que como mínimo una vez por segundo.

Frecuencia de refresco del display

Aprovechando las prestaciones y velocidad del microprocesador que he utilizado, decidí insertar la rutina de lectura del chip DS1302 (RTC) dentro de la rutina de refresco del display. Como se puede ver en la gráfica anterior,  la lectura se está haciendo con una cadencia de 926 veces por segundo.

Actualización del firmware

La nueva actualización del Reloj SMD, la puedes descargar de forma gratuita desde el siguiente enlace:

J_RPM_v2_RELOJ_SERIE.HEX

Con esta actualización es posible configurar el sistema de presentación horaria en el display, pudiendo elegir el sistema de 12/24 horas.  Para incorporar esta función, he utilizado el método más sencillo de hacerlo: Internamente todo funciona en modo 24 horas, y dependiendo del modo en el que se deba mostrar la hora, el programa pasará o no a través de las rutinas de conversión a formato de 12 horas. Y esto lo hará sólo  antes de enviar la hora al display, porque los menús de configuración siempre mostrarán la hora utilizando el formato de 24 horas. Así no será necesario modificar los menús de configuración, ni cambiar el sistema horario del chip DS1302 (RTC). A continuación os muestro el código que he añadido en esta actualización.

Rutinas de programación en assembler

Funcionamiento de la subrutina: ValAB

Funcionamiento de la rutina Val_AB

Menús de configuración

Los menús de configuración de esta versión (v2), no cambian con respecto a la  versión anterior (v1). En esta versión aparece un nuevo menú, y es para configurar el sistema de presentación horaria (12/24) del reloj.

Menús de configuración del reloj

 

Programador ICSP con ARDUINO

Construcción de un programador serie (ICSP) utilizando Arduino. Si no disponemos de un programador, esta es la solución más barata. Sin embargo, tanto el código de Arduino como el software de programación, son específicos para programar el micro-controlador AT89S51/AT89S52… y no sirven para programar cualquier otro modelo.

AT89S52
AT89S52

FICHEROS

En la página del autor del proyecto: TIKTAK’S PROJECTS , encontrarás además de la información de este proyecto, el link de acceso directo a la descarga de los archivos que necesitas. El fichero que debes cargar a tu Arduino para que funcione como programador, y el programa que necesitarás para exportar el archivo hexadecimal (firmware) hacia el micro-controlador AT89S51/AT89S52.

3 de Marzo de 2020

Miguel Berezosky me informa en un comentario que los archivos no los puede descargar. Como el autor de este proyecto parece que los ha eliminado en su alojamiento DropBox, los he subido a mi cuenta para que los podáis descargar:

Arduino_ICSP.rar

INFORMACIÓN

He creído conveniente incorporar esta información en el blog, con el fin de ampliar un poco más los detalles de funcionamiento de este programador, y también porque en este canal tenéis otros proyectos en los que se utiliza el mismo tipo de micro-controlador. Si eres aficionado a la electrónica y no dispones de un programador, este montaje te podría ser de mucha utilidad.

Montaje ICSP
Montaje ICSP

Si quieres fabricarte un programador ICSP (In-Circuit Serial Programming) , solo necesitarás una placa de Arduino -no importa el modelo- y montar el circuito que se muestra a continuación:

Esquema ICSP
Esquema ICSP

El ejemplo siguiente muestra cómo puedes programar un circuito, en el que ya existe una entrada para su programación en serie:

  • ISP (In-system programming) 
  • ICSP (In-Circuit Serial Programming)
Programador ICSP
Programador ICSP

INCONVENIENTES

Existen algunas limitaciones y desventajas si comparamos este programador con otro de tipo convencional. La primera y más importante, es que el software NO permite verificar la integridad de lo que se ha grabado. Si existiera algún error durante la escritura, el software no lo detectaría. En estos casos, lo normal es que el dispositivo programado no llegara a funcionar, pero dependiendo del tipo de error, podría funcionar de manera defectuosa.

La segunda no es tan importante, pero ha tardado 4 minutos en programar los 6.813 bytes del fichero con el que he realizado las pruebas. Con un programador convencional  el proceso completo: borrado, escritura y comprobación, se realiza en algo menos de 13 segundos.

Reloj LED de pared

Kit Reloj LED (FC-209)
Kit Reloj LED (FC-209)

Partiendo del desarrollo del kit de reloj de esfera rotante FC-209, fabricaremos un reloj de mayor tamaño para poder colgarlo en la pared. Los pulsadores irán situados en el frontal de la esfera, y así podremos utilizarlo en modo cronómetro… muy útil para temporizar los ejercicios en un gimnasio, utilizarlo como temporizador en la cocina, etc. Este reloj dispondrá de las mismas funciones que tenía la última revisión del firmware (v5), pero en esta versión (v6) vamos a utilizar un cristal de cuarzo de frecuencia más alta (con el fin de mejorar la velocidad de refresco) y también sustituiremos la pila de botón por una pequeña batería recargable.

Registro de carga del DS1302
Registro de carga del DS1302

La recarga de esta batería será permanente, siempre que esté alimentado el reloj, y la controlará el propio chip de reloj DS1302.

La versión 6 del firmware, se puede descargar de forma gratuita desde el siguiente enlace: J_RPM_v6_EC1204B.HEX

En este reloj, el display de 4 dígitos BCD lo construimos con diodos LED. Montaremos 2 diodos por cada segmento (se podrían montar más), de los 7 que se compone un dígito BCD. Al conectar 2 diodos en serie de alto brillo, necesitaremos una tensión de alimentación superior a los 5V que disponemos para alimentar el reloj. Con el fin de poder adaptar este circuito con cualquier configuración que utilicemos para construir los dígitos (número de diodos en serie por segmento), utilizaremos el módulo elevador de tensión MT3608.

Esquema MT3608
Esquema MT3608

La tensión de salida de este módulo la utilizaremos para alimentar los 4 dígitos del reloj. Mediante el potenciómetro de ajuste de tensión, podremos adaptar la tensión de alimentación  y modificar el brillo de los 4 dígitos centrales.

Esquema del Reloj (v6)
Esquema del Reloj (v6)

En este esquema se muestran los componentes que irán instalados en la placa de circuito impreso. Tanto los diodos LED como sus resistencias limitadoras, irán instalados en una placa de plástico.

Ensamblado de los diodos LED
Ensamblado de los diodos LED

Con el fin de facilitar la realización del circuito impreso, no he utilizado un programa de diseño PCB, simplemente lo he dibujado utilizando el software ‘Paint’ que incorpora Windows en todos sus sistemas operativos. El circuito impreso de la imagen siguiente, está a escala DIN-A4. Puede imprimirse directamente en papel, o utilizar una lámina transparente (especial para impresoras láser) para conseguir un fotolito a escala.

Fotolito del Reloj LED
Fotolito del Reloj LED

Siguiendo el esquema de conexionado que se muestra en la imagen siguiente, podremos terminar el montaje. Como la tensión de alimentación de este reloj es de 5V, podremos utilizar cualquier cargador que tengamos para alimentar dispositivos móviles. El alimentador de 5V podría instalarse en el interior… o fuera con el fin de poder utilizar este reloj con baterías (Power Bank).

Montaje: Reloj 15x15
Montaje: Reloj 15×15

El modo de funcionamiento y ajustes de este reloj (v6), es idéntico al que se mostró en la última versión del firmware (v5):

Configuración del Reloj LED (v5)
Configuración del Reloj LED (v5)

En la primera parte del video se muestra el diseño del reloj, la construcción del PCB y el montaje de todos los componentes:

En la segunda parte del video se muestra el proceso de fabricación de la carcasa, ensamblado y grabados con la CNC (fresadora de control numérico) de la carátula frontal:

 

Cronómetro LED #5 (FC-209)

Utilizando los mismos componentes  del kit de reloj FC-209 (hardware), podemos convertir el reloj en un cronómetro de precisión… sólo tenemos que reprogramar el micro-controlador AT89S52. Si programamos en el cronómetro las funciones de cuenta hacia delante, cuenta atrás y auto-arranque, podríamos utilizar el cronómetro como marcador de tiempo en eventos deportivos.

Cronómetro de 24 segundos
Cronómetro de 24 segundos

Haciendo unas pequeñas modificaciones en el hardware, sería posible convertir este pequeño reloj en un marcador de gran tamaño, y utilizarlo en un recinto deportivo. Después de sopesar las posibles opciones, decidí incluir la funcionalidad del cronómetro dentro de la última versión del firmware (v4). De esta manera no será necesario sustituir el micro-controlador cuando queramos utilizar este kit de reloj (FC-209) como cronómetro. La versión 5 del firmware, se puede descargar de forma gratuita desde el siguiente enlace: J_RPM_v5_EC1204B.HEX

Como este reloj sólo dispone de dos pulsadores para realizar maniobras, ya que el tercer pulsador es el del Reset del micro-controlador, es necesario definir cuál será su modo de funcionamiento (Reloj/Cronómetro) en la fase de arranque, y mantenerlo fijo hasta un nuevo reinicio. Como la función principal es la de Reloj-Temperatura, definimos este modo como ‘arranque por defecto’. Es decir, si no tocamos ningún pulsador en la fase de conexión, funcionará como Reloj-Temperatura. Para cambiar de modo reloj a cronómetro, realizaremos los siguientes pasos:

  • Pulsaremos el botón ‘RESET’
  • Cuando aparezca el mensaje rotante, mantendremos pulsado el botón ‘MODE’
Configuración del Reloj LED (v5)
Configuración del Reloj LED (v5)

Una vez que que hayamos entrado en el modo ‘cronómetro’, ya podremos configurar sus parámetros de funcionamiento. Estos valores se guardarán en el chip de memoria del reloj (DS1302), y estos serán los nuevos valores de arranque del cronómetro. Al igual que sucede con los parámetros del reloj, tendremos que tener conectada la pila de ‘tampón’ en el chip, si no queremos perder todos los datos cuando falte la alimentación.

Firmware Reloj #4 (Compatible FC-209)

Kit Reloj LED (FC-209)
Kit Reloj LED (FC-209)

La versión 4 del firmware es totalmente compatible con el kit de reloj FC-209 (EC1204B). El funcionamiento y prestaciones son las mismas que las de la versión 3, pero en este caso se ha deshabilitado el límite máximo de temperatura. Como el sensor DS18B20 podría mostrar temperaturas de hasta 125ºC, podríamos sustituir el sensor de temperatura interno –coloreado en amarillo– por otro prolongado y con encapsulado en acero inoxidable. Así sería posible utilizar este reloj como termómetro, para medir con precisión la temperatura de fluidos, calefactores, circuitos electrónicos, frigoríficos, etc.

La versión 4 del firmware, se puede descargar de forma gratuita desde el siguiente enlace: J_RPM_v4_EC1204B.HEX

Sensor de temperatura: DS18B20
Sensor de temperatura: DS18B20

Al sustituir el sensor de temperatura de la placa por otro externo, podremos utilizar este reloj como termómetro para medir temperaturas ambientes y además objetos sólidos o líquidos,  comprendidas entre -10 y +125ºC. Solo tenemos que  fijar el modo de presentación Temperatura,  mediante una breve pulsación del botón [PLUS]. Este reloj dispone de 3 modos de presentación:

Hora  >>> [PLUS] >>> Tempertura >>> [PLUS] >>> Fecha+Temperatura 

Las funcionalidades de la versión 4 son idénticas a la de la versión 3. A continuación se muestra un diagrama con la secuencia de programación de todos los parámetros, válido para  ambas versiones.

Configuración del Reloj LED (v3)
Configuración del Reloj LED (v3-4)