Este documento describe los temporizadores y sus características en los microcontroladores. Explica que el Timer 0 puede funcionar como un temporizador/contador de 8/16 bits que puede ser configurado para usar un reloj interno o externo, y que permite programar un divisor de frecuencia. También cubre cómo calcular el tiempo de temporización usando el Timer 0 dependiendo del ciclo de instrucción, el valor cargado en el registro y el divisor de frecuencia seleccionado.
2. GENERALIDADES
Las interrupciones son desviaciones del flujo de
control del programa originadas asíncronamente por
diversos sucesos que no se hallan bajo la supervisión
de las instrucciones.
Dichos sucesos pueden ser externos al sistema,
como la generación de un flanco o nivel activo en un
pin del microcontrolador, o bien internos, como el
desbordamiento de un contador.
Las interrupciones son desviaciones del flujo de
control del programa originadas asíncronamente por
diversos sucesos que no se hallan bajo la supervisión
de las instrucciones.
Dichos sucesos pueden ser externos al sistema,
como la generación de un flanco o nivel activo en un
pin del microcontrolador, o bien internos, como el
desbordamiento de un contador.
3. GENERALIDADES
Se detiene la ejecución del programa en curso, se
salva la dirección actual del PC en la Pila y se carga
el PC con una dirección, en el caso de una
interrupción es una dirección “reservada” de la
memoria de código, llamada Vector de
interrupción, 0x04 para los microcontroladores de
la gama baja y media; mientras que en la gama alta
existen dos direcciones: 0x08 prioridad alta y 0x18
prioridad baja.
Se detiene la ejecución del programa en curso, se
salva la dirección actual del PC en la Pila y se carga
el PC con una dirección, en el caso de una
interrupción es una dirección “reservada” de la
memoria de código, llamada Vector de
interrupción, 0x04 para los microcontroladores de
la gama baja y media; mientras que en la gama alta
existen dos direcciones: 0x08 prioridad alta y 0x18
prioridad baja.
9. DESCRIPCIÓN
Esta fuente de interrupción es sumamente importante
para atender acontecimientos externos en tiempo real.
Cuando ocurre alguno de ellos activa el pin RB0/INT y
se hace una petición de interrupción, en forma
automática.
Este método es más eficaz que la técnica de sondeo ya
que el microcontrolador no perderá tiempo preguntando
a la línea de entrada para leer su estado, sino que
únicamente atenderá al periférico cuando éste se lo pida
mediante la solicitud de interrupción.
Esta fuente de interrupción es sumamente importante
para atender acontecimientos externos en tiempo real.
Cuando ocurre alguno de ellos activa el pin RB0/INT y
se hace una petición de interrupción, en forma
automática.
Este método es más eficaz que la técnica de sondeo ya
que el microcontrolador no perderá tiempo preguntando
a la línea de entrada para leer su estado, sino que
únicamente atenderá al periférico cuando éste se lo pida
mediante la solicitud de interrupción.
10. RB0/INT - PICC
En el caso de la interrupción externa RB0/INT de los
PIC18FXXX se tiene la siguiente directiva.
#INT_EXT – flanco en el pin RB0. Se activa la bandera INTF.
La directiva #INT_Global indica que la función que va a
continuación sustituye todas las acciones que inserta el
compilador al aceptarse una interrupción. Sólo se ejecuta lo
que vaya en dicha función.
En el caso de la interrupción externa RB0/INT de los
PIC18FXXX se tiene la siguiente directiva.
#INT_EXT – flanco en el pin RB0. Se activa la bandera INTF.
La directiva #INT_Global indica que la función que va a
continuación sustituye todas las acciones que inserta el
compilador al aceptarse una interrupción. Sólo se ejecuta lo
que vaya en dicha función.
11. RB0/INT - PICC
Si se utilizan las directivas de interrupción, el
compilador genera el código necesario para saltar a la
función que va tras esta directiva en el momento de
la interrupción.
Además, genera el código para salvar al principio y
restituir al final el contexto, y también borrará la
bandera que se activó con la interrupción. El
programador, solo debe encargarse de habilitar
las interrupciones.
Si se utilizan las directivas de interrupción, el
compilador genera el código necesario para saltar a la
función que va tras esta directiva en el momento de
la interrupción.
Además, genera el código para salvar al principio y
restituir al final el contexto, y también borrará la
bandera que se activó con la interrupción. El
programador, solo debe encargarse de habilitar
las interrupciones.
12. RB0/INT - PICC
Existe también otra función adicional destinada a
configurar el flanco activo que genera la interrupción
externa (en RB0).
ext_int_edge (0, H_TO_L); - equivale a INTEDG=0.
Selecciona el flanco de bajada para activar la bandera
INTF.
ext_int_edge (0, L_TO_H); - equivale a INTEDG=1.
Selecciona el flanco de subida para activar la bandera
INTF.
Existe también otra función adicional destinada a
configurar el flanco activo que genera la interrupción
externa (en RB0).
ext_int_edge (0, H_TO_L); - equivale a INTEDG=0.
Selecciona el flanco de bajada para activar la bandera
INTF.
ext_int_edge (0, L_TO_H); - equivale a INTEDG=1.
Selecciona el flanco de subida para activar la bandera
INTF.
13. PRÁCTICA
Enunciado: Realizar un programa que indique en
tiempo real la recepción de una señal externa recibida
por el pin INT0, INT1, INT2 del microcontrolador. La
recepción de dicha señal se lo hará a través de tres
LEDs indicadores, los cuales se apagarán mientras se
presione el pulsador correspondiente.
Enunciado: Realizar un programa que indique en
tiempo real la recepción de una señal externa recibida
por el pin INT0, INT1, INT2 del microcontrolador. La
recepción de dicha señal se lo hará a través de tres
LEDs indicadores, los cuales se apagarán mientras se
presione el pulsador correspondiente.
17. DESCRIPCIÓN
Los pines <RB7:RB4> del PORTB producen una sola
interrupción por cambio de su estado.
Para activar la interrupción por cambio de estado en los
pines <RB7:RB4> los bits RBIE y GIE del registro
INTCON deben estar a “1”, en estas condiciones
cuando se produce un cambio de nivel en cualquiera de
las líneas RB7 a RB4 se activa la bandera RBIF del
registro INTCON.
Los pines <RB7:RB4> del PORTB producen una sola
interrupción por cambio de su estado.
Para activar la interrupción por cambio de estado en los
pines <RB7:RB4> los bits RBIE y GIE del registro
INTCON deben estar a “1”, en estas condiciones
cuando se produce un cambio de nivel en cualquiera de
las líneas RB7 a RB4 se activa la bandera RBIF del
registro INTCON.
18. RBI – CCS COMPILER
Entonces en la subrutina de interrupción se deberá hacer
el tratamiento respectivo para identificar cual de los
pines se activó.
En Lenguaje C, la interrupción se activa con
enable_interrupts(INT_RB) y la subrutina de
tratamiento de la interrupción se llama con INT_RB.
Entonces en la subrutina de interrupción se deberá hacer
el tratamiento respectivo para identificar cual de los
pines se activó.
En Lenguaje C, la interrupción se activa con
enable_interrupts(INT_RB) y la subrutina de
tratamiento de la interrupción se llama con INT_RB.
19. RBI – CCS COMPILER
En caso que se estén atendiendo varias interrupciones,
el compilador C, también tiene la directiva #priority que
sirve para fijar la prioridad de las interrupciones, así, las
interrupciones más importantes están son listadas al
principio.
Por ejemplo:
#priority ext, rbi; //la interrupción RB0/INT será
atendida antes de RBI.
En caso que se estén atendiendo varias interrupciones,
el compilador C, también tiene la directiva #priority que
sirve para fijar la prioridad de las interrupciones, así, las
interrupciones más importantes están son listadas al
principio.
Por ejemplo:
#priority ext, rbi; //la interrupción RB0/INT será
atendida antes de RBI.
20. PRÁCTICA
Enunciado: Se conectan 4 pulsadores a RB4, RB5,
RB6 y RB7 y una LCD al puerto D. Se realiza un
contador automática que dependa de la detección de
cambio de estado en cada pin RBI, de acuerdo al
siguiente detalle: +1, -1, -10, +10.
Enunciado: Se conectan 4 pulsadores a RB4, RB5,
RB6 y RB7 y una LCD al puerto D. Se realiza un
contador automática que dependa de la detección de
cambio de estado en cada pin RBI, de acuerdo al
siguiente detalle: +1, -1, -10, +10.
23. TIMER 0 - RTCC
Una de las labores más habituales en los programas
de control de dispositivos suele ser determinar
intervalos concretos de tiempo, y recibe el nombre
de temporizador (timer) el elemento encargado de
realizar esta función.
También suele ser frecuente contar los impulsos que
se producen en el exterior del sistema, y el elemento
destinado a este fin se llama contador.
Luis David Narváez
Una de las labores más habituales en los programas
de control de dispositivos suele ser determinar
intervalos concretos de tiempo, y recibe el nombre
de temporizador (timer) el elemento encargado de
realizar esta función.
También suele ser frecuente contar los impulsos que
se producen en el exterior del sistema, y el elemento
destinado a este fin se llama contador.
24. TIMER 0 - RTCC
TMR0 es un contador/temporizador de 8/16 bits.
Se puede leer y escribir.
Puede trabajar con reloj interno o con señal de reloj
externa.
Selección del flanco en el reloj externo.
Predivisor de frecuencia de reloj programable por
software de 8 bits.
Interrupción opcional en el desbordamiento.
Luis David Narváez
TMR0 es un contador/temporizador de 8/16 bits.
Se puede leer y escribir.
Puede trabajar con reloj interno o con señal de reloj
externa.
Selección del flanco en el reloj externo.
Predivisor de frecuencia de reloj programable por
software de 8 bits.
Interrupción opcional en el desbordamiento.
25. TEMPORIZACIÓN TIMER 0
El tiempo empleado en una temporización se puede
calcular a partir de un ciclo de instrucción (es decir una
instrucción por cada ½ microsegundo, si se trabaja con
un cristal HS de 8 MHz), también necesitamos el valor del
Divisor de Frecuencia (el que seleccionamos con los
bits PS2, PS1 y PS0), y finalmente con el complemento
del valor cargado en TMR0 (es decir 65536-TMR0), la
ecuación que nos permite realizar el cálculo es la que
sigue:
Temporización = Ciclo de instrucción * (65536 -
TMR0) * Divisor de Frecuencia
El tiempo empleado en una temporización se puede
calcular a partir de un ciclo de instrucción (es decir una
instrucción por cada ½ microsegundo, si se trabaja con
un cristal HS de 8 MHz), también necesitamos el valor del
Divisor de Frecuencia (el que seleccionamos con los
bits PS2, PS1 y PS0), y finalmente con el complemento
del valor cargado en TMR0 (es decir 65536-TMR0), la
ecuación que nos permite realizar el cálculo es la que
sigue:
Temporización = Ciclo de instrucción * (65536 -
TMR0) * Divisor de Frecuencia
26. TEMPORIZACIÓN TIMER 0
Se desea una temporización de 100 ms (100 milisegundos), con un
HS de 8 MHz., y que además seleccionamos como Divisor de
frecuencia 256 (es decir PS2,PS1,PS0 = 1,1,1). La pregunta, sería
¿Cuál es el valor que se debe cargar enTMR0?
Despejando
65536-TMR0 =Temporización(en microsegundos)/(1 us/cm* Div. de Frec.)
(cm ciclos máquina) y reemplazando tendremos
65536-TMR0 = 100000 us/(0,5 us/cm * 256)
65536-TMR0 ~ 781 cm
Se desea una temporización de 100 ms (100 milisegundos), con un
HS de 8 MHz., y que además seleccionamos como Divisor de
frecuencia 256 (es decir PS2,PS1,PS0 = 1,1,1). La pregunta, sería
¿Cuál es el valor que se debe cargar enTMR0?
Despejando
65536-TMR0 =Temporización(en microsegundos)/(1 us/cm* Div. de Frec.)
(cm ciclos máquina) y reemplazando tendremos
65536-TMR0 = 100000 us/(0,5 us/cm * 256)
65536-TMR0 ~ 781 cm
27. TEMPORIZACIÓN TIMER 0
Eso significa que en TMR0 deberemos cargar es:
65536-781=64755
A partir de allí el TMR0 contará los 781 ciclos que
faltan para desbordarse y producir la interrupción, y
el tiempo que tardará en hacerlo es 100ms
aproximadamente.
Eso significa que en TMR0 deberemos cargar es:
65536-781=64755
A partir de allí el TMR0 contará los 781 ciclos que
faltan para desbordarse y producir la interrupción, y
el tiempo que tardará en hacerlo es 100ms
aproximadamente.
29. TIMER 0 – PIC C
Escritura en el módulo TMR0
Set_timer0(valor);
Valor: Entero de 8/16 bits
Lectura en el módulo TMR0
Valor=get_timer0();
Valor: Entero de 8/16 bits
Luis David Narváez
Escritura en el módulo TMR0
Set_timer0(valor);
Valor: Entero de 8/16 bits
Lectura en el módulo TMR0
Valor=get_timer0();
Valor: Entero de 8/16 bits
30. TIMER 0 – PIC C
Los distintos modos se pueden agrupar mediante el
empleo del símbolo |. Por ejemplo:
Setup_timer_0(RTCC_Div_256|RTCC_Ext_L_to_H);
Nota!!! En ocasiones se emplea RTCC en lugar de
timer0, es decir, set_RTCC es lo mismo que
set_timer0.
Los distintos modos se pueden agrupar mediante el
empleo del símbolo |. Por ejemplo:
Setup_timer_0(RTCC_Div_256|RTCC_Ext_L_to_H);
Nota!!! En ocasiones se emplea RTCC en lugar de
timer0, es decir, set_RTCC es lo mismo que
set_timer0.
31. PRÁCTICA
Enunciado:
Desarrollar un programa que encienda y
apague secuencialmente un LED cada 300ms.
Para la temporización se empleará la
interrupción del TMR0.
Enunciado:
Desarrollar un programa que encienda y
apague secuencialmente un LED cada 300ms.
Para la temporización se empleará la
interrupción del TMR0.
32. DESARROLLO
Calcular la carga del TMR0 para 10 ms con un
divisor de frecuencia de 256 (Prescaler de 256)
Entonces usaremos un registro auxiliar con un
contenido de 30 para obtener los 300ms.
Carga Registro Auxiliar con 30 para obtener los
300ms de temporización.
Bucle infinito en el programa principal.
Calcular la carga del TMR0 para 10 ms con un
divisor de frecuencia de 256 (Prescaler de 256)
Entonces usaremos un registro auxiliar con un
contenido de 30 para obtener los 300ms.
Carga Registro Auxiliar con 30 para obtener los
300ms de temporización.
Bucle infinito en el programa principal.
33. DESARROLLO
Para la subrutina de interrupción, tenemos:
Recarga del TMR0 con su valor correspondiente para
obtener una temporización de 10ms.
Disminuir (aumentar) el Contador Auxiliar hasta
obtener los 300ms.
Verificar el estado del LED. Si está apagado lo enciende y
viceversa.
Mantener en ese estado (prendido o pagado) durante
300ms.
Regresar al programa principal.
Para la subrutina de interrupción, tenemos:
Recarga del TMR0 con su valor correspondiente para
obtener una temporización de 10ms.
Disminuir (aumentar) el Contador Auxiliar hasta
obtener los 300ms.
Verificar el estado del LED. Si está apagado lo enciende y
viceversa.
Mantener en ese estado (prendido o pagado) durante
300ms.
Regresar al programa principal.
37. EL TMR0 COMO CONTADOR DE
EVENTOS EXTERNOS
Práctica:
Enunciado:
Se desea realizar un programa que cuente los pulsos
provenientes por el pin RA4 mediante el TMR0 configurado
como contador, y el TMR1 como base de tiempo de 1s.
(Frecuencímetro)
De esta manera se visualizará la frecuencia en una LCD.
Práctica:
Enunciado:
Se desea realizar un programa que cuente los pulsos
provenientes por el pin RA4 mediante el TMR0 configurado
como contador, y el TMR1 como base de tiempo de 1s.
(Frecuencímetro)
De esta manera se visualizará la frecuencia en una LCD.