Microcontroladores
El timer
Ingeniería Mecatrónica
Dr. Victor H. Benitez
Organización de la presentación
El timer 0
Timer configurado como contador
Timer configurado como temporizador
Prescaler
Objetivos:
Al concluir la presentación el alumno:
1. Comprenderá el funcionamiento del periférico llamado timer 0 en el microcontrolador
2. Configurará el timer 0 como un contador
3. Usará el timer 0 como un temporizador de uso general
4. Aprenderá a controlar la duración de los pulsos mediante el prescaler o divisor de frecuencia
Timer 0 (TMR0)
El timer 0 funciona por medio de un contador ascendente de 8 bits que
determina el tiempo entre la carga de un valor al contador y el tiempo que dura en desbordarse dicho contador
El timer 0 se inicializa con un valor y éste se incrementa hasta llegar a su valor máximo 0xFF, con el siguiente pulso se desborda pasando a 0x00 y en ese momento se activa una bandera, el T0IF del registro INTCON.
Funciona con impulsos provenientes de dos fuentes
Pulsos aplicados al pin T0CKI
Timer configurado como contador
En este modo de funcionamiento se le aplican pulsos al pin RA4/T0CLI sirviendo como un contador de eventos muy eficiente
Los pulsos de entrada pueden ser de dos tipos
Flanco de subida o ascendente
Flanco de bajada o descendente
Timer configurado como temporizador
En este modo de operación, el timer cuenta los pulsos provenientes de Fosc/4. Como hemos visto para un reloj de 4MHz los pulsos tienen una duración de 1ms
Cuando el contador llega a una cuenta se 256, activará una banderá al pasar a 0
Para realizar una cuenta restamos 256 menos el número de pulsos que deseamos contar y el resultado se carga al contador
Por ejemplo si queremos contar 10 pusos hacemos los siguiente: 256 – 10 = 246
Este resultado lo cargamos al contador y sucede los siguiente:
11110110
11110111 pulso 1
11111000 pulso 2
11111001 pulso 3
11111010 pulso 4
11111011 pulso 5
11111100 pulso 6
11111101 pulso 7
11111110 pulso 8
11111111 pulso 9
00000000 T0IF
Divisor de frecuencia (Prescaler)
Cuando requerimos controlar que los pulsos que incrementan el timer sean mayores usamos el prescaler
Es un divisor de frecuencia que tiene el efecto de realizar las cuentas con pulsos de mayor duración
La duración de estos pulsos se configura desde el registro Option
Configuración del TIMER 0
La configuración se realiza con los registros
OPTION Banco 1, dirección 0x81, se manda llamar como OPTION_REG
INTCON Banco 0, dirección 0x0B y Banco 1, dirección 0x8B
GIE EEIE T0IE INTE RBIE TOIF INTF RBIF
B7 B6 B5 B4 B3 B2 B1 B0 REGISTRO INTCON
• T0IF Bandera de interrupción que indica el desbordamiento del timer cuando ha pasado de 1111 1111 a 0000 0000
• T0IF = 0 TMR0 no se ha desbordado
Configuración del TIMER 0
Dr. Victor H. Benitez 8
/RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
B7 B6 B5 B4 B3 B2 B1 B0 REGISTRO OPTION
• PS2:PS0 (Prescaler Rate Select Bits) Estos bits se usan para seleccionar los valores del rango con el que actúa el divisor de frecuencia de acuerdo a la tabla siguiente
• PSA = 0, se asigna el prescaler al TMR0
• PSA = 1, se asigna el prescaler al watch dog
• T0SE = 0, el T0 se incrementa en cada flanco de subida
• T0SE = 1, el T0 se incrementa en cada flanco de bajada
• T0CS = 0, usa los pulsos de reloj interno (T0 como temporizador)
• T0CS = 1, cuenta los pulsos aplicados a RA4/T0CKI (T0 como contador)
Ejemplo de contador
En este ejemplo se usa el mC como contador de pulsos aplicados al pin RA4/T0CKI y visualizar la cuenta en un display de LCD
; *** Timer0ej1.asm***
; Cuenta los pulsos aplicados al microcontrolador y visualiza el resultado en un ; display de cristal líquido
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A INCLUDE<P16F84A.INC>
CBLOCK 0X0C ENDC
ORG 0
Start call LCD_Inicializa bsf STATUS,RP0
movlw b’00111000’ ; configura el registro OPTION movwf OPTION_REG
bcf STATUS,RP0
clrf TMR0 ; Inicializa en cero el Timer0 Main
call LCD_Linea1 movf TMR0,W call BIN_a_BCD call LCD_Byte goto Main
Ejemplo de uso como temporizador
Dr. Victor H. Benitez 10
Para usarse como temporizador, se usa la siguiente formula:
𝑇𝑖𝑚𝑒 = 𝑘 (𝑝𝑟𝑒𝑠𝑐)(256 − 𝐿𝑜𝑎𝑑𝑇0)
Time = tiempo requerido
k = 1x10-6 para un cristal de 4MHz
Presc = Configuración del divisor de frecuencia (prescaler)
LoadT0= Valor de carga al Timer0.
Por ejemplo si requerimos generar un tiempo de 0.0005 seg que valor deberá cargarse en el T0, usando un prescaler de 2?
Despejar LoadT0 de la formula y sustituir valores
𝐿𝑜𝑎𝑑𝑇0 = 256 − 𝑇𝑖𝑚𝑒
𝑘 𝑝𝑟𝑒𝑠𝑐 = 256 −
0.0005
1𝑥10−6 2 = 6
Ejercicio: Que valores se requieren cargar en el T0 para lograr tiempos de
Dr. Victor H. Benitez 11 ; Generación de una onda cuadrada de 1KHz de frecuencia
; se debe configurar el T0 con un semiciclo de 1ms/2 = 500us
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC LIST P=16F84A
INCLUDE<P16F84A.INC>
CBLOCK 0X0C ENDC
#DEFINE Frequency PORTB,3
ORG 0
Start
bsf STATUS,RP0 bcf Frequency movlw b'00000000' movwf OPTION_REG bcf STATUS,RP0 Main
bsf Frequency call T0_500us bcf Frequency call T0_500us goto Main
; Se generan los 500us con un prescaler de 2
T0_Load500us EQU d'6'
T0_500us
movlw T0_Load500us
movwf TMR0 ; Carga el T0 con 6
bcf INTCON,T0IF ; Resetea la bandera para (inicializar) T0_Overflow
btfss INTCON,T0IF ; Verifica la bandera de desbordamiento goto T0_Overflow ; No se a desbordado sigue contando return
Este código tiene el problema de que no es preciso!! Verlo en el Stopwatch.