TIMER 0

Microcontroladores

REGISTROS ASOCIADOS AL TEMPORIZADOR TMR0 • TMR0: Registro de 8 bits de lectura/escritura • OPTION: Configura al TMR0 para que trabaje como temporizador ó contador y asigna el valor al prescaler • INTCON: Da información mediante el bit “TOIF” cuando el TMR0 se ha desbordado. • TRISA (PUERTO A): Permite el ingreso de pulsos cuando el TMR0 está configurado como contador por RA4 .

PSA: Bit de asignación del prescaler divisor de frecuencia 1: El divisor de frecuencia se asigna al WDT 0: El divisor de frecuencia se asigna al TMR0 bit 2-0. INTEDG: Flanco activo para el control de interrupciones 1: Con flanco Ascendente 0: Con flanco Descendente bit 5. TOCS: Fuente de Reloj para TMR0 1: Pulsos introducidos a través de RA4/T0CK1 (Contador) 0: Pulsos de reloj interno Fosc/4 (Temporizador) bit 4. . Puerto B. RPBU : Resistencia Pull-up.REGISTRO OPTION (Dirección 81H) • • • • • • bit 7. habilita el bit 1: Desactivadas 0: Activadas bit 6. TOSE: Tipo de flanco en TOCK1 1: Incremento de TMR0 cada flanco descendente 0: Incremento de TMR0 cada flanco ascendente bit 3. PS2:PSO: Rango con el que actúa el divisor de frecuencia.

trabaje con los pulsos provenientes de un reloj externo.EJEMPLOS DE CONFIGURACIÓN • Configure al PIC16F84 para que el temporizador TMR0. y el mismo cambie en el flanco de subida del pulso externo: • Configure al PIC16F84 para que el TMR0. trabaje con el reloj interno y la frecuencia del mismo sea dividida por 32: ¿Y los demás bits? ¿Cómo lo cargo al OPTION? En el primer caso: movlw movwf b’xx11xxxx1’ OPTION En el segundo caso: movlw movwf b’xx0x0100’ OPTION .

Para que opere como temporizador. el bit PSA= 0 y deben ser cargados los bits PS2 a PS0. el bit TOCS (del registro OPTION) debe ser cero (0). Es el corazón del módulo Timer0. Para que opere como contador.TEMPORIZADOR TMR0 • Registro asociado al Timer0. Además existe un retardo en el incremento real del TMR0. • • . Puede ser leído o escrito en cualquier momento. según sea el preescaler a utilizar para lograr nuestra temporización. se usa una entrada de reloj externo en el TMR0 y se deben de cumplir ciertos requisitos para que el reloj externo pueda ser sincronizado con el reloj interno (TOSC). Se debe seleccionar el tipo de flanco que producirá el incremento del TMR0 ( TOSE = 1 ó 0). después de la sincronización. Se encuentra en la posición 01H de la memoria RAM. El TMR0 se incrementará automáticamente por cada ciclo de instrucción y contará desde 0 (00H) hasta 255 (FFH) (Contador de 8 bits). El bit TOCS= 1.

. como ya se ha dicho. etc. • . genera una nueva señal de menor frecuencia a la salida. También existe un postescaler. “Ralentiza” señales de entrada demasiado rápidas para nuestros propósitos. como se ve en la tabla asociada al registro OPTION. no pudiendo estar asignado a la vez al Timer0 o al WDT. no se puede leer ni escribir sobre él. aún cuando el WDT esté inactivo. entre valores predefinidos. El preescaler es transparente para el programador. mediante el registro OPTION. que será la señal de reloj de entrada al registro TMR0. pero se puede seleccionar por software. 1: 64. Nota: Para evitar un RESET no deseado del sistema. 1:256. pero en este caso recibe el nombre de postcaler ya que se usa a la salida del WDT. es necesario ejecutar una secuencia de instrucciones específicas cuando se cambia la asignación del prescaler del TMR0 al WDT. 1:32. Esta secuencia debe ser seguida. asociado al perro guardián WDT (Watch Dog Timer) del microcontrolador.¿QUÉ ES EL PRESCALER? • • • Divide la frecuencia de reloj de entrada del Timer0.

éste comenzará a contar desde el valor cargado hasta que se desborda (cuando pasa a 00H) 00H FFH Valor cargado En el TMR0 00H . nunca descendente.¿CÓMO CUENTA EL TMR0? El TMR0 cuenta exclusivamente de forma ascendente. 00H FFH 00H (28 – N10) Si el TMR0 se carga con un valor.

992 ms.CÁLCULOS CON EL TMR0 • Cuando se carga en el registro TMR0 un valor XXH. T = 0.25 μs* (256 – 100) * 32 = 4.25 μs. Determine el tiempo en que tardará el TMR0 en desbordarse. él mismo contará: (FFH – XXH) impulsos y el tiempo que tarda en hacerlo viene dado por la expresión:  Temporización= 4 * TOSC * Valor Real TMR0 * Rango del divisor de Frecuencia  Valor Real TMR0 = (28 – N10) = (256 – N10)  N10= Valor a cargar en el TMR0 Ejemplo: Sea un valor a cargar en el TMR0 de 100. Temporización= 4*0. Solución: Sea XT = Frecuencia = 4 MHz. un prescaler seleccionado de 1:32 y un oscilador XT. .

25 s  128 (256 – N10) = 80. si deseamos obtener una temporización de 10.24 ms. despejando N10 = (256 – 80) = 176. para que éste cuente desde 176 hasta 256. • Elegir el TMR0.5ms = 4  TOSC  Rgodivisor 4  100 ns  RgoDivisor N10 = 256 . para generar un retraso de 1.(3750/RgoDivisor) . T = 100 ns (256 – N10) = Temporizac ión 1. el valor que debemos cargar en el TMR0 es 176.24 ms 10 (256 – N ) = = = 80 4  TOSC  Rgodivisor 4  0. utilizando un preescaler de 128 y un cristal XT? Solución: Temporizac ión 10 .OTROS EJEMPLOS • Se desea saber: ¿Qué valor debemos cargar en el TMR0. Solución: Sea Fosc= 10 MHz.5 ms utilizando un oscilador de 10 MHz.

hasta obtener un valor que se acerque lo más posible al retardo propuesto: Si Prescaler= 256. usted puede darse cuenta de que no hay un solo resultado para los ejercicios. el cálculo de la Temporización. • Nota: En este ejercicio resuelto. Valor a cargar en el TMR0= 197 (redondeado) Si Prescaler= 32.CONTINUACIÓN EJEMPLO ANTERIOR Démosle valores al Rango del divisor. Particularmente parece que el que tiene el rango de divisor de 64. Valor a cargar en el TMR0= 227 (redondeado) Si Prescaler= 64. realice usted. . pero lo que si debe cumplirse es que sea cualquiera que sean los valores que se tomen para los cálculos. Valor a cargar en el TMR0= 139 (redondeado) Etc… A manera de práctica. para cada uno de los valores que se consiguieron en los cálculos anteriores. Valor a cargar en el TMR0= 241 (redondeado) Si Prescaler= 128. es el mejor. estos deben de estar cercanos a la respuesta que se espera del temporizador que esté diseñando. Escoja uno y justifique.

• ¿Cómo hacemos entonces para conseguir valores superiores a éste.• Ejemplo.536 ms. . entre otros? – Esto se puede arreglar si tenemos un contador de mayor número de bits. tales como 0. 2 s. – Este es el máximo valor que podemos conseguir del TMR0. 1 s. Diga ¿cuánto es la máxima temporización que se puede hallar con el TMR0? Asuma que se está trabajando con un XT.25 μs*(256 )*256 = 65. Solución: Tomamos el máximo factor de escala de división todos los estados que puede contar el TMR0: – Temporización= 4*0. cuando haya pasado el tiempo que estamos calculando. La solución está en extender el Timer0 con un registro (auxiliar) controlado por software. de forma de que éste pase por cero. – Dicho registro (auxiliar) contará el número de interrupciones por desbordamiento que genera el Timer0.5 s.

asociada al tiempo calculado. Las frecuencias sin decimales son interesantes al poder encontrar múltiplos de ellas a la salida del TMR0 con mayor facilidad. 2. Evaluando cualquiera. Con un ejemplo entenderemos mejor lo que se desea plantear: Ejemplo: Determine los valores del TMR0 y del Registro Auxiliar para conseguir una temporización de 1 segundo. Un posible criterio es calcular todas las frecuencias de prescaler que podemos obtener con cada divisor posible. Solución: XT= Frecuencia = 4 MHz . Tosc= 250 ns • Paso 1. En general. Como no se nos ha impuesto que prescaler utilizar ni que temporización. Determinar el valor del Registro Auxiliar. Escoger un valor para el prescaler. la elección del valor del prescaler es empírica: depende del problema. como en el ejemplo 6. Utilice un oscilador XT. Normalmente viene dado por un múltiplo de la frecuencia. cuya temporización del TMR0 se basó en 5 ms. a partir del valor dado por el TMR0.217)*128 = 4. la experiencia y sobre todo de la práctica. podemos aleatoria mente escogerlas.992 ms . escojamos el prescaler 128 y sustituyamos los valores en la ecuación principal: – Temporización= 4*250 ns*(256 .USO DE REGISTRO AUXILIAR Pasos: 1.

32 4. tendremos entonces que si multiplicamos 200*4. ¿Qué valor debe de tener el registro auxiliar? a) Al tiempo de 4.992 ms = 0.992ms 200.998 s. redondeando.992 ms. que es un valor bastante cercano a 1 segundo.3 Hz. tomamos este múltiplo: 4.CONTINUACIÓN DEL EJEMPLO ANTERIOR • Paso 2. Si supera este valor. Así. se debe adicionar un nuevo registro auxiliar 1segundo  200. b) La misma operación pero interpretada de una forma más sencilla es determinar cuantas veces necesitamos al tiempo calculado para lograr un segundo: La que usted entienda mejor es válida.992ms . Nuestro registro auxiliar debe ser de 200!!! Recuerde de que éste registro auxiliar no debe superar 255. se asocia una frecuencia del TMR0 de = 1 = 200.

. mediante el timer0. Utilice un oscilador XT.DE LOS CÁLCULOS A LA PROGRAMACIÓN • Realicemos un ejercicio completo: Realice un programa que permita encender y apagar un led cada 15 ms.

Adicional a esto debemos configurar el registro OPTION para que este trabaje con el prescaler que hemos seleccionado para nuestros cálculos.DE LOS CÁLCULOS A LA PROGRAMACIÓN Paso 2. . del Registro INTCON. Debemos de estructurar el programa para que vigile e informe cuando el TMR0 se ha desbordado. y el bit que nos da esta información es el TOIF. así como de asignarlo al TMR0. Así como la rutinaria configuración de los puertos.

Programa LIST P=16F84A INCLUDE P16F84A.0 CALL RETARDO LEDOFF BCF PORTA.TOIF RETURN END .INC ORG 00H GOTO INICIO INICIO BSF STATUS.***RUTINA DE RETARDO*** RETARDO MOVLW D’139’ MOVWF TMR0 ESPERA BTFSS INTCON.5 CLRF TRISA MOVLW B’11010110’ MOVWF OPTION_REG BCF STATUS.0 CALL RETARDO GOTO LEDON .Paso 3.TOIF GOTO ESPERA BCF INTCON.5 CLRF INTCON LEDON BSF PORTA.

Subrutina Programa Principal . Mediante Timer0 y con un oscilador XT.Ejercicio. Realice un programa que permita encender y apagar un led cada un segundo.

.

¿OTRA FORMA DE HACER LOS CÁLCULOS? • Pero si aún le enredan todas estas fórmulas. 3… . 2. para calcular temporizaciones. probemos con estas tres: Pruebe ahora realizar los mismos cálculos siguiendo el 1.