Semana 6 Timers
Semana 6 Timers
2
Vectores de interrupción
• Al momento de la suspensión de una tarea, la dirección de la siguiente instrucción
que debería ejecutar, se guarda en el stack, y se carga el contador de programa con
el vector de interrupción. Para los PICS18 existen dos vectores de interrupción:
• 0x0008 vector de interrupción de alta prioridad
• 0x0018 vector de interrupción de baja prioridad
Cada fuente de interrupción tiene tres bits para controlar su funcionamiento:
• El bit de habilitación
• El bit de bandera
• El bit de prioridad de interrupción
Los temporizadores, como cualquier otro periférico pueden interrumpir al
procesador.
3
¿Se puede medir el tiempo usando una cubeta?
• Los temporizadores o timers nos proporcionan intervalos
regulares de tiempo.
• Podemos hacer una analogía del funcionamiento de un
timer, midiendo el tiempo en el que tarda en llenarse una
cubeta de agua.
• Supongamos que colocamos una cubeta vacía, abrimos la
llave del agua y mientras se llena, hacemos otra cosa,
cuando escuchamos que la cubeta se ha llenado y el agua
se empieza a desbordar, interrumpimos lo que estamos
haciendo y corremos a cerrar la llave, para no
desperdiciar el agua y han transcurrido 10 segundos, mas
el tiempo que tardamos en llegar a cerrar la llave.
4
¿Se puede medir un tiempo menor?
• Sabiendo que la cubeta se desbordará en 10
segundos, podemos lograr que este sistema
nos indique cuando ha transcurrido un tiempo
menor, por ejemplo, si quisiéramos que nos
indique el tiempo de tres segundos, bastaría
con depositar en la cubeta, un valor de
precarga de 7/10 de su capacidad, de tal
manera que cuando se desborde, habrán
transcurrido los tres segundos.
5
¿Se puede medir un tiempo mayor?
Para obtener intervalos de tiempo mayores con
este mismo sistema, podríamos disminuir el chorro
de agua, cerrando la llave, de tal manera que deja
pasar solamente un chorrito de agua y al colocar la
cubeta vacía, tarda ahora 10 minutos en llenarse.
¿Cuál será el valor de precarga necesario para que
este sistema nos indique que ha transcurrido un
tiempo de 6 minutos? Seria depositar en la cubeta
una precarga de 4/10 de su capacidad. Si se ha
entendido el funcionamiento de este sistema, se
entenderá fácilmente el funcionamiento típico de los
timers
6
Timers de la familia PIC18F4550
TIMER NÚMERO DE BITS
Temporizador/contador 0 8 ó 16
Temporizador/contador 1 16
Timer2 8
Temporizador/contador 3 16
7
Temporizador/Contador 0
• Este periférico puede funcionar como timer, teniendo como base de tiempo, el ciclo interno
de ejecución de instrucciones Fosc/4, pero también puede funcionar como contador,
contando los impulsos que le llegan por el pin RA4 en su función alterna T0CKI ( Timer 0 Clock
Input).
• Puede funcionar en dos modalidades: 8 y 16 bits
• El registro de 8 bits se incrementará de acuerdo a los flancos externos o al ciclo interno de
instrucción, considerando si se usará o no el predivisor, de tal manera que llegará a su
máximo valor FF y en el próximo incremento se desbordará, igual que nuestra cubeta, con lo
cual se pondrá en 1 su bandera TMR0IF que si el bit de habilitación TMR0IF esta en 1,
interrumpirá al procesador.
8
Temporizador 0, modo 8 bits
9
El bit TOSE (Timer 0 Select Edge) selecciona el flanco con el que se incrementará el registro TMR0L
10
Para seleccionar el predivisor, el bit de control
PSA debe ser 0. Si el predivisor tiene un valor
pequeño, por ejemplo 4, suponiendo que
seleccionamos el modo timer, implica que
cada 4 ciclos de reloj, se incrementará el
registro TMR0L, pero si tiene un valor mayor,
por ejemplo 128, el registro TMR0L se
incrementará cada 128 ciclos de máquina,
tardando mas tiempo en que se desborde el
timer e interrumpa al procesador.
11
Registro de control del timer0: T0CON
12
TIMER0, modo 16 bits
14
Fórmulas para calcular el valor de precarga en función del
intervalo de tiempo requerido
Temporización=4.Tosc.valor_prescaler.valor_del_timer (1)
En donde Tosc es el valor del periodo del oscilador principal del microcontrolador
De tal manera que:
Valor_del_timer=Temporización/(4.Tosc.valor_prescaler) (2)
Debemos de tomar en cuenta, que este valor obtenido en la expresión 2, tenemos que
restarlo del máximo valor del timer (de la misma manera que restábamos la cantidad de agua
de la capacidad total de la cubeta).
De tal manera que:
Valor_precarga=máximo valor del timer-valor_del_timer
O equivalentemente:
Valor_precarga=máximo valor del timer-Temporización/(4.Tosc.valor_prescaler)
El máximo valor para un timer de 8 bits es 0xFF +1, ya que se desborda al iniciar nuevamente
en cero, en decimal este valor es 256, así la fórmula será:
Valor_precarga=256-Temporización/(4.Tosc.valor_prescaler) (3)
Para un timer de 16 bits el máximo valor al que puede llegar es 0xFFFF y se desborda en
0xFFFF+1, es decir 65536 en decimal, la fórmula se modifica:
Valor_precarga=65536-Temporización/(4.Tosc.valor_prescaler) (4)
15
Ejemplo
Se quiere generar un tiempo de 500 ms, considerando que el oscilador principal funciona a
una frecuencia de 4 MHz y un preescaler de 64, sustituyendo estos valores en la ecuación
tenemos:
Valor_del_timer=500 ms/(4*0.25 µs*64)
=500 ms/64µs
=7812.5
Debido a que solo podemos usar valores enteros, el valor del timer es 7812, y notamos
también que debemos de usar el timer en modo 16 bits, pero recordemos que este valor
tenemos que restarlo del valor máximo. Por lo que:
Valor_precarga=65536-7812=57724
Este valor tenemos que cargarlo en los registros TMR0H y TMR0L, por lo que debemos de
convertir el valor a hexadecimal, que es 0xE17C. Esto se hará con las instrucciones:
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz, preescaler 64
16
Configurando los registros INTCON y T0CON
Este valor binario 1001 0101 equivale a 0x95, que debemos cargar en el registro T0CON
El valor de precarga 0xE17C se cargará en los registros del timer, por lo tanto 0xE1 debe
cargarse en TMR0H y 0x7C en TMR0L
Para el funcionamiento óptimo del timer debemos configurar su interrupción, esto se hace
en el registro INTCON, habilitando los bits:
GIE/GIEH=1, bit de habitación global de interrupciones
TMR0IE=1, bit de habilitación de interrupción del timer 0
17
Ejemplo:Parte1: Palabras de configuración
Ahora veremos un ejemplo completo del timer0, en donde se mostrara por secciones: palabras de
configuración, programa principal y subrutinas. Nótese que se agrega el registro de propósito general flags,
para monitorear el tiempo generado por el timer.
18
Ejemplo: Parte2: Programa principal
19
Ejemplo: Parte 3: Subrutina y rutina de servicio de
interrupción.
20
Bibliografía
• PIC18F2455/2550/4455/4550, Data Sheet, 2007 Microchip Technology
Inc. DS39632D
• Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez
González 2020
21