Anda di halaman 1dari 46

Manejo de Temporizadores

Mdulo Timer 0 (TMR0) Mdulo Timer 1 (TMR1) Mdulo Timer 2 (TMR2)

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 funcin del preescalador.

JUSTIFICACIN
Las operaciones de pausas, sincronizacin de tiempo de ejecucin y lapsos de tiempo son uno de los criterios necesarios al momento de realizar implantaciones sobre los sistemas basados en microcontroladores.

TMR0
Qu tiene de especial?

Es un contador de 8 bits. Se puede leer para saber cual es valor actual de las cuentas o puede ser escrito Reloj Externo Reloj Interno para colocar un valor inicial. terminal RA4/TOCK1 Posee un bloque de preescalamiento que permite ampliar el rango de las cuentas. Contador de interrupcin eventos Genera una seal de cuando se produce un desborde en el registro TMR0 (cuando pasa de 0xFF a 00). Bit T0IF del registro INTCON

Temporizador

Cmo manejo el TMR0?


Para manejar el TMR0 se debe configurar el registro

OPTION_REG en el banco 1 del condigo de programacin

Configuracin del OPTION_REG

bit 5 bit 4 bit 3 bit 2-0

T0CS: Bit selector de fuente para el TMR0 T0SE:Bit selector de flanco

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

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

1 = Prescaler apagado 0 = Prescaler es asignado al modulo TMR0 PS2:PS0: Bits selectores relacion de trabajo PSA: Bits de asignacin del preescaler

TMR0 COMO CONTADOR DE EVENTOS

Ejercicio: Disear un programa en el PIC16F877 para contar eventos con flancos de bajada en RA4/T0CKI y mostrar la cuenta en el puerto B. Solucin: configurar el registro OPTION_REG en funcin al ejercicio propuesto
1 1
Por tanto: OPTION_REG = 1111 1000

Cdigo del programa:


list p=16f877 include "p16f877.inc" org 0x00 nop _inicio Bsf Bcf Movlw Movwf Movlw Movwf Clrf movlw movwf bcf bcf clrf STATUS,RP0 STATUS,RP1 b'00000110 ADCON1 0xFF TRISA TRISB b'11111000' OPTION_REG STATUS,RP0 STATUS,RP1 TMR0 ;Ir banco 1 ;Comando que indica el Pic usado ;Etiquetas genricas para el Pic16F877 ;Inicio del programa en la posicin cero de ;memoria ;Libre (uso del debugger)

;PA como entrada digital

;PA entrada ;PB salida OPTION_REG = 1111 1000 ;Valor a escribir en el registro de configuracin ;del TMR0 ;Configuracion del TMRO ;Ir banco 0

;TMR0=0 inicializamos el contador en cero

BUCLE
movf movwf goto END TMR0,W PORTB BUCLE ;W=TMR0 ;Escribe el valor de TMR0 en PORTB ;Salta a la etiqueta bucle

Ejercicios propuestos: Disear 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. Disear 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). Disear 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. Disear 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.

TMR0 COMO TEMPORIZADOR

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.
Solucin: configurar el registro OPTION_REG en funcin al ejercicio propuesto y establecer el retardo.

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 instruccin = 4*Tosc ( donde Tosc es el inverso de la frecuencia del clock que usa el PIC)

Retardo_T0= 4*Tosc* TMR0


El tiempo mximo sera: Retardo_T0 =4*Tosc*256 de 4MHz, tendriamos: 256 us. Si usamos el preescaler con un valor de 256. Si el cristal usado es

Retardo_T0_Pre= 4*Tosc*TMR0*Preescaler.

Retardo_T0_Pre= 4.0.25us*256*256 =65536 us =65.536 ms No alcanza a un segundo. Pero podramos lograr retardos mayores usando bucles: Retardo=Bucle*Retardo_T0_Pre Retardo=Bucle*65,536ms Como el Retardo debe ser 1seg 1000ms =Bucle*65,536 Bucle=15.25

Por tanto no existe una sino mltiples soluciones considerando este ltimo punto y la frmula :

Retardo= 4*Tosc*TMR0*Preescaler*Bucle

1
Por tanto:

OPTION_REG = 1100 0110

Cdigo del programa:

list p=16f877 include "p16f877.inc" CONTA EQU 0x20 org nop _inicio bsf bcf clrf movlw movwf STATUS,RP0 STATUS,RP1 TRISB b'11000110 OPTION_REG 0x00

;Comando que indica el Pic usado ;Etiquetas genricas para el Pic16F877 ;Variable CONTA en direccin 0x20 hexadecimal de ;memoria RAM ;Inicio del programa en la posicin cero de ;memoria ;Libre (uso del debugger) ;Ir banco 1

;PORTB salida OPTION_REG = 1100 0110

;Configuracin del modulo TMR0 ;Preescaler = 128

bcf bcf
clrf _bucle bsf call bcf call goto

STATUS,RP0 STATUS,RP1
PORTB

;Ir banco 0

;PORTB = 0

PORTB,0 _retardo ;Llama la rutina de retardo PORTB,0 _retardo _bucle ;Ir _bucle

Sub-rutina de retardo

_retardo movlw movwf _espera1 d'64' CONTA

;T = 4 * Tosc * Valor de TMR0 * Preescaler ;Cargar el valor de CONTA para 1 segundo

clrf movlw movwf


_espera btfss goto decfsz goto return END

INTCON d'134' TMR0


INTCON,T0IF _espera CONTA,F _espera1

;Deshabilitar interrupciones ;Cargar el valor de TMR0 para 122 cuentas ;(Complemento)


;Esperar desborde del TMR0 ;Decrementar el registro CONTA hasta cero ;Si no es cero: ir a _espera1 ;retorno de call

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

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

La funcin 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);

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.

Ejemplo: Utilizando la interrupcin del TMR0, generar una seal cuadrada de 1KHz Solucin: 1 KHz tiene un periodo T= 1 ms, por tanto el tiempo alto de la seal 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 ecuacin de desbordamiento: Retardo_T0_Pre= 4*Tosc*(256-TMR0)*Preescaler 500us=1us *(256-TMR0)*2 TMR0=6

TMR1

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 Sncrono y Contador Asncrono.

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.

0 0

El retardo esta dado por:

Retardo= 4*Tosc*TMR1*Preescaler
Ejemplo: si sabemos que el cristal es de 4 MHz, el preescalamiento es de 1 a 8 y usamos el TMR1 completo. Entonces el retardo es: Retardo = 4 * 0.25us *65536*8= 0.524288 s

Ejemplo: realizar una subrutina con retardo de 0.524288 segundos utilizando el TMR1. Solucin: Primero deshabilitamos el TMR0 en el banco 1. movlwb'10000000' movwfOPTION_REG Segundo configuramos el TMR1 en el registro T1CON en el banco 0. movlwb'00110000' movwfT1CON

Tercero y ltimo paso realizamos la rutina de retardo. retardo bcf P1RI,TMR1IF clrf TMR1L clrf TMR1H bsf T1CON,TMR1ON esperar btfssP1RI,TMR1IF goto esperar bcf T1CON,TMR1ON

return

La funcin 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 );

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.

Ejemplo: Utilizando la interrupcin del TMR1, para generar un retardo de 1 segundo Solucin: 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 ecuacin de desbordamiento: Retardo= 4*Tosc*(65536-TMR1)*Preescaler 0,5s=1us *(65536-TMR1)*8 TMR1=3036

TMR2

TMR2 es un temporizador de 8 bits con un prescaler (divisor de frecuencia previo), un registro de periodo (PR2) que marca el valor mximo 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 ncleo 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 tambin se puede utilizar para generar una seal de reloj para transferencias serie sncronas mediante el puerto serie sncrono (SSP)

El TMR2 se emplea adems como base de tiempos para los mdulos CCP cuando se configuran en modo PWM (vanse mdulos CCP).

Diagrama de bloques del TEMPORIZADOR TMR2

T2CON: REGISTRO DE CONTROL DEL TIMER 2

bit 7 No implementado: Se lee como 0 bit 6:3 TOUTPS3:TOUTPS0: bits de seleccin del postscaler del Timer2 0000= 1:1 Postscale 0001= 1:2 Postscale 1111= 1:16 Postscale bit2TMR2ON: Bitde paro/arranque del TMR2 1 = Timer2 on 0 = Timer2 off bit 1:0 T2CKPS1:T2CKPS0: Bits de seleccin de prescaler del Timer2 00= Prescaler is 1 01= Prescaler is 4 1x= Prescaler is 16

Clculo de la temporizacin con TMR2

Operacin 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, esto obligaba a volver a precargar de nuevo el contador para iniciar una nueva temporizacin. En el caso de TMR2, la cuenta va desde 0x00 hasta el valor de PR2 y en el ciclo siguiente el contador vuelve a cero por hardware, con lo cual no es necesario precargar por software ningn valor peridicamente y las temporizaciones tendrn una duracin fija mientras no se modifique el registro de periodo (PR2). No obstante, tambin sera posible precargar un valor en TMR2 aunque no ser lo habitual ms que en el principio de todo el proceso. El flag TMR2IF se pondr a 1 cuando produzca un nmero de coincidencias entre TMR2 y PR2 igual al valor establecido para el postscaler. Si usamos el prescaler y el postscaler con su valor mximo, el tiempo de rebosamiento mximo del postscaler (overflow) sera: (4/fosc)*(Prescaler mximo)*256* (Postscaler mximo) = (4/fosc) * 16*256*16 = (4/fosc) * 65536 que supondra un valor de temporizacin mximo igual que el que se puede conseguir con el temporizador TMR0 pero inferior al mximo alcanzable con TMR1

EJEMPLO DE CONFIGURACIN 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=20ms PASOS -En el banco 1 se carga el valor de PR2 movlw .124 movwf PR2 -En el banco 0 se carga los valores de configuracin el T2CON

0 1 movlw 0x4B movwf T2CON

-Realizamos la subrutina de retardo: Retardo clrf bcf bsf Espera btfss goto bcf return

TMR2 PIR1, TMR2IF T2CON, TMR2ON


PIR1, TMR2IF Espera T2CON, TMR2ON

La funcin 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);

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 TMR1:


valor=get_timer2 (); // valor=entero de 8 bits.

Ejemplo: Utilizando la interrupcin del TMR2, generar una seal cuadrada de 1KHz. Solucin: 1 KHz tiene un periodo T= 1 ms, por tanto el tiempo alto de la seal 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 ecuacin de desbordamiento: Retardo= 4Tosc*Preescaler *(PR2+1)*postscaler 500us=1us *4*(PR2+1)*1 PR2=124

Anda mungkin juga menyukai