Temporizador de décimas de segundo

Anuncio
Temporizador de décimas de segundo
Descripción
Es un reloj de cuenta descendente, usado como temporizador de 5 dígitos y precisión de
décimas de segundo.
El avance del temporizado y la entrada de valores, se visualizan en los dígitos.
Está proyectado con una entrada de inicio y con una salida, pero se le pueden agregar
ambas, de acuerdo a los pines disponibles.
Usé en el diseño el PIC 18F4550, solamente porque lo tenía en stock, pero se puede usar
cualquier otro, cambiando las asignaciones de las entradas y salidas de acuerdo al PIC
usad, y por supuesto la configuración.
Tiene 4 pulsadores:
1) Para comenzar la entrada de valores, para seleccionar el dígito deseado y para
finalizar la entrada.
2) Para subir de a uno el valor del dígito seleccionado.
3) Para parada de emergencia, que finaliza el ciclo.
4) Para comenzar el ciclo de temporizado.
Se pueden agregar otros inicios de ciclo como por ejemplo: temperatura deseada, cierre de
puertas, retardos externos, etc.
Fotografía
1
Esquema
2
Firmware
Está hecho en C de CCS y comenzado usando el PIC Wizzard para armar la configuración.
Básicamente, el Firmware tiene una rutina por Interrupción, que cada décima de segundo,
baja en una unidad el contador de décimas. Cuando llega a cero, para el ciclo, haciendo
sonar la alarma, como el horno de microondas. Suena unos segundos y para. El valor inicial
del contador, se setea mediante dos pulsadores.
Rutina de Interrupción:
#int_TIMER1 // Rutina de Interrupción por timer 1, que genera las décimas de segundo.
void TIMER1_isr(void)
{
Contador = Contador - 1;
// Contador de décimas de segundo.
if (Contador <=0) {SuenaAlarma(); Salida = 0; disable_interrupts(INT_TIMER1);} // Fin del
ciclo.
if (Parada == 1) {Alarma = 0; Salida = 0; disable_interrupts(INT_TIMER1);}
emergencia
set_timer1(15536);
temporizado.
// Parada de
// Carga del TMR1. Ajustarlo si hace falta para darle precisión al
}
Este es el seteo del Timer 1:
setup_timer_1(T1_INTERNAL|T1_DIV_BY_2); // Seteos del CCS.
Con el Timer 1, de 16 Bit, el intervalo entre 0 y 65535 para el prescaler dividido por 2, y reloj
de 4 MHz, el tiempo de desborde es de:
Tiempo = 4 / 4000000 Hz * 2 * (65536-X)= 0.131072 seg = 131.07 ms
X = 0 para el tiempo total de desborde.
Para disminuirlo, no se comienza por cero.
X = -((Tiempo /4 * 4000000 Hz / 2) – 65536) en segundos
X = -((Tiempo /4 * 4000 Hz / 2) – 65536) en milisegundos
Como queremos que el tiempo sea de 100 ms:
X =15536, en lugar de cero debemos colocar 15536.
Si se dispone de un medidor de período de precisión, se puede ajustar el valor, para corregir
el error del cristal usado con el PIC.
Los números de los dígitos se guardan en la memoria EEPROM y se leen cada vez.
Cuando se setean los valores de la EEPROM se usan las variables N1 a N5, que
corresponden al valor de cada dígito de izquierda a derecha.
Ejemplo: 00:01.7, es cero minutos, un segundo y 7 décimas de segundo.
Los números son: 0,0,0,1,7. El valor máximo es 5,9,5,9,9.
Cuando trabaja el temporizador se usa la variable Contador, de 16 bit. Se convierten los
números a Contador, se le resta 1 en la interrupción y se vuelve a convertir a números para
mostrarlos en el display.
Cuando se setean los números, con los dos pulsadores correspondientes, no se usa la
variable Contador, solo los números.
Cualquier duda con este Firmware, consultar a [email protected]
3
Descargar