módulo 2 manejo de timers

20
CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS Profesor: Mishell Sanchez Página 1 Módulo 2: Manejo de Timers El PIC16F877A además de manejar PUERTOS de entrada y salida, también posee muchos periféricos de ayuda que hace que este dispositivo sea muy potente para muchas aplicaciones embebidas. Entiéndase por periféricos a chips que se encuentran dentro del microcontrolador y que funcionan en forma paralela a la ejecución de las instrucciones del microcontrolador, lo único que hay que hacer para su correcto funcionamiento es configurarlos de acuerdo a nuestra necesidad. Los TIMER’s son periféricos de gran uso en las aplicaciones con microcontroladores. Sus características y funcionamiento varían de acuerdo a su estructura interna, en nuestro caso los timers del PIC posee 3 modos de funcionamiento: - Modo Temporizador. - Modo Contador Asíncrono. - Modo Contador Síncrono. Algunos autores, al modo contador síncrono lo conocen como modo oscilador, y al modo contador asíncrono sólo le dicen modo contador. El PIC16f877A posee tres timers, los cuales tienen estructuras internas diferentes, por consiguiente funcionan de forma diferente, no todos poseen los modos descritos arriba: Temporizador Contador Oscilador TIMER 0 Si Si No TIMER 1 Si Si Si TIMER 2 Si No No La elección correcta del TIMER a usar es importante, pues nos facilitara la labor de programación y no sobrecargaremos al procesador. El TIMER 0 El módulo Timer0 puede ser usado para generar periodos de tiempo (si funciona como temporizador) o puede ser usado para registrar el paso de eventos (si trabaja como contador de eventos). Al igual que en el módulo anterior existen registros que controlan el funcionamiento del módulo timer 0:

Upload: mishell-sanchez-guevara

Post on 17-Feb-2015

110 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 1

Módulo 2: Manejo de Timers El PIC16F877A además de manejar PUERTOS de entrada y salida, también posee muchos periféricos de ayuda que hace que este dispositivo sea muy potente para muchas aplicaciones embebidas. Entiéndase por periféricos a chips que se encuentran dentro del microcontrolador y que funcionan en forma paralela a la ejecución de las instrucciones del microcontrolador, lo único que hay que hacer para su correcto funcionamiento es configurarlos de acuerdo a nuestra necesidad. Los TIMER’s son periféricos de gran uso en las aplicaciones con microcontroladores. Sus características y funcionamiento varían de acuerdo a su estructura interna, en nuestro caso los timers del PIC posee 3 modos de funcionamiento:

- Modo Temporizador. - Modo Contador Asíncrono. - Modo Contador Síncrono.

Algunos autores, al modo contador síncrono lo conocen como modo oscilador, y al modo contador asíncrono sólo le dicen modo contador. El PIC16f877A posee tres timers, los cuales tienen estructuras internas diferentes, por consiguiente funcionan de forma diferente, no todos poseen los modos descritos arriba:

Temporizador Contador Oscilador

TIMER 0 Si Si No

TIMER 1 Si Si Si

TIMER 2 Si No No

La elección correcta del TIMER a usar es importante, pues nos facilitara la labor de programación y no sobrecargaremos al procesador. El TIMER 0 El módulo Timer0 puede ser usado para generar periodos de tiempo (si funciona como temporizador) o puede ser usado para registrar el paso de eventos (si trabaja como contador de eventos). Al igual que en el módulo anterior existen registros que controlan el funcionamiento del módulo timer 0:

Page 2: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 2

La operación implica la siguiente secuencia: - Ingresar al banco 1 - Configurar el modulo timer 0 (como contador de eventos o timer) - Regresar al banco 0 - Cargar el valor del TMR0 (inicializar la cuenta ) -

Las principales características del modulo timer 0 son.

- Puede ejecutar hasta 256 cuentas (0-255) debido a que el registro TMR0 es de 8 bits. - El registro TMR0 puede ser leído para saber cual es valor actual de las cuentas o puede ser

escrito para colocar un valor inicial. - Posee un bloque de pre-escalamiento que permite ampliar el rango de las cuentas. - Selector interno para definir si trabaja como temporizador o como contador de eventos - Genera una señal de interrupción cuando se produce un desborde en el registro TMR0 (cuando

pasa de 0xFF a 00). Bit T0IF del registro INTCON - Selector para indicar si detecta flanco de subida o bajada cuando opera como contador de

eventos. Bit T0SE del registro OPTION_REG (OPTION para fines prácticos lo llamaremos OPTION_REG en adelante).

A continuación se muestra el diagrama de bloques del módulo Timer 0:

Como se aprecia en la parte superior derecha está presente un MUX. El MUX es controlado por el bit T0CS, si es 0 el módulo opera como temporizador; si es 1 como contador de eventos. El bit T0CS pertenece al registro OPTION_REG y es el bit 5. Cuando el módulo funciona como timer el registro TMR0 se incrementa en cada ciclo de instrucción (siempre y cuando el Pre-escalamiento este deshabilitado). Cuando el registro TMR0 es escrito el microcontrolador debe esperar 2 ciclos de instrucción para que comenzar la cuenta. Cuando el módulo trabaja como contador de eventos el registro TMR0 incrementa su valor cada vez que aparece un flanco en el pin RA4/T0CKI. La selección del tipo de flanco (subida o bajada) dependerá de la programación del bit T0SE (registro OPTION_REG bit 4). Si T0SE es 0-lógico trabaja con flanco de subida si es 1-lógico con flanco de bajada. El pre-escaler es un módulo compartido por el WATCHDOG y el Timer 0. El pre-escaler es como un divisor de frecuencia programable. Como se aprecia puede conectarse en serie al modulo timer 0 (dependiendo de los valores de T0CS y PSA). Supongamos que el módulo timer 0 funciona como contador de eventos y el pre-escaler está habilitado. El valor es 1:1, eso significa que cada pulso que

Page 3: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 3

ingrese incrementará el valor en el registro TMR0 (el valor máximo de cuentas será 256). Si el pre-escaler vale 1:8 por cada 8 eventos que sucedan solo aumentará una cuenta en el registro TMR0 (el valor máximo de cuentas será 8x256). El valor del pre-escaler 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 pre-escaler funciona con el Watchdog o con el Timer 0. Observemos con detalle al registro OPTION_REG:

bit 7 RBPU bit 6 INTEDG bit 5 T0CS: Bit selector de fuente para el TMR0

1 = Clock externo, pin RA4/T0CKI 0 =Clock interno(CLKOUT)

bit 4 T0SE:Bit selector de flanco 1 = Incrementa en flanco de bajada en pin T0CKI 0 = Incrementa en flanco de subida en pin T0CKI

bit 3 PSA: Bits de asignación del pre-escaler 1 = Pre-escaler es asignado al WATCHDOG 0 = Pre-escaler es asignado al modulo Timer0

bit 2-0 PS2:PS0: Bits selectores relación de trabajo

La gran mayoría de microcontroladores de Microchip poseen al timer 0, por ejemplo el PIC 16F84A, un pic básico, posee entre sus escasos periféricos al timer 0. El timer 0 posee un registro contador de 8 bits, este al tener desbordamiento (overflow) puede activar un salto de interrupción habilitando el bit T0IE del registro INTCON. El concepto de interrupción lo trataremos en el capitulo siguiente, en este capítulo nos centraremos en ejemplificar los 2 modos de funcionamiento del timer0: modo temporizador y modo contador.

Page 4: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 4

Modo Temporizador TIMER 0 Ejemplo: Generar una señal PWM por el pin RB0, duty=50% y periodo de 2 milisegundos. Usar un cristal de 20MHz:

1- El bit T0CS deberá estar en CERO para que los pulsos del cristal divididos por 4 (Fosc/4) pasen por el MUX.

2- Luego viene la etapa de pre-divisor, si queremos que el registro de 8 bits TMR0 incremente en uno con cada pulso que sale del mux, seleccionaremos PSA=1, si queremos que por cada X pulsos el registro TMR0 incremente en una unidad deberemos colocar PSA=0, donde las diferentes combinaciones de X serian las siguientes:

a. X = 2 para PS2-PS1-PS0 = 000 b. X = 4 para PS2-PS1-PS0 = 001 c. X = 8 para PS2-PS1-PS0 = 010 d. X = 16 para PS2-PS1-PS0 = 011 e. X = 32 para PS2-PS1-PS0 = 100 f. X = 64 para PS2-PS1-PS0 = 101 g. X = 128 para PS2-PS1-PS0 = 110 h. X = 256 para PS2-PS1-PS0 = 111

3- Finalmente, debemos colocar un numero Y de inicio para la cuenta del TMR0, además elegir un

X, esto es para contabilizar el tiempo que queremos, en nuestro caso 1ms:

Usaremos la siguiente formula, que expresa el retardo en función de X e Y:

Para un cristal de 20MHz el Tci=0.2us

Nótese que escogimos X=128 por que la división de 5000/128 da un numero casi entero, la elección de otro numero para X nos hubiera dado más error de redondeo. Ahora vamos a hacer el código en ASM para esta aplicación:

Page 5: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 5

Page 6: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 6

Modo Contador Asíncrono TIMER0

Ejemplo: Activar una Relé conectado en el pin RD3 cuando hayamos presionado un pulsador 400

veces. Mostrar la cuenta del registro TMR0 en el PORTB.

Page 7: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 7

Para poder contabilizar 400 pulsos con el registro TMR0 directamente es imposible, pues este registro es

de 8 bits y su cuenta máxima es de 256 produciendo overflow. Para la solución del conteo usaremos el

pre-divisor, este podrá tomar los valores: x2, x4 y x8 pues el número 400 es múltiplo de estos números,

asi la cuenta seria entera. El pin de entrada de conteo el timer0 es el pin RA4 también llamado T0CKI.

Usaremos la combinación de x2, queda para el alumno de ejercicio hacer el cálculo para los otros casos.

Reemplazaremos los datos exigidos por el problema para luego proceder con la configuración:

Ahora que ya tenemos el cálculo matemático terminado, procedemos con la configuración del registro

OPTION_REG, recordando que según el circuito el pin RA4 está a nivel bajo mientras no se pulse. Por

consiguiente tenemos que contar flancos de subida, T0SE=0. Además el T0CS=1 para establecer el modo

contador.

El programa en ASM seria:

Page 8: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 8

Para la simulación de este programa, usaremos el software ISIS de PROTEUS. Usaremos un generador de pulsos para verificar el correcto funcionamiento, el archivo de simulación como los programas realizados se encuentran en el CD del curso. En el dibujo observamos que se ha producido el overflow, por tanto la cuenta del TMR0 está en cero en el momento en que se prende el LED que representa al relé propuesto en el problema.

Page 9: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 9

Page 10: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 10

EL TIMER 1 El timer1 es un periférico más profesional que el timer0, pues posee un registro contador de 16 bits, representado en 2 bytes: TMR1H y TMR1L. Sus mejoras se reflejan en su arquitectura interna que vemos a continuación:

El Timer1 tiene tres formas de funcionamiento: a) Temporizador b) Contador Asíncrono c) Contador Síncrono Los bits de control del timer1 se encuentran alojados en el registro T1CON:

bit 7-6 Bits no implementados. Leído como 0 bit 5-4 T1CKPS1:T1CKPS0: El Pre-escaler es un divisor de la frecuencia de los impulsos que se aplican al

TIMER1 11 = 1:8 Valor de Pre-escaler 10 = 1:4 Valor de Pre-escaler 01 = 1:2 Valor de Pre-escaler 00 = 1:1 Valor de Pre-escaler

bit 3 T1OSCEN: Control de habilitación para el oscilador del Timer1 1 = El Oscilador es habilitado (RC0 y RC1 = entradas del oscilador externo) 0 = El oscilador trabaja en otro modo (RC0 = entrada del oscilador externo)

bit 2 T1SYNC: Determina la posible sincronización o no de los impulsos del reloj externo con los del reloj interno. TMR1CS = 1 1 = No sincronización con un reloj externo 0 = Sincronización con un reloj externo TMR1CS = 0 Este bit es ignorado cuando el Timer1 usa el reloj interno

bit 1 TMR1CS: Selecciona la fuente de los impulsos de contaje 1 = Reloj externo desde el pin RC0/T1OSO/T1CKI (en el flanco de subida) 0 = Reloj interno (FOSC/4)

bit 0 TMR1ON: gobierna el permiso o la prohibición de funcionamiento del Timer1. 1 = Habilitar el Timer1 0 = Detener el Timer1

Page 11: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 11

No todos los microcontroladores de Microchip poseen al timer1, por ejemplo el PIC 16F84A no tiene timer1, mientras el PIC16F628A si lo tiene. El timer1 posee un registro contador de 16 bits, este al tener desbordamiento (overflow) puede activar un salto de interrupción habilitando el bit TMR1IE del registro PIE1, mientras su flag TMR1IF se encuentra en el registro PIR1. Modo Temporizador TIMER 1 Este modo es seleccionado limpiando el bit TMR1CS (T1CON<1>). En este modo la entrada de reloj al timer es Fosc/4. El bit T1SYNC (T1CON<2>) no tiene efecto desde el reloj interno; es siempre síncrono.

Ejemplo: Generar una señal PWM de DUTY=50% y periodo 100ms por el pin RB0. Usar un cristal de 4MHz.

1- El bit TMR1CS deberá estar en CERO para que los pulsos del cristal divididos por 4 (Fosc/4) pasen por el MUX hacia el pre-divisor.

2- Luego viene la etapa de pre-divisor, al igual que para el timer0 tendremos algunas combinaciones de divisor:

a. X = 1 para T1CKPS1-T1CKPS0 = 00 b. X = 2 para T1CKPS1-T1CKPS0 = 01 c. X = 4 para T1CKPS1-T1CKPS0 = 10 d. X = 8 para T1CKPS1-T1CKPS0 = 11

3- Ahora vamos a calcular un numero Y de inicio de 16 bits para la cuenta del TMR1, además elegir

un X, esto es para contabilizar el tiempo que queremos, en nuestro caso 50ms:

Usaremos la siguiente formula, que expresa el retardo en función de X e Y:

Para un cristal de 4MHz el Tci=1us

Page 12: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 12

Del resultado obtenido, cargaríamos el valor de Y en los registros TMR1H y TMR1L. TMR1H=0x3C y TMR1L=0xB0. El programa en ASM seria:

Page 13: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 13

Modo Contador Asíncrono TIMER1

Si el bit T1SYNC (T1CON<2>) es seteado, el reloj externo no es sincronizado. El timer continúa un incremento asíncrono a la fase del reloj interno. El timer continuará funcionando durante el modo SLEEP y podrá generar una interrupción de desborde; el cual podría despertar al procesador del modo SLEEP. Lectura y escritura del Timer 1 en modo contador Asíncrono Leer los registros TMR1H TMR1L mientras el timer está corriendo desde un reloj asíncrono externo garantizará una lectura válida (tener cuidado con el hardware). Sin embargo el usuario tendrá en mente que leer 16 bits del timer en 2 registros de 8 bits puede causar molestia si el timer desborda mientras se produce la lectura. Para escribir es recomendable que el usuario detenga el timer y escriba recién los valores deseados.

Ejemplo: Hacer un programa que nos permita contar 1/2 millón de pulsos externos, cuando lleguemos

a la cuenta 1/2 millón activar una alarma por el pin RD7.

Para el modo contador asíncrono antes de hacer los cálculos debemos poner los bits T1OSCEN en ‘0’ y el

TMR1CS en ‘1’.

Ahora vamos a elegir el pre-divisor para poder contar sin problema 1/2 millón de pulsos.

Los resultados nos indican configurar al timer1 con un pre-divisor de X=8 y una cuenta inicial del registro

contador TIMER1 de Y=36. Nótese que la cuenta esta casi al máximo, pues si quisiéramos contar un

número mayor de pulsos deberíamos ingeniárnoslas para lograrlo usando registros adicionales para que

ayuden a contar al TIMER1.

Page 14: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 14

Page 15: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 15

Modo Contador Síncrono TIMER1

Este modo es seleccionado seteando el bit TMR1CS. En este modo el timer incrementa cada flanco de subida de una entrada de reloj externo en el pin RC1, cuando el bit T1OSCEN es seteado. O cuando una entrada de reloj ingresa por el pin RC0, cuando el bit T1OSCEN es limpiado. Si el T1SYNC es limpiado, entonces el reloj externo es sincronizado con la fase del reloj interno. Ejemplo: Hacer parpadear un led, 1 seg. de prendido y 1seg. de apagado. El led estará conectado en el

pin RA0. Usar un cristal de 32.768 KHz en entre los pines RC0 y RC1.

Para el modo contador síncrono antes de hacer los cálculos debemos poner los bits T1OSCEN en ‘1’ y el

TMR1CS en ‘1’.

Ahora vamos a elegir el pre-divisor para poder generar 1 seg, recodemos que el valor de la frecuencia

del oscilador será ahora 32.768KHz pues estamos en la configuración de contador síncrono.

Observando con más detalle las ecuaciones, nos damos cuenta que el factor de resta debe ser múltiplo

de 2, pues el numero que divide en la ecuación es 2^15. Nuestro objetivo al resolver la ecuación y crear

tiempo perfectos de 1seg, ½ seg. y tiempos en segundos.

Page 16: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 16

El programa en ASM seria:

Page 17: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 17

EL TIMER 2 El timer2 es un timer con un registro contador de 8bits.Este timer, a diferencia del timer 0 y timer 1 no posee un pin para ingresar pulsos externos, esto quiere decir que solo cuenta los pulsos internos del oscilador. Sus características se aprecian en el siguiente gráfico:

Los bits de control del timer2 se encuentran alojados en el registro T2CON

bit 7 Bit no implementados. Leído como 0 bit 6-3 TOUTPS3:TOUTPS0: El Post-escaler es un divisor de la frecuencia de los impulsos que salen del

comparador(TMR2 vs PR2_REG). 0000 = 1:1 Valor de Post-escaler 0001 = 1:2 Valor de Post-escaler 0010 = 1:3 Valor de Post-escaler . . . 1111= 1:16 Valor de Post-escaler

bit 2 TMR2ON: gobierna el permiso o la prohibición de funcionamiento del Timer2. bit 1-0 T2CKPS1-T2CKPS0: El Pre-escaler es un divisor de la frecuencia de los impulsos que se aplican al TIMER1

00= Pre-escaler es 1 01 =Pre-escaler es 4 1x = Pre-escaler es 16

El timer2 posee un registro contador de 8 bits, este es comparado con el valor alojado en el registro PR2(92H), cada vez que estos registros sean iguales se le dará un pulso al post-escaler, además reseteara al contador del timer2. Cuando el post-escaler termina de contabilizar el valor configurado puede generar un salto de interrupción habilitando el bit TMR2IE del registro PIE1(8CH), mientras su flag TMR2IF se encuentra en el registro PIR1(0CH).

Page 18: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 18

Modo Temporizador TIMER 2 Ejemplo: Programar el timer2 para generar un retardo de un segundo. A partir del cual se incrementa un contador cuyo valor se muestra por el PORTC. Usar un cristal de 20MHz. Con nuestra experiencia obtenida realizando temporizaciones con timers nos será fácil intuir la formula que nos dará el tiempo que demorara nuestra rutina hasta que por overflow se activara el flag y terminara nuestro lazo de retardo.

Donde los valores disponibles para el pre-escaler son:

T2CKPS1-T2CKPS0 Pre-escaler

00 x1

01 x4

1X x16

Y los valores disponibles del post-escaler son:

TOUTPS3-TOUTPS0 Post-escaler

0000 x1

0001 x2

0010 x3

0011 x4

0100 x5

0101 x6

0110 x7

0111 x8

1000 x9

1001 x10

1010 x11

1011 x12

1100 x13

1101 x14 1110 x15

1111 x16

No será necesario inicializar el registro contador del timer2, pues con prender y apagar el periférico será suficiente. Como vemos, el timer2 por sí solo no podrá generar un retardo de 1 segundo, vamos a calcular un valor adecuado para que con ayuda de un registro adicional cuente lo necesario para tener 1 segundo.

El programa en ASM seria:

Page 19: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 19

Page 20: Módulo 2 Manejo de Timers

CURSO DE MICROCONTROLADORES PIC16F877A MANEJO DE TIMERS

Profesor: Mishell Sanchez Página 20