Temporizador timer0

19
UNIVERSIDAD RICARDO PALMA EL TIMER0 DEL 16F84A Microcontroladores UNIVERSIDAD TECNOLÒGICA EL PERÙ FACULTAD DE INGENIERÍA ELECTRÓNICA CIRCUITOS DIGITALES II MICROCONTROLADORES PIC DOCENTE: ING. Luis Pacheco Cribillero

Transcript of Temporizador timer0

Page 1: Temporizador timer0

UNIVERSIDAD RICARDO PALMA

EL TIMER0 DEL 16F84A

Microcontroladores

UNIVERSIDAD TECNOLÒGICA EL PERÙ

FACULTAD DE INGENIERÍA ELECTRÓNICA

CIRCUITOS DIGITALES II

MICROCONTROLADORES PIC

DOCENTE: ING. Luis Pacheco Cribillero

Page 2: Temporizador timer0

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

22/05/13 2ING. Luis Pacheco Cribillero

Page 3: Temporizador timer0

REGISTRO OPTION (Dirección 81H)

• bit 7, RPBU : Resistencia Pull-up, Puerto B, habilita el bit1: Desactivadas0: Activadas

• bit 6, INTEDG: Flanco activo para el control de interrupciones1: Con flanco Ascendente0: Con flanco Descendente

• bit 5, TOCS: Fuente de Reloj para TMR01: Pulsos introducidos a través de RA4/T0CK1 (Contador)0: Pulsos de reloj interno Fosc/4 (Temporizador)

• bit 4, TOSE: Tipo de flanco en TOCK11: Incremento de TMR0 cada flanco descendente0: Incremento de TMR0 cada flanco ascendente

• bit 3, PSA: Bit de asignación del prescaler divisor de frecuencia1: El divisor de frecuencia se asigna al WDT0: El divisor de frecuencia se asigna al TMR0

• bit 2-0, PS2:PSO: Rango con el que actúa el divisor de frecuencia.

22/05/13 3ING. Luis Pacheco Cribillero

Page 4: Temporizador timer0

EJEMPLOS DE CONFIGURACIÓN• Configure al PIC16F84 para que el temporizador TMR0, trabaje con los

pulsos provenientes de un reloj externo, 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 b’xx11xxxx1’movwf OPTION

En el segundo caso: movlw b’xx0x0100’movwf OPTION

OPTION_REG

OPTION_REG

22/05/13 4ING. Luis Pacheco Cribillero

Page 5: Temporizador timer0

TEMPORIZADOR TMR0

• Registro asociado al Timer0. Se encuentra en la posición 01H de la memoria RAM. Es el corazón del módulo Timer0. Puede ser leído o escrito en cualquier momento. El TMR0 se incrementará automáticamente por cada ciclo de instrucción y contará desde 0 (00H) hasta 255 (FFH) (Contador de 8 bits).

• Para que opere como temporizador, el bit TOCS (del registro OPTION) debe ser cero (0), el bit PSA= 0 y deben ser cargados los bits PS2 a PS0, según sea el preescaler a utilizar para lograr nuestra temporización.

• Para que opere como contador, 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). Además existe un retardo en el incremento real del TMR0, después de la sincronización. El bit TOCS= 1. Se debe seleccionar el tipo de flanco que producirá el incremento del TMR0 ( TOSE = 1 ó 0).

22/05/13 5ING. Luis Pacheco Cribillero

Page 6: Temporizador timer0

¿QUÉ ES EL PRESCALER?• Divide la frecuencia de reloj de entrada del Timer0, entre valores predefinidos,

como se ve en la tabla asociada al registro OPTION, 1:32, 1: 64, 1:256, etc., genera una nueva señal de menor frecuencia a la salida, que será la señal de reloj de entrada al registro TMR0.

• “Ralentiza” señales de entrada demasiado rápidas para nuestros propósitos.• También existe un postescaler, asociado al perro guardián WDT (Watch Dog

Timer) del microcontrolador, pero en este caso recibe el nombre de postcaler ya que se usa a la salida del WDT, no pudiendo estar asignado a la vez al Timer0 o al WDT. El preescaler es transparente para el programador, no se puede leer ni escribir sobre él, pero se puede seleccionar por software, como ya se ha dicho, mediante el registro OPTION.

• Nota: Para evitar un RESET no deseado del sistema, es necesario ejecutar una secuencia de instrucciones específicas cuando se cambia la asignación del prescaler del TMR0 al WDT. Esta secuencia debe ser seguida, aún cuando el WDT esté inactivo.

22/05/13 6ING. Luis Pacheco Cribillero

Page 7: Temporizador timer0

¿CÓMO CUENTA EL TMR0?

El TMR0 cuenta exclusivamente de forma ascendente, nunca descendente.

Si el TMR0 se carga con un valor, éste comenzará a contar desde el valor cargado hasta que se desborda (cuando pasa a 00H)

00H

FFH00H

00H

FFH

Valor cargadoEn el TMR0

00H(28 – N10)

22/05/13 7ING. Luis Pacheco Cribillero

Page 8: Temporizador timer0

CÁLCULOS CON EL TMR0• Cuando se carga en el registro TMR0 un valor XXH, é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, un prescaler seleccionado de 1:32 y un oscilador XT. Determine el tiempo en que tardará el TMR0 en desbordarse.

Solución: Sea XT = Frecuencia = 4 MHz, T = 0.25 μs.Temporización= 4*0.25 μs* (256 – 100) * 32 = 4.992 ms.

22/05/13 8ING. Luis Pacheco Cribillero

Page 9: Temporizador timer0

OTROS EJEMPLOS• Se desea saber: ¿Qué valor debemos cargar en el TMR0, si

deseamos obtener una temporización de 10,24 ms, utilizando un preescaler de 128 y un cristal XT?Solución:(256 – N10) = = = 80

(256 – N10) = 80, despejando N10 = (256 – 80) = 176, el valor que debemos cargar en el TMR0 es 176, para que éste cuente desde 176 hasta 256.

• Elegir el TMR0, para generar un retraso de 1.5 ms utilizando un oscilador de 10 MHz.Solución: Sea Fosc= 10 MHz, T = 100 ns

(256 – N10) = =

N10 = 256 - (3750/RgoDivisor)

RgodivisorT

iónTemporizac

OSC ∗∗4 12825.04

24,10

∗∗ s

ms

µ

RgodivisorT

iónTemporizac

OSC ∗∗4 RgoDivisorns

ms

∗∗1004

5.1

22/05/13 9ING. Luis Pacheco Cribillero

Page 10: Temporizador timer0

Démosle valores al Rango del divisor, hasta obtener un valor que se acerque lo más posible al retardo propuesto:Si Prescaler= 256, Valor a cargar en el TMR0= 241 (redondeado)Si Prescaler= 128, Valor a cargar en el TMR0= 227 (redondeado)Si Prescaler= 64, Valor a cargar en el TMR0= 197 (redondeado)Si Prescaler= 32, Valor a cargar en el TMR0= 139 (redondeado)Etc…A manera de práctica, realice usted, el cálculo de la Temporización, para cada uno de los valores que se consiguieron en los cálculos anteriores. Escoja uno y justifique. Particularmente parece que el que tiene el rango de divisor de 64, es el mejor.

• Nota: En este ejercicio resuelto, usted puede darse cuenta de que no hay un solo resultado para los ejercicios, pero lo que si debe cumplirse es que sea cualquiera que sean los valores que se tomen para los cálculos, estos deben de estar cercanos a la respuesta que se espera del temporizador que esté diseñando.

CONTINUACIÓN EJEMPLO ANTERIOR

22/05/13 10ING. Luis Pacheco Cribillero

Page 11: Temporizador timer0

• Ejemplo. Diga ¿cuánto es la máxima temporización que se puede hallar con el TMR0? Asuma que se está trabajando con un XT.Solución: Tomamos el máximo factor de escala de división todos los estados que puede contar el TMR0: – Temporización= 4*0.25 μs*(256 )*256 = 65.536 ms.– Este es el máximo valor que podemos conseguir del TMR0.

• ¿Cómo hacemos entonces para conseguir valores superiores a éste, tales como 0,5 s; 1 s; 2 s; entre otros?– Esto se puede arreglar si tenemos un contador de mayor

número de bits. La solución está en extender el Timer0 con un registro (auxiliar) controlado por software.

– Dicho registro (auxiliar) contará el número de interrupciones por desbordamiento que genera el Timer0, de forma de que éste pase por cero, cuando haya pasado el tiempo que estamos calculando.

22/05/13 11ING. Luis Pacheco Cribillero

Page 12: Temporizador timer0

USO DE REGISTRO AUXILIARPasos: 1. Escoger un valor para el prescaler.

Un posible criterio es calcular todas las frecuencias de prescaler que podemos obtener con cada divisor posible. Las frecuencias sin decimales son interesantes al poder encontrar múltiplos de ellas a la salida del TMR0 con mayor facilidad. En general, la elección del valor del prescaler es empírica: depende del problema, la experiencia y sobre todo de la práctica.

2. Determinar el valor del Registro Auxiliar, a partir del valor dado por el TMR0. Normalmente viene dado por un múltiplo de la frecuencia, asociada al tiempo calculado. Con un ejemplo entenderemos mejor lo que se desea plantear:

Ejemplo: Determine los valores del TMR0 y del Registro Auxiliar paraconseguir una temporización de 1 segundo. Utilice un oscilador XT.

Solución: XT= Frecuencia = 4 MHz ; Tosc= 250 ns • Paso 1. Como no se nos ha impuesto que prescaler utilizar ni que

temporización, podemos aleatoria mente escogerlas, como en el ejemplo 6. Evaluando cualquiera, cuya temporización del TMR0 se basó en 5 ms, escojamos el prescaler 128 y sustituyamos los valores en la ecuación principal:– Temporización= 4*250 ns*(256 - 217)*128 = 4.992 ms

22/05/13 12ING. Luis Pacheco Cribillero

Page 13: Temporizador timer0

CONTINUACIÓN DEL EJEMPLO ANTERIOR

• Paso 2. ¿Qué valor debe de tener el registro auxiliar?a) Al tiempo de 4.992 ms, se asocia una frecuencia del TMR0 de =

= 200.3 Hz, redondeando, tomamos este múltiplo:

200, Así, tendremos entonces que si multiplicamos 200*4.992 ms = 0.998 s, que es un valor bastante cercano a 1 segundo.

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. Nuestro registro auxiliar debe ser de 200!!! Recuerde de que éste registro auxiliar no debe superar 255.Si supera este valor, se debe adicionar un nuevo registro auxiliar

ms992.4

1

32.200992.4

1 =ms

segundo

22/05/13 13ING. Luis Pacheco Cribillero

Page 14: Temporizador timer0

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, mediante el timer0. Utilice un oscilador XT.

22/05/13 14ING. Luis Pacheco Cribillero

Page 15: Temporizador timer0

DE LOS CÁLCULOS A LA DE LOS CÁLCULOS A LA PROGRAMACIÓNPROGRAMACIÓN

Paso 2. 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, del Registro INTCON. Adicional a esto debemos configurar el registro OPTION para que este trabaje con el prescaler que hemos seleccionado para nuestros cálculos, así como de asignarlo al TMR0. Así como la rutinaria configuración de los puertos.

22/05/13 15ING. Luis Pacheco Cribillero

Page 16: Temporizador timer0

LIST P=16F84AINCLUDE P16F84A.INCORG 00HGOTO INICIO

INICIO BSF STATUS,5CLRF TRISAMOVLW B’11010110’MOVWF OPTION_REGBCF STATUS,5CLRF INTCON

LEDON BSF PORTA,0CALL RETARDO

LEDOFF BCF PORTA,0CALL RETARDOGOTO LEDON

;***RUTINA DE RETARDO***RETARDO MOVLW D’139’

MOVWF TMR0ESPERA BTFSS INTCON,TOIF

GOTO ESPERABCF INTCON,TOIFRETURNEND

Paso 3. Programa

22/05/13 16ING. Luis Pacheco Cribillero

Page 17: Temporizador timer0

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

Programa Principal

Subrutina

22/05/13 17ING. Luis Pacheco Cribillero

Page 18: Temporizador timer0

22/05/13 18ING. Luis Pacheco Cribillero

Page 19: Temporizador timer0

¿OTRA FORMA DE HACER LOS CÁLCULOS?

• Pero si aún le enredan todas estas fórmulas, para calcular temporizaciones, probemos con estas tres:

Pruebe ahora realizar los mismos cálculos siguiendo el 1, 2, 3…

22/05/13 19ING. Luis Pacheco Cribillero

¡ GRACIAS !!!...¡ GRACIAS !!!...