Menu Principal:
µControladores PIC > Arquitectura
Una exigencia en las aplicaciones de control es la regulación estricta de los tiempos que duran las diversas acciones que realiza el sistema. El dispositivo típico destinado a gobernar los tiempos recibe el nombre de temporizador o "timer" y, básicamente, consiste en un contador ascendente o descendente que determina un tiempo determinado entre el valor que se le carga y el momento en que se produce su desbordamiento o paso por 0.
Esquema simplificado de un temporizador. En este caso se trata de un contador descendente, que, una vez cargado con un valor, se decrementa al ritmo de los impulsos de reloj hasta que llega a 0.
En la gama baja los microcontroladores PIC sólo disponen de dos temporizadores. Uno de ellos actúa como Principal y sobre él recae el control de tiempos de las operaciones del sistema. El otro recibe el nombre de Perro guardián o "Watchdog".
El Perro guardián vigila que el programa no se "cuelgue" y dejen de ejecutarse las instrucciones secuenciales del mismo tal como lo ha previsto el diseñador. Para realizar esta labor de vigilancia, el Perro guardián da un paseo por la CPU cada cierto tiempo y comprueba si el programa se ejecuta normalmente; en caso contrario, por ejemplo si el control está detenido en un bucle infinito o a la espera de algún acontecimiento que no se produce, el perro ladra y provoca un reset, reinicializando todo el sistema.
Tanto el Temporizador principal, TMR0, como el Perro guardián, WDT, a veces precisan controlar tiempos largos y aumentar la duración de los impulsos de reloj que les incrementan o decrementan. Para cubrir esta necesidad, se dispone de un circuito programable llamado Divisor de frecuencia que divide la frecuencia utilizada por diversos rangos para poder realizar temporizaciones más largas.
Para regular el comportamiento del Temporizador principal., el Perro guardián y el Divisor de frecuencia se emplean algunos bits de la Palabra de configuración y del Registro de opciones (OPTION).
El Divisor de frecuencia puede aplicarse a uno de los dos temporizadores, al TMR0 o al WDT. Con el Temporizador principal actúa en primer lugar, o sea. los impulsos pasan primero por el Divisor de frecuencia y, una vez aumentada la duración de los últimos, se aplican a TMR0. Actúa como Divisor previo o "Prescaler". Con el Perro guardián, el Divisor de frecuencia actúa después ("Post-scaler").
El Divisor de frecuencia puede actuar al ritmo de una señal externa aplicada sobre la patita T0CKI, o bien, con la señal de reloj interna del microcontrolador CLKOUT, procedente del oscilador propio. Mediante algunos bits del Registro de opciones y la Palabra de configuración se controla el trabajo del Divisor de frecuencia sobre el TMR0 o el WDT.
EL TEMPORIZADOR PRINCIPAL, TMR0
Se trata de un contador ascendente de 8 bits que puede actuar de dos formas.
1ª Contador
Se le introducen los impulsos desde el exterior por la patita T0CKI. Su misión es "contar" el número de acontecimientos externos.
2ª Temporizador
Trabaja y cuenta los impulsos de reloj del oscilador interno (CLKOUT), Se usa para determinar un tiempo fijo. Estos impulsos tienen una duración conocida que es la de un ciclo de instrucción cuya frecuencia es la cuarta parte del oscilador principal (Fosc/4).
El TMR0 se comporta como un registro de propósito especial ubicado en la posición 1 del área de datos. Puede ser leído y escrito al estar conectado directamente al bus de datos. Como se trata de un contador ascendente, conviene cargarle con el valor de los impulsos que se desean contar pero en forma de complemento a 2, Así, si se quieren contar cuatro impulsos de reloj se carga al TMR0 con el complemento a 2 de 4, lo que significa cargarle con -4. De esta manera, con la llegada de cuatro impulsos se alcanza el valor 0, que determina el tiempo a controlar.
Para trabajar con TMR0 se pueden utilizar las siguientes fórmulas en el caso que los impulsos de reloj provengan del oscilador interno con un periodo de Tosc.
temporización = 4 · Tosc · (Valor cargado en TMR0) · (Rango del Divisor)
Valor a cargar en TMR0 = (temporización / 4 · Tosc) · (Rango del Divisor)
Para conocer el estado en que va la cuenta del TMR0 se le puede leer en cualquier momento. Cuando se escribe un nuevo valor sobre TM. R0 para iniciar una nueva temporización, el incremento del mismo se retrasa durante los dos ciclos de reloj posteriores.
Se ofrece aquí el esquema de funcionamiento del Temporizador principal. Obsérvese que existe un bloque que retrasa dos ciclos y cuya misión consiste en sincronizar el momento del incremento producido por la señal T0CKI con el que producen los impulsos del reloj interno. Cuando no se usa el Divisor de frecuencia, la entrada de la señal de reloj externa es la misma que la salida de dicho Divisor.