Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 21

Microcontroladores

Segunda unidad: Programación en lenguaje ensamblador


Semana 6: Timers
Interrupciones
• El PIC18F4550 tiene múltiples fuentes de interrupción.
• Una interrupción consiste en que el procesador suspende temporalmente la
tarea que está ejecutando para atender a algún periférico, mediante la
ejecución de una rutina de servicio de interrupción, una vez que se concluye
esta, el procesador continua con la tarea que estaba ejecutando antes de
haber sido interrumpido.
• A diferencia de una subrutina ordinaria que termina con una instrucción
return, Las rutinas de servicio de interrupción deben concluir con la
instrucción retfie que significa “retorno de interrupción habilitada” (return
from interrupt enable)

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

Observamos que esta familia de microcontroladores tiene cuatro timers, tres de


ellos pueden ser timers, es decir funcionan con el ciclo interno de instrucción,
pero también pueden ser contadores, de tal manera que se incrementan de a
cuerdo a la detección de flancos activos por unos pines de entrada asociados
específicamente a cada timer. El timer2 es el único que no puede funcionar
como contador de eventos, de tal manera que siempre funcionara con respecto
al ciclo interno de instrucción.

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

Mediante los bits de selección de los multiplexores, se configura el


funcionamiento deseado. Por ejemplo el bit T0CS (Timer 0 Clock Select)
define si usaremos un contador de eventos externos o un temporizador:

9
El bit TOSE (Timer 0 Select Edge) selecciona el flanco con el que se incrementará el registro TMR0L

El bit TOSE (Timer 0 Select Edge) selecciona el flanco con el que se


incrementará el registro TMR0L, si es que seleccionó el modo de
contador de eventos externos.

Se puede seleccionar un predivisor (preescaler) programable, en la


analogía de la cubeta el predivisor seria equivalente a la llave de agua, ya
que depende de la cantidad de agua que deje pasar para llenar más
rápido o más lento la cubeta, la selección de este predivisor se
selecciona con el bit PSA

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

Los bits del timer0, que controlan su


funcionamiento, están contenidos en el
registro de control del timer0, denominado
T0CON.

12
TIMER0, modo 16 bits

El funcionamiento en modo 16 bits es igual al del modo 8 bits, la diferencia es


que se tienen ahora dos registros de 8 bits, TMR0L y TMR0H, para formar un
temporizador/ contador de 16 bits, con lo cual se podrá obtener un tiempo
mucho mas grande, es como si en lugar de llenar una cubeta con la llave de
agua, ahora ponemos un tambo. Si lo usamos en modo contador de eventos,
podremos contar hasta 65535.
13
Analogía de la cubeta
Una vez que hemos visto el funcionamiento del timer0, podemos concluir:
•El preescaler viene siendo la llave, ya que con ella se regula el chorro de agua,
y consecuentemente el tiempo en que tardará en desparramarse.
•El registro del timer, es equivalente a la capacidad del recipiente, por ejemplo
para el modo de 16 bits, ya no hablaríamos de una cubeta, sino tal vez de un
tonel.
•La cantidad de agua que se deposita previamente en la cubeta, para generar
intervalos de tiempo más pequeños, funciona exactamente de la misma manera
que el valor de precarga del timer.
•La interrupción se genera al desbordarse el timer, de la misma manera que
nosotros tenemos que suspender lo que hacemos, cuando escuchamos que se
empieza a desparramar el agua, y corremos a cerrar la llave.

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

También podría gustarte