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