En este post veremos como hacer un temporizador que funcione por horas, utilizando un pic 16F628A programado en lenguaje basic en el programa MICROCODE.
MATERIALES:
Utilizaremos los siguientes materiales para este proyecto:
- 1 PIC 16F628A
- 1 LCD 16x2
- 3 Pulsadores
- 3 Resistencias de 1k
- 1 Resistencia de 220 Ohms
- 1 Diodo led
- 1 Potenciometro de 10k
DIAGRAMA DE CONEXIONES:
EXPLICACIÓN DEL CÓDIGO:
'****************************************************************
'* Name : encXhoras.BAS *
'* Author : Esteban Carrillo - www.edeptec.com *
'* Notice : Copyright (c) 2022 *
'* : All Rights Reserved *
'* Date : 10/02/2021 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
CMCON = 7
trisa =%011'Declaramos los puertos a0 y a1 como entradas, y el puerto a2 como salida.
porta = 0
'Nombramos los puertos a0 y a1 como pulsadorSumar y pulsadorIniciar respectivamente, haciendo referencia a los botones.
pulsadorSumar VAR porta.0
pulsadorIniciar VAR porta.1
'Nombramos el puerto a2 como led
led VAR porta.2
'CREAMOS VARIAS VARIABLES
' Tres de tipo BYTE y dos de tipo WORD
tiempoProgramado VAR BYTE
tiempoTranscurrido VAR BYTE
y VAR BYTE
tiempoActual VAR WORD
tiempoLimite var WORD
y = 1' Le asignamos a la variable y el valor de 1
' Declaramos pines de conexión del lcd
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
'Creamos un loop: cicloProgramarTiempo
cicloProgramarTiempo:
' Cada vez que presionemos el pulsadorSumar:
'* Sumaremos la variable tiempoProgramado, esta variable ira de 0 a 24
'* Si la variable tiempoProgramado es mayor a 24 entonces tiempoProgramado = 0
IF pulsadorSumar = 1 THEN
PAUSE 500
tiempoProgramado = tiempoProgramado + 1
IF tiempoProgramado > 24 THEN
tiempoProgramado = 0
ENDIF
ENDIF
LCDOUT $fe, 1,$fe, 2, "PROGRAMAR TIEMPO"
LCDOUT $fe,$C5, DEC tiempoProgramado 'Imprimimos el valor de la variable tiempoProgramado
LCDOUT $fe,$C8, "HORAS"
IF pulsadorIniciar = 1 THEN ' Si pulsamos pulsadorIniciar, nos dirigimos al loop tiempoOn
GOTO iniciarTemporizador
ENDIF
PAUSE 50
GOTO cicloProgramarTiempo' Cerramos el loop cicloProgramarTiempo
iniciarTemporizador:
tiempoLimite = tiempoProgramado * 60 ' *La variable tiempoLimite tomara valores de 60 a 1440.
LCDOUT $fe, 1, $fe, 2, "TIME ON: ",DEC tiempoProgramado, "Hr"' Imprimimos en el LCD el tiempo programado.
LCDOUT $fe,$c0, "ELAPSED T: ",DEC tiempoTranscurrido , "Hr" ' Imprimimos en el LCD el tiempo transcurrido.
FOR tiempoActual = 0 TO tiempoLimite ' Creamos un ciclo for que ira de 0 hasta el valor de la variable tiempoLimite, esta es la pausa durante la cual estará encendido el led
HIGH led ' Activamos led
PAUSE 60000 ' Establecemos una pausa de 1 minuto
IF tiempoActual == y * 60 THEN ' Condición para mostrar en el LCD el tiempoLimite transcurrido.
y = y + 1
tiempoTranscurrido =(tiempoActual/60)
LCDOUT $fe,$c0, "ELAPSED tiempoProgramado: ",DEC tiempoTranscurrido, "Hr"
ENDIF
NEXT tiempoActual
' Una vez que se haya terminado el ciclo for
LOW LED ' Desactivamos led
tiempoProgramado = 0 ' Enceramos la variable tiempoProgramado
LCDOUT $fe, 1 ' limpiamos el LCD
GOTO cicloProgramarTiempo ' Retornamos al loop cicloProgramarTiempo.
EXPLICACIÓN DE LA PARTE DEL CICLO FOR (PAUSA POR HORAS).
Las pausas en microcode según lo que he probado pueden ser de hasta 65.500ms (65,5 segundos - 1 minuto 10 segundos), como podemos ver, no nos permite hacer una sola pausa que dure horas, lo que podemos hacer es pausas sucesivas ejemplo PAUSE 65500: PAUSE 65500... pero haciendo esto ocupamos mucho espacio de almacenamiento en el micro controlador, por este motivo utilizaremos un ciclo for.
Dentro del ciclo for estableceremos una pausa de 60.000 ms lo que es igual a 1 minuto, para hacer una pausa de 1 hora el ciclo for tendría que repetirse 60 veces porque 60 veces 60.000 es igual a 1 hora (60*60000ms = 3.600.000ms lo que es igual a 1 hora). Para determinar el numero de repeticiones según el tiempo programado (valor de la variable t), multiplicamos t * 60 y el valor de esta multiplicación la almacenamos en la variable tiempo.
tiempo = t * 60 FOR X = 0 TO tiempo PAUSE 60000 NEXT X
Le aumente una condición para que nos muestre en el LCD las horas transcurridas, para ello hice lo siguiente:
Dentro del ciclo for agregamos la siguiente linea de código IF X == y * 60 THEN, como sabemos a la variable "y" le dimos el valor de 1, entonces cuando el valor de X sea igual a 60 (en primera instancia), dentro de esta condición tenemos lo siguiente.
Sumamos el valor de y + 1, con esto lograremos que la próxima vez que ingrese a esta condición sea cuando el valor de X tenga valores múltiplos de 60 "60 = 1 hora, 120 = 2 horas, 180 = 3 horas, etc", cada vez que esto ocurra dividiremos el valor de X para 60 con esto obtendremos el numero de horas transcurridas, este valor lo almacenamos en la variable z Ejemplo:
Si x = 180, z = 180/60 ==> 180/60 = 3 ==> z = 3, imprimimos este valor en el LCD.
IF x == y * 60 THEN y = y + 1 z =(x/60) LCDOUT $fe,$c0,"ELAPSED T: ",DEC z, "Hr" ENDIF
Si quieren activar una caga de 110 - 220v con este proyecto, les recomiendo el siguiente post:
Publicar un comentario
¡Hola! Nos alegra mucho que hayas llegado hasta aquí y que estés leyendo este artículo en Edeptec.
Este formulario es un espacio abierto para ti: puedes dejar un comentario con tus dudas, sugerencias, experiencias o simplemente tu opinión sobre el tema tratado.
» ¿Te resultó útil la información?
» ¿Tienes alguna experiencia personal que quieras compartir?
» ¿Se te ocurre algún tema que te gustaría ver en próximos artículos?
Recuerda que este espacio es para aprender y compartir, por eso te animamos a participar de manera respetuosa y constructiva. Tus comentarios pueden ayudar a otros lectores que están en el mismo camino, ya sea en electrónica, programación, deportes o tecnología.
¡Gracias por ser parte de esta comunidad de aprendizaje! Tu participación es lo que hace crecer este proyecto.