46
Manejo de Temporizadore s Módulo Timer 0 (TMR0) Módulo Timer 1 (TMR1) Módulo Timer 2 (TMR2)

Manejo de Temporizadores

Embed Size (px)

DESCRIPTION

en este documento se explica el manejo de los temporizadores del Microcontrolador.Explicando

Citation preview

Page 1: Manejo de Temporizadores

Manejo de TemporizadoresMódulo Timer 0 (TMR0)Módulo Timer 1 (TMR1)Módulo Timer 2 (TMR2)

Page 2: Manejo de Temporizadores

COMPETENCIA

El alumno comprenderá los principales elementos que conforman la estructura interna del reloj o temporizador TMR0, TMR1 y TMR2 del PIC16F877. Analizará su principio de funcionamiento y la función del preescalador.

Page 3: Manejo de Temporizadores

JUSTIFICACIÓN

Las operaciones de pausas, sincronización de tiempo de ejecución y lapsos de tiempo son uno de los criterios necesarios al momento de realizar implantaciones sobre los sistemas basados en microcontroladores.

Page 4: Manejo de Temporizadores

TMR007

Es un contador de 8 bits.Se puede leer para saber cual es valor actual de las cuentas o puede ser escrito para colocar un valor inicial.Posee un bloque de preescalamiento que permite ampliar el rango de las cuentas.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

¿Qué tiene de especial?

Reloj InternoReloj Externoterminal RA4/TOCK1

Contador de eventos

Temporizador

Page 5: Manejo de Temporizadores

¿Cómo manejo el TMR0?

Para manejar el TMR0 se debe configurar el registro

OPTION_REG en el banco 1 del condigo de programación

Page 6: Manejo de Temporizadores

Configuración del OPTION_REG

bit 5 T0CS: Bit selector de fuente para el TMR0

bit 4 T0SE:Bit selector de flanco

bit 3 PSA: Bits de asignación del preescaler

bit 2-0 PS2:PS0: Bits selectores relacion de trabajo

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

1 = Incrementa en flanco de bajada en pin T0CKI0 = Incrementa en flanco de subida en pin T0CKI

1 = Prescaler apagado0 = Prescaler es asignado al modulo TMR0

Page 7: Manejo de Temporizadores

TMR0 COMO CONTADOR

DE EVENTOS

Page 8: Manejo de Temporizadores

Ejercicio:Diseñar un programa en el PIC16F877 para contar eventos con flancos de bajada en RA4/T0CKI y mostrar la cuenta en el puerto B.

Solución: configurar el registro OPTION_REG en función al ejercicio propuesto

1 1 1 1 1 0 0 0

Por tanto:

OPTION_REG = 1111 1000

Page 9: Manejo de Temporizadores

list p=16f877 ;Comando que indica el Pic usadoinclude "p16f877.inc" ;Etiquetas genéricas para el Pic16F877

 org 0x00 ;Inicio del programa en la posición cero de

;memorianop ;Libre (uso del debugger)

_inicioBsf STATUS,RP0 ;Ir banco 1Bcf STATUS,RP1

 Movlw b'00000110 ;PA como entrada digitalMovwf ADCON1Movlw 0xFFMovwf TRISA ;PA entradaClrf TRISB ;PB salidamovlw ;Valor a escribir en el registro de configuración

;del TMR0movwf OPTION_REG ;Configuracion del TMRO

 bcf STATUS,RP0 ;Ir banco 0bcf STATUS,RP1

clrf TMR0 ;TMR0=0 inicializamos el contador en cero BUCLE movf TMR0,W ;W=TMR0

movwf PORTB ;Escribe el valor de TMR0 en PORTBgoto BUCLE ;Salta a la etiqueta bucle

 END

OPTION_REG = 1111 1000

Código del programa:

b'11111000'

Page 10: Manejo de Temporizadores

Ejercicios propuestos:

Diseñar un programa en el PIC16F877 para contar eventos con flancos de subida en RA4/T0CKI con un preescalamiento de 1:2. Mostrar la cuenta en el puerto B.

Diseñar un programa en base al PIC16F877 que rote un bit a la izquierda del puerto B cada vez que ocurra cuatro eventos (flancos de bajada en RA4/T0CKI).

Diseñar un programa en base al PIC16F877 para contar eventos (flancos de bajada en RA4/T0CKI) y mostrar la cuenta en un display de 7 segmentos conectado al puerto B. Cuando las cuentas llegan a 9 pasan de nuevo a 0.

Diseñar un programa en base al PIC16F877 para contar eventos (flancos de bajada en RA4/T0CKI) y mostrar la cuenta en tres displays de 7 segmentos.

Page 11: Manejo de Temporizadores

TMR0 COMO

TEMPORIZADOR

Page 12: Manejo de Temporizadores

Ejercicio:Programar el TMR0 para generar un retardo de un segundo. A partir del cual un LED conectado al PORTC debe apagarse y prenderse indefinidamente. Debe permanecer un segundo en cada estado.

Solución: configurar el registro OPTION_REG en función al ejercicio propuesto y establecer el retardo.

Page 13: Manejo de Temporizadores

Para generar retardos es necesario usar el modulo TMR0 como temporizador por lo tanto es necesario colocar el bit T0CS a 0

Un ciclo de instrucción = 4*Tosc ( donde Tosc es el inverso de la frecuencia del clock que usa el PIC)

Retardo_T0= 4*Tosc* TMR0

El tiempo máximo sería: Retardo_T0 =4*Tosc*256 Si el cristal usado es de 4MHz, tendriamos: 256 us.

Si usamos el preescaler con un valor de 256.Retardo_T0_Pre= 4*Tosc*TMR0*Preescaler.

Retardo_T0_Pre= 4.0.25us*256*256 =65536 us =65.536 msNo alcanza a un segundo. Pero podríamos lograr retardos mayores usando bucles:

Retardo=Bucle*Retardo_T0_PreRetardo=Bucle*65,536ms

Como el Retardo debe ser 1seg1000ms =Bucle*65,536

Bucle=15.25

Page 14: Manejo de Temporizadores

Por tanto no existe una sino múltiples soluciones considerando este último punto y la fórmula :

Retardo= 4*Tosc*TMR0*Preescaler*Bucle

Page 15: Manejo de Temporizadores

1 1 0 0 0 1 1 0

Page 16: Manejo de Temporizadores

1 1 0 0 0 1 1 0

Por tanto:

OPTION_REG = 1100 0110

Page 17: Manejo de Temporizadores

OPTION_REG = 1100 0110

list p=16f877 ;Comando que indica el Pic usadoinclude "p16f877.inc" ;Etiquetas genéricas para el Pic16F877 CONTA EQU 0x20 ;Variable CONTA en dirección 0x20 hexadecimal de

;memoria RAMorg 0x00 ;Inicio del programa en la posición cero de

;memorianop ;Libre (uso del debugger)

_iniciobsf STATUS,RP0 ;Ir banco 1bcf STATUS,RP1

clrf TRISB ;PORTB salidamovlw ;Configuración del modulo TMR0movwf OPTION_REG ;Preescaler = 128

bcf STATUS,RP0 ;Ir banco 0bcf STATUS,RP1

clrf PORTB ;PORTB = 0_bucle

bsf PORTB,0call _retardo ;Llama la rutina de retardobcf PORTB,0call _retardogoto _bucle ;Ir _bucle

b'11000110

Código del programa:

Page 18: Manejo de Temporizadores

_retardo ;T = 4 * Tosc * Valor de TMR0 * Preescalermovlw d'64' ;Cargar el valor de CONTA para 1 segundomovwf CONTA

_espera1clrf INTCON ;Deshabilitar interrupcionesmovlw d'134' ;Cargar el valor de TMR0 para 122 cuentasmovwf TMR0 ;(Complemento)

_esperabtfss INTCON,T0IF ;Esperar desborde del TMR0goto _esperadecfsz CONTA,F ;Decrementar el registro CONTA hasta cerogoto _espera1 ;Si no es cero: ir a _espera1

return ;retorno de call END

Cuando se produce un desborde en el registro TMR0 (cuando pasa de 0xFF a 00) el Bit T0IF del registro

INTCON se pone en 1

Sub-rutina de retardo

Page 19: Manejo de Temporizadores

Ejercicios:

Programar el TMR0 para generar un retardo de un segundo. A partir del cual se incrementa un contador cuyo valor se muestra por el PORTC.

Programar el TMR0 para generar un retardo de 500 ms. Cada vez que concluya el tiempo se activará el PORTC de forma escalonada.

Programar el TMR0 para generar un la palabra HOLA, letra por letra, con un retardo de 0,25 segundos en un display de 7 segmentos conectado al PORTC

Page 20: Manejo de Temporizadores

TIMER0 en CLa función para configurara el TMR0 es:

setup_timer_0 (mode)Parameters:mode may be one or two of the constants defined in the devices .h file.

RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32,RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256 PIC18XXX only: RTCC_OFF, RTCC_8_BIT One constant may be used from each group or'ed together with the | operator.

setup_timer_0 (RTCC_DIV_2|RTCC_EXT_L_TO_H);

Page 21: Manejo de Temporizadores

El compilador de C suministra una serie de funciones

para leer o escribir en el TIMER0.

Para escribir un valor en el registro TMR0:set_timer0 (valor); // valor=entero de 8 bits.

Para leer el valor actual del registro TMR0:valor=get_timer0 (); // valor=entero de 8 bits.

TIMER0 en C

Page 22: Manejo de Temporizadores

TIMER0 en CEjemplo:Utilizando la interrupción del TMR0, generar una señal cuadrada de 1KHz

Solución:1 KHz tiene un periodo T= 1 ms, por tanto el tiempo alto de la señal cuadrada será de 0,5 ms o 500us. Si se usa un cristal de 4 MHz y un prescaler de 2 se tiene la siguiente ecuación de desbordamiento:

Retardo_T0_Pre= 4*Tosc*(256-TMR0)*Preescaler500us=1us *(256-TMR0)*2

TMR0=6

Page 23: Manejo de Temporizadores

TIMER0 en C

Page 24: Manejo de Temporizadores

TMR1

Page 25: Manejo de Temporizadores

TMR1

•El TMR1 Tiene 16 bits distribuidos en dos registros, el TMR1L y el TMR1H.

•Cuenta desde 0000h hasta FFFFh, si desborda se activa el bit TMR1IF en el registro PIR1.

•El TMR1 se configura en el banco 0 usando el registro

T1CON.

•Tiene tres formas de funcionamiento: Temporizador, Contador Síncrono y Contador Asíncrono.

Page 26: Manejo de Temporizadores

T1CON

•El bit de desborde del TMR1 es el TMR1IF ubicado en el registro P1RI.

•Para configurar el TMR1 primero se debe deshabilitar el TMR0 colocando OPTION_REG= 10000000 en el banco 1.

Page 27: Manejo de Temporizadores

Retardo= 4*Tosc*TMR1*PreescalerEl retardo esta dado por:

Ejemplo: si sabemos que el cristal es de 4 MHz, el pre-escalamiento es de 1 a 8 y usamos el TMR1 completo. Entonces el retardo es:

Retardo = 4 * 0.25us *65536*8= 0.524288 s

0 0 1 1 0 0 0 0

Page 28: Manejo de Temporizadores

Ejemplo: realizar una subrutina con retardo de 0.524288 segundos utilizando el TMR1.Solución:

Primero deshabilitamos el TMR0 en el banco 1.movlw b'10000000'movwf OPTION_REG

Segundo configuramos el TMR1 en el registro T1CON en el banco 0.movlw b'00110000'movwf T1CON

Page 29: Manejo de Temporizadores

Tercero y último paso realizamos la rutina de retardo.

retardobcf P1RI,TMR1IFclrf TMR1Lclrf TMR1Hbsf T1CON,TMR1ON

esperarbtfss P1RI,TMR1IFgoto esperarbcf T1CON,TMR1ON

return

Page 30: Manejo de Temporizadores

La función para configurara el TMR1 es:

setup_timer_1 (mode)Parameters:mode values may be:

T1_DISABLED, T1_INTERNAL, T1_EXTERNAL, T1_EXTERNAL_SYNC T1_CLK_OUT T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4, T1_DIV_BY_8

constants from different groups may be or'ed together with |.setup_timer_1 ( T1_DISABLED );

setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );

TIMER1 en C

Page 31: Manejo de Temporizadores

El compilador de C suministra una serie de funciones

para leer o escribir en el TIMER1.

Para escribir un valor en el registro TMR1:set_timer1 (valor); // valor=entero de 16 bits.

Para leer el valor actual del registro TMR1:valor=get_timer1 (); // valor=entero de 16 bits.

TIMER1 en C

Page 32: Manejo de Temporizadores

Ejemplo:Utilizando la interrupción del TMR1, para generar un retardo de 1 segundo

Solución:Se busca el periodo parcial de 0,5 s y se repite dos veces. Si se usa un cristal de 4 MHz y un prescaler de 8 se tiene la siguiente ecuación de desbordamiento:

Retardo= 4*Tosc*(65536-TMR1)*Preescaler0,5s=1us *(65536-TMR1)*8

TMR1=3036

TIMER1 en C

Page 33: Manejo de Temporizadores

TIMER1 en C

Page 34: Manejo de Temporizadores

TMR2

Page 35: Manejo de Temporizadores

• TMR2 es un temporizador de 8 bits con un prescaler (divisor de frecuencia previo), un registro de periodo (PR2) que marca el valor máximo que puede alcanzar la cuenta de TMR2 y un postscaler (contador de coincidencias entre TMR2 y PR2)

• El registro TMR2 se puede leer y escribir desde el núcleo del microcontrolador. TMR2 puede trabajar como temporizador pero no como contador de flancos externos

• El contador TMR2 puede contar desde 0x00 hasta el valor cargado en PR2, en el ciclo siguiente al de esa coincidencia, el contador vuelve a cero • El TMR2 también se puede utilizar para generar una señal de reloj paratransferencias serie síncronas mediante el puerto serie síncrono (SSP)

• El TMR2 se emplea además como base de tiempos para los módulos CCP cuando se configuran en modo PWM (véanse módulos CCP).

Page 36: Manejo de Temporizadores

Diagrama de bloques del TEMPORIZADOR TMR2

Page 37: Manejo de Temporizadores

T2CON: REGISTRO DE CONTROL DEL TIMER 2

bit 7 No implementado: Se lee como 0bit 6:3 TOUTPS3:TOUTPS0: bits de selección del postscaler del Timer2

0000= 1:1 Postscale0001= 1:2 Postscale•••1111= 1:16 Postscale

bit2TMR2ON: Bitde paro/arranque del TMR21 = Timer2 on0 = Timer2 off

bit 1:0 T2CKPS1:T2CKPS0: Bits de selección de prescaler del Timer200= Prescaler is 101= Prescaler is 41x= Prescaler is 16

Page 38: Manejo de Temporizadores

Cálculo de la temporización con TMR2

Page 39: Manejo de Temporizadores

Operación con Temporizador TMR2

• En el caso de TMR0 y TMR1 era necesario precargar un valor de partida en la cuenta y el flag correspondiente se activaba al desbordar el contador, estoobligaba a volver a precargar de nuevo el contador para iniciar una nueva temporización. En el caso de TMR2, la cuenta va desde 0x00 hasta el valor dePR2 y en el ciclo siguiente el contador vuelve a cero por hardware, con lo cual no es necesario precargar por software ningún valor periódicamente y las temporizaciones tendrán una duración fija mientras no se modifique el registro de periodo (PR2). No obstante, también sería posible precargar un valor en TMR2 aunque no será lo habitual más que en el principio de todo el proceso.

• El flag TMR2IF se pondrá a 1 cuando produzca un número de coincidencias entre TMR2 y PR2 igual al valor establecido para el postscaler.

• Si usamos el prescaler y el postscaler con su valor máximo, el tiempo de rebosamiento máximo del postscaler (overflow) sería:

(4/fosc)*(Prescaler máximo)*256* (Postscaler máximo) = (4/fosc) * 16*256*16 = (4/fosc) * 65536

que supondría un valor de temporización máximo igual que el que se puede conseguir con el temporizador TMR0 pero inferior al máximo alcanzable con TMR1

Page 40: Manejo de Temporizadores

EJEMPLO DE CONFIGURACIÓN DEL TIMER 2

Realizar un retarde de 20ms usando el TMR2-Calculamos los valores a cargar-Pre=16, PR2=124 y Pos=10-Retardo=16*(124+1)*10*1us=20msPASOS-En el banco 1 se carga el valor de PR2 movlw .124 movwf PR2-En el banco 0 se carga los valores de configuración el T2CON

0 1 0 0 1 0 1 1 movlw 0x4B movwf T2CON

Page 41: Manejo de Temporizadores

-Realizamos la subrutina de retardo:

Retardoclrf TMR2bcf PIR1, TMR2IFbsf T2CON, TMR2ON

Esperabtfss PIR1, TMR2IFgoto Espera bcf T2CON, TMR2ON

return

Page 42: Manejo de Temporizadores

La función para configurara el TMR12es:

setup_timer_2 (mode,period,postscale)Parameters:mode values may be: T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16

period is a int 0-255 that determines when the clock value is reset,

postscale is a number 1-16 that determines how many timer overflows before an interrupt: (1 means once, 2 means twice, and so on).

setup_timer_2 ( T2_DIV_BY_4, 0xc0, 2);

TIMER2 en C

Page 43: Manejo de Temporizadores

El compilador de C suministra una serie de funciones

para leer o escribir en el TIMER2.

Para escribir un valor en el registro TMR2:set_timer2 (valor); // valor=entero de 8 bits.

Para leer el valor actual del registro TMR2:valor=get_timer2 (); // valor=entero de 8 bits.

TIMER2 en C

Page 44: Manejo de Temporizadores

Ejemplo:Utilizando la interrupción del TMR2, generar una señal cuadrada de 1KHz.

Solución:1 KHz tiene un periodo T= 1 ms, por tanto el tiempo alto de la señal cuadrada será de 0,5 ms o 500us. Si se usa un cristal de 4 MHz, un prescaler de 4 y postscaler de 1 se tiene la siguiente ecuación de desbordamiento:

Retardo= 4Tosc*Preescaler *(PR2+1)*postscaler500us=1us *4*(PR2+1)*1

PR2=124

TIMER2 en C

Page 45: Manejo de Temporizadores

TIMER2 en C

Page 46: Manejo de Temporizadores

FIN