El PIC18F4550 tiene 4 temporizadores de hardware independientes, pero dependiendo de la frecuencia de reloj del sistema, es posible que no todos puedan cronometrar un segundo completo. De todos modos solo necesitas 1 temporizador. El problema se convierte entonces en "¿Cómo puedo compartir 1 temporizador entre 4 tareas?".
La siguiente pregunta es '¿cómo puede el PIC realizar varias tareas en paralelo?'. La CPU solo puede ejecutar 1 instrucción a la vez, por lo que para realizar múltiples tareas debe hacer lo mismo que un humano: un poco de una tarea, un poco de la siguiente, etc. en un bucle para que todos obtengan una participación igual de es la hora.
El temporizador también se puede compartir entre tareas de la misma manera que lo haría usted si solo tuviera un solo reloj para leer. Hay varias formas de hacer esto: -
- Configure el temporizador para que se desborde a una velocidad alta, por ej. 50 veces por segundo (periodo de 20ms). Ahora, asigne a cada tarea su propio contador, que se incrementa en cada 'tic' del desbordamiento del temporizador. Cuando se inserta una celda, encienda la alimentación y restablezca su contador a cero. Cuando el contador llegue a 50, apague la alimentación, etc.
El desbordamiento del temporizador se puede capturar en una interrupción que luego incrementa cada contador de tareas (y vuelve a cargar el temporizador si es necesario), o simplemente puede sondear el temporizador y esperar a que se desborde al inicio del ciclo de tareas múltiples. El uso de las interrupciones puede ser más preciso si necesita volver a cargar el temporizador para obtener el tiempo de "tachado" requerido, pero debe recordar que, en lo que respecta a cada tarea, su contador podría cambiar en cualquier momento .
- Configure el temporizador para que se desborde mucho más lento que 1 segundo. Cuando se inserta una celda, la tarea lee la hora actual y la almacena. En las lecturas subsiguientes, resta el tiempo almacenado de la hora actual, y cuando la diferencia llega a 1 segundo, se apaga, etc.
¿Pero qué pasa si el temporizador se desborda entre lecturas? Luego, la tarea hace lo que haría con un reloj de pared de 12 horas: si el resultado de la resta es negativo, agregue el tiempo necesario para que el temporizador se desborde (igual que agregaría 12 horas a la hora del reloj de pared). / p>
- Configure el temporizador para que se desborde una vez por segundo y ejecute cada tarea a la misma velocidad. Cuando una tarea detecta que se ha insertado una celda, se enciende la alimentación, a menos que esté ya activada, en cuyo caso se apaga la alimentación, etc.
Por supuesto, se puede insertar una celda en cualquier momento dentro del período de 1 segundo, por lo que el tiempo de carga inicial será un período aleatorio de menos de 1 segundo. Sin embargo, cada período de carga posterior se bloqueará en el ciclo de 1 segundo. Como las celdas de NiMH tardan mucho tiempo en cargar, esto no debería ser un problema (tengo un cargador comercial de 4 celdas que usa esta técnica, ¡funciona perfectamente!).