Reloj despertador, calendario y termómetro con PIC16F1939


En 2018 la empresa Microelectrónica organizó una serie de cursos de actualización dictados por el profesor Andrés Raúl Bruno Saravia con el objeto de permitir a las personas relativas al mundo del microcontrolador hacer uso de los nuevos dispositivos de 8 bits de arquitectura optimizada y del compilador XC8 de la firma Microchip. A lo largo de ese año se realizaron muchas experiencias prácticas que permitieron a los asistentes tener la base imprescindible para que, a la hora de requerirlos, tengamos la formación necesaria y la práctica mínima a fin de poder enfrentar cualquier desarrollo requerido. Este dispositivo es precisamente eso, un ejercicio llevado a concreción con todas las funciones que debe tener.

Durante el curso empleamos la placa PIC-DIP40 que no es otra cosa que un bracket o armazón de contención con algunas pocas funciones anexas como son la comunicación RS232, los presets para ajustar el contraste de las pantallas LCD, tira de postes para todos los pines del microcontrolador, cinco pulsadores incluyendo el del pin 1 del uC y alimentación externa vía conector barril y vía USB aunque el USB solo recibe alimentación mas no tiene implementada la función de comunicación en sí. Vemos el reloj en funcionamiento, indicando la fecha, el día de la semana y la temperatura captada por el sensor que se encuentra conectado del otro lado de los cables rojo, negro y blanco que salen fuera de la imagen.

El PIC16F1939 incorpora un oscilador interno de alta precisión calibrado a láser según el fabricante y configurable en diversas frecuencias, en algunas publicaciones afirman que es tan preciso como colocar un cristal con sus correspondientes capacitores de desacople en el exterior del micro. El programa cargado dentro del micro hace uso de dicho oscilador interno para configurar uno de los contadores en tiempo real (o timers) y hacerlo desbordar (interrumpir) cada 500 milisegundos exactos. De esta forma, cada dos interrupciones tenemos el incremento de un segundo, a su vez y por cascada de desbordes tenemos que a los 60 segundos tenemos un minuto, a su vez a los 60 minutos una hora y a las 24 horas un día. Y así reinicia el reloj en 00:00 00 pero incrementa en 1 los días. El calendario es otro cantar porque si bien es conocido por todos cuantos días tiene cada mes lo cierto es que cada cuatro años sucede el año bisiesto y por ende hay que contemplarlo y programarlo! A su vez también hay que determinar el nombre del día.

Otra función que desarrolla este programa es reemplazar los caracteres cero por letra O mayúscula en el LCD porque me molesta y mucho que el cero tenga esa horrible barra cruzada proveniente de la compumática del último cuarto del siglo pasado! Estaba bien cuando los monitores eran de fósforo con una resolución lastimosa o cuando las impresoras eran poco mas que linotipos electrificados pero con la resolución y definición que manejamos hoy día es hasta si se quiere tonto seguir conservando esa barra que muchas personas confunden el 0 con el 8 por tal motivos. Así que como no me gusta hago una rutina que cuando vea un cero le pinte la letra O mayúscula y listo!

Como comenté en el primer párrafo durante el curso empleamos el compilador XC8 de Microchip y por ello el fuente de este proyecto está en ese lenguaje de programación usando el entorno integrado de desarrollo o IDE MPLab X también de Microchip y el programador PICkit 3. Ninguna de estas tres herramientas me gusta, ni siquiera un poco! Es mas las tres me parecen horrendas y mal logradas y si por mi fuera no las habría utilizado. Pueden ver la GUARANGADA desproporcionada de carpetas, archivos y recursos que insume un proyecto tan simple como este, algo que en CCS C habría demandado sólo el 1% de dichos recursos despilfarrados. En algún momento me gustaría ponerme y pasar este programa a CCS C para comparar como queda.

Este es el circuito de aplicación para poder armar el reloj sin necesidad de adquirir la placa de desarrollo, como se observa es por demás simple y fácil de armar. En el LCD muestro todo su patillaje aunque sólo empleo cuatro de las ocho líneas de datos para la comunicación con éste. Asimismo si bien uso menos líneas de datos si empleo la línea RW cosa que no muchos hacen porque por un lado permite emplear el menor tiempo posible para comunicarse con la pantalla y por el otro con algunas pantallas hace falta determinado tiempo y con otras otro tiempo menor esto debido a que hay ya muchos fabricantes de controladores de estas pantallas compatibles con el Hitachi HD44780 y cada quien le pone sus características eléctricas  en estas características particulares es donde radica la diferencia del tiempo que demoran. Para no complicarnos la existencia con que delay se le pone a cada función uso la línea RW para pasar a modo lectura y miro el estado del BUSY FLAG (pin D7) y cuando este me indica que ya procesó vuelvo a escritura y le mando mas funciones o datos según tenga que hacerlo.

El buzzer que emplee es con oscilador interno, se podía hacer perfectamente el oscilador dentro del micro con una interrupción en otro de los timers cada un milisegundo y así tendríamos un oscilador de 1 KHz pero tenía todos los buzzer con oscilador interno y por ende puse ese! Como siempre bien cerca del microcontrolador hay que colocar un capacitor cerámico de cien nano faradios para desacople de los posibles ruidos que ingresen por la línea de alimentación y en algunas pantallas de poca monta es necesario colocar uno también, cuando me ha tocado hacer esto lo hice directamente entre los terminales 1 y 2 en la misma pantalla, no en la placa del equipo en donde se coloca. Si van a llevar el sensor de temperatura, el MCP9700A mas lejos de la placa con alguna clase de extensor también será necesario colocar capacitores de 100 nano faradios tanto junto al sensor como en la placa del reloj y ante la aparición de inestabilidades en la temperatura medida colocar capacitores de 100nF también entre los pines 2 y 3 del sensor (junto al sensor) y entre los pines 2 y masa del microcontrolador (junto al microcontrolador). Cabe mencionar que usé este sensor de temperatura porque es el fabricado por Microchip y como el curso es organizado por dicha empresa aprovechan para hacer lobbie de todo su portfolio de componentes y herramientas. Dado que hoy en cualquier esquina encontramos un cargador USB para celular este circuito se alimentará con uno de ellos y si queremos usar la luz de fondo del display (algo que yo no quise hacer) será necesario que nuestro adaptador de tensión sea de al menos 2A reales. El preset de contraste puede ser de cualquier valor comprendido entre 4K7 y 47K funcionando cualquiera de ellos sin distinción.

Proyecto MPLAB-X   /   Archivo HEX para grabar el uC  /  Proyecto de Proteus para simular el circuito

El programa está bastante comentado y no requiere muchas explicaciones, con sólo mirar un poco que hace cada cosa se entiende en seguida. La forma de poner el reloj en hora es pulsando el botón SET tras lo cual el cursor aparecerá en pantalla debajo del año, usando los botones sube y baja se ajusta el año. Al presionar SET nuevamente el cursor pasa al mes y usando los botones SUBE y BAJA se selecciona el mes actual, lo mismo sucede cuando volvamos a presionar SET con día sólo que conforme se vaya ajustando el número del día el nombre irá adecuándose al que corresponda. Nuevamente presionamos SET y pasamos a ajustar la hora con los mismos botones para subir o bajarla y por último los minutos. Cabe aclarar que en tanto se esté en modo de configuración de fecha y hora (con el cursor visible debajo de alguno de los parámetros) el paso del tiempo deja de ser atendido por lo que no avanza. Esto es especialmente útil si se quiere "largar" el conteo de la hora justo cuando el reloj patrón empleado para poner en hora este toque los cero segundos. Estando el cursor sobre los minutos cuando se vuelve a presionar SET se sale del modo de configuración y queda el reloj en funcionamiento. Para encender o apagar las alarmas basta con pulsar el botón ALARMA. Una suerte de icono con una A en en negativo aparece en pantalla cuando las alarmas están activas. Este reloj tiene tres horas diferentes de alarma; una para lunes a viernes, otra para sábados y otra para domingos. La forma de acceder al ajuste de las alarmas es manteniendo presionado el botón ALARMA pulsar el botón SET. Así es como aparecerán en pantalla los tres seteos de hora de alarma. Se pasa de uno a otro con el botón SET, se ajusta cada parámetro con los botones SUBE y BAJA y se sale de los ajustes de alarma pulsando el botón ALARMA. Hay que tener en cuenta que este reloj cuenta desde las cero horas, cero minutos hasta las 23 horas y 59 minutos por lo que dejar una alarma en 0:00 no la deja apagada sino que la configura para que nos despierte a media noche! Para dejar una alarma sin efecto basta con bajar de 0 y aparecerá OFF en pantalla.

Por supuesto que comprar un PIC, una pantalla LCD, los pulsadores, el buzzer, el adaptador de 220V a 5V y demás cositas que compremos sale muchísimo mas caro que comprar un despertador! Es por ello que les dejo la simulación y si alguno se lo quiere armar sólo porque le gusta, espero que LO DISFRUTE! Arranqué anoche a hacer esta nota, cuando tomé la foto el reloj lo puse en hora con la computadora y hoy, casi 24 horas después sigue estando en la misma hora que la computadora así que el oscilador interno del PIC es al parecer confiable.

 

Pablo Canello, 04/04/2020