El Timer 0 es un circuito síncrono, temporizador/contador ascendente de 8 bits, cuando trabaja con el reloj del PIC se le suele llama temporizador y cundo los pulsos los recibe de una fuente externa a través de la patilla RA4/TOCKI se le llama contador.
Generación de interrupción opcional en el desbordamiento.
Se debe configurar así:
1. Ingresar al banco 1
2. Configurar el timer 0 (Contador o timer)
3. Regresar al banco 0 4. Cargar el valor del timer 0 (iniciar la cuenta)
Cuando el modulo funciona como temporizador el registro TMR0 se incremente en cada ciclo de instrucción (Sin preescalamiento).
Cuando se escribe el registro TMR 0, el microcontrolador debe esperar 2 ciclos para la instrucción para que comience a contar.
Como se aprecia en la parte superior derecha está presente un MUX. El MUX es controlado por el bit TOCS, si es 0 el modulo opera como temporizador; si es 1 como contador de eventos.
El bit TOCS pertenece al registro OPTION_REG y es el bit 5.
Cuando el modulo trabaja como contador de eventos del registro TMR 0 incrementa su valor cada vez que aparece un flanco en el pin RA4/TOCKI.
La selección del tipo de flanco (Subida o bajada) dependerá de la programación del bit TOSE (registro OPTION_REG bit 4). Si TOSE es 0 trabaja con flanco de subida si es 1 con flanco de bajada.
El preescaler es mutuamente excluyente y compartido por el TIMER 0 y el Watchdog. No es leíble ni escribible. El preescaler es como un divisor de frecuencia programable. Como se aprecia puede conectarse en serie al módulo TIMER 0 (dependiendo de los valores de TOCS y PSA). Supongamos que el módulo TIMER 0 funciona como contador de eventos y el preescaler está habilitado.
Si el valor es 1:1, eso significa que cada pulso que ingrese incrementara el valor en el registro TMR 0 (el valor máximo de cuentas será 256). Si el preescaler vale 1:8 por cada 8 eventos que sucedan solo aumentara una cuenta del registro TMR 0 (el valor máximo de cuentas será 8x256).
El valor del preescaler depende de los bits PS2 (bit 2), PS1 (bit 1) y PS0 (bit 0) del registro OPTION_REG. El bit PSA (bit 3) del registro INTCON define si el preescaler funciona con el watchdog o con el TIMER 0.
• PS0, PS1 y PS2: Configuración del preescaler. El preescaler es un divisor de pulsos que está a la entrada del Timer-contador. El prescaler divide el número de pulsos que le entran al timer-contador o al Wachtdog. El factor de división es el siguiente (según los valores de PS2, PS1 y PS0 respectivamente
• PSA: Bit de asignación de prescaler. Si está a "1" el prescaler se asigna a WDT (Wachtdog), si está a "0" se asigna al TMR0.
• TOSE: Bit de selección del tipo de flanco para el TMR0. A "1" se incrementa TMR0 por flanco descendente de RA4, a "0" se incrementa TMR0 por flanco ascendente de RA4.
• TOCS: Selecciona la entrada de reloj de TMR0. A "1" la entrada de reloj de TMR0 es por flanco de la patilla RA4, a "0" la entrada de reloj de TMR0 es por ciclo de reloj interno.
Pero el PIC también permite que se produzca una interrupción por desbordamiento del TMR0.
Cuando se produce una interrupción el programa abandona temporalmente lo que estaba haciendo para atender la subrutina de interrupción, pero antes guarda en una región especial de la memoria llamada pila la dirección de la siguiente instrucción de programa, para que cuando acabe la subrutina de interrupción pueda seguir ejecutando el programa por donde se había quedado.
El registro que configura todas las interrupciones es el INTCON, como veis está mapeado en los dos bancos, una cosa muy útil cuando se trabaja en ensamblador para no tener que cambiar de banco constantemente para su configuración, pero que en C no es necesario saber ya que es el compilador el que se encarga de gestionar esto de una manera transparente para el programador.
Bueno como veis hay varias variables que podemos utilizar a nuestro antojo para utilizar este recurso del PIC, la fórmula que las relaciona es la siguiente:
No hay comentarios:
Publicar un comentario