✅ 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

 

Interruptor temporizado

Construcción de un interruptor temporizado, ajustable entre 1 y 99 minutos. Este circuito permite un gran ahorro eléctrico, si lo utilizamos para desconectar de forma automática los equipos/electrodomésticos en periodos nocturnos. Por ejemplo una caldera eléctrica para el agua caliente, alumbrado permanente de una habitación infantil, equipos de calefacción o aire acondicionado en habitaciones, etc.

Funcionamiento del circuito

Este interruptor temporizado está construido a partir del micro-controlador AT89S52. Se ha utilizado este modelo  de 40 pines, con el fin de simplificar la construcción del circuito y permitir su programación sin necesidad de desmontar el micro-controlador del circuito.

CPU: Interruptor temporizado

Además, así es posible utilizar Arduino como programador ICSP:

Programador ICSP con ARDUINO

Firmware

El archivo necesario para programar el AT89S52, se puede descargar de forma gratuita desde el siguiente enlace:

Firmware: J_RPM_v1_TIEMPO.HEX

Este interruptor temporizado se activa mediante el cierre de un pulsador o interruptor. Al conectar la alimentación se recarga el contador de minutos, y empieza a descontar el tiempo. El tiempo (minutos)  se configura mediante el estado de los 8 interruptores DIP (ver la tabla binaria en el esquema), pero limitando el valor máximo a 99 minutos. El valor del temporizador se muestra en dos dígitos de 7 segmentos (ánodo común), mostrando la actividad mediante el parpadeo del punto decimal de la unidad. Este punto parpadea al ritmo de 1 segundo, indicando el correcto funcionamiento del micro-procesador. Si no se necesitara mostrar el tiempo, no sería necesario montar los dos dígitos de 7 segmentos. Pero en este caso, sería conveniente montar un diodo LED en la salida dP  de las unidades (pin 25), con el fin de mostrar el correcto funcionamiento y activación del temporizador.

Esquema: Interruptor temporizado

Cuando finaliza el tiempo programado, los dos dígitos de 7 segmentos muestran guiones, pero sólo serán visibles si el interruptor de activación se mantiene cerrado (conexión permanente). Si el interruptor o pulsador de activación estuviera abierto, al abrirse el contacto del relé (Relay) se desconectaría la alimentación del equipo conectado… y también la alimentación del propio temporizador.

El consumo en reposo de este interruptor temporizado es nulo

Fuente de alimentación

La alimentación de este circuito es de 5 VDC, pudiendo utilizar un cargador USB que tengamos sin uso, en lugar del circuito que se muestra en el esquema y se ha utilizado en el montaje (transformador, rectificador, filtro y regulador de 5V).

Interior del interruptor temporizado

La potencia máxima que puede controlar este circuito dependerá del tamaño de los contactos del relé y pulsador o interruptor de activación que utilicemos, sin olvidar la sección del cableado.

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.

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.