1. GUÍA RÁPIDA
TIMER 0 E
INTERRUPCIONES
PROF. LUIS ZURITA
Microcontroladores I
2. REGISTROS ASOCIADOS AL
TEMPORIZADOR TMR0
• TMR0: Registro de 8 bits de lectura/escritura
• OPTION_REG: Configura al TMR0 para que trabaje
como temporizador ó contador y asigna el valor al
prescaler
• INTCON: Da información mediante el bit “TOIF”
cuando el TMR0 se ha desbordado.
• TRISA (PUERTO A): Permite el ingreso de pulsos
cuando el TMR0 está configurado como contador por
RA4/TOCKI
Microcontroladores I Prof. Luis Zurita
3. REGISTRO TMR0
• Es el corazón del módulo Timer0. Puede ser leído o
escrito en cualquier momento. El TMR0 se
incrementará automáticamente por cada ciclo de
instrucción y contará desde 0 (00H) hasta 255 (FFH)
(Contador de 8 bits).
• Ejemplo. Escribir 100 en el TMR0=
movlw .100
movwf TMR0
• Leer el valor del TMR0 y mostrarlo en el Puerto B=
movf TMR0,0
movwf PORTB
Microcontroladores I Prof. Luis Zurita
4. ¿CÓMO CUENTA EL TMR0?
00H
FFH
El TMR0 cuenta exclusivamente de
forma ascendente, nunca
descendente.
¿Quién incrementa al TMR0?
00H
Cada instrucción que se ejecuta en un
programa se encarga de
incrementarlo (28 – N10)
00H
FFH
Si el TMR0 se carga con un valor,
éste comenzará a contar desde el Valor cargado
valor cargado hasta que se En el TMR0
desborda (cuando pasa a 00H)
00H
Microcontroladores I Prof. Luis Zurita
5. ¿QUÉ ES EL PRESCALER?
• Divide la frecuencia de reloj de entrada del Timer0, entre valores predefinidos,
como se ve en la tabla asociada al registro OPTION, 1:32, 1: 64, 1:256, etc.,
genera una nueva señal de menor frecuencia a la salida, que será la señal de reloj
de entrada al registro TMR0.
• “Ralentiza” señales de entrada demasiado rápidas para nuestros propósitos.
• También existe un postescaler, asociado al perro guardián WDT (Watch Dog
Timer) del microcontrolador, pero en este caso recibe el nombre de postcaler ya
que se usa a la salida del WDT, no pudiendo estar asignado a la vez al Timer0 o al
WDT. El preescaler es transparente para el programador, no se puede leer ni
escribir sobre él, pero se puede seleccionar por software, como ya se ha dicho,
mediante el registro OPTION.
• Nota: Para evitar un RESET no deseado del sistema, es necesario ejecutar una
secuencia de instrucciones específicas cuando se cambia la asignación del
prescaler del TMR0 al WDT. Esta secuencia debe ser seguida, aún cuando el WDT
esté inactivo.
Microcontroladores I Prof. Luis Zurita
6. CÁLCULOS CON EL TMR0
• Cuando se carga en el registro TMR0 un valor XX, éste contará:
(256 – XX) impulsos y el tiempo que tarda en hacerlo viene dado
por la expresión:
Temporización= 4*TOSC*ValorRealTMR0*ValorPreescaler
TOSC = período de oscilación = 1 / FOSC
FOSC = viene dado por el cristal de cuarzo o resonador
que se esté utilizando. Los típicos son=
XT = 4 MHz
HS= 20 MHz
Valor Real TMR0 = (28 – N10) = (256 – N10)
N10= Valor a cargar en el TMR0
ValorPreescaler = puede tomar uno de estos valores=
2 , 4, 8, 16, 32, 64, 128, 256
Microcontroladores I Prof. Luis Zurita
7. CÁLCULOS CON EL TMR0
Sea un valor a cargar en el TMR0 de 100, un prescaler
seleccionado de 1:32 y un oscilador XT. Determine el tiempo
en que tardará el TMR0 en desbordarse.
Solución: Sea XT = Frecuencia = 4 MHz, T = 0.25 μs.
Temporización= 4*0.25 μs* (256 – 100) * 32 = 4.992 ms.
Se desea saber: ¿Qué valor debemos cargar en el TMR0, si
deseamos obtener una temporización de 10,24 ms, utilizando
un preescaler de 128 y un cristal XT?
Solución: Temporizac ión 10,24ms
(256 – N10) = = = 80
4 TOSC Valorprees caler 4 250ns 128
(256 – N10) = 80, despejando N10 = (256 – 80) = 176, el valor que
debemos cargar en el TMR0 es 176, para que éste cuente desde 176
hasta 256.
Microcontroladores I Prof. Luis Zurita
8. • Elegir el TMR0, para generar un retraso de 50 ms utilizando un
oscilador de 4 MHz.
Solución: Sea Fosc= 4 MHz, T = 0.25 μs.
(256 – N10) = Temporización = 50ms
4 TOSC Valorpreescaler 4 250ns Valorpreescaler
N10 = 256 - (50000/Valorpreescaler), supongamos que elegimos
Preescaler 32, entonces tendremos=
N10 = 256 - (50000/32) = 256 – 1562,5 = - 1306,5. Si da un
número negativo, no es válido, por lo que debemos subir el valor
del preescaler hasta que la resta sea positiva.
Para un preescaler de 64, tendremos =
N10 = 256 - (50000/64) = 256 – 781,25= - 525,25. Como es
negativo, subimos el preescaler nuevamente.
Para un preescaler de 128, tendremos =
N10 = 256 - (50000/128) = 256 – 390,625= - 134,625. Como es
negativo, subimos el preescaler nuevamente.
Para un preescaler de 64, tendremos =
N10 = 256 - (50000/256) = 256 – 195,3125= 60,69. Como es
positivo tomaremos este preescaler.
Microcontroladores I Prof. Luis Zurita
9. Entonces se debe cargar 60,69, aproximado a 61 en el TMR0
para que tarde en desbordarse=
Temporización= 4*TOSC*ValorRealTMR0*ValorPreescaler,
sustituyendo
Temporización= 4 * 250 ns * (256 – 61 ) * 256 = 49.92 ms ≈ 50 ms
• Para algunas temporizaciones el valor del preescaler puede
variar, siempre y cuando la resta [Valor Real TMR0 = (28 – N10) =
(256 – N10) ] sea positiva, por lo que puede darse cuenta de que
no hay un solo resultado para los ejercicios. Sin embargo, lo que
si debe cumplirse es que sea cualquiera que sean los valores que
se tomen para los cálculos, estos deben de estar cercanos a la
respuesta que se espera del temporizador que esté diseñando,
comprobando los resultados.
• Ejemplo. Diga ¿cuánto es la máxima temporización que se puede
hallar con el TMR0? Asuma que se está trabajando con un XT.
Solución: Tomamos el máximo factor de escala de división todos
los estados que puede contar el TMR0:
– Temporización= 4*0.25 μs*(256 )*256 = 65.536 ms.
– Este es el máximo valor que podemos conseguir del TMR0.
Microcontroladores I Prof. Luis Zurita
10. • ¿Cómo hacemos entonces para conseguir valores superiores a
éste, tales como 0,5 s; 1 s; 2 s; entre otros?
– Esto se puede arreglar si tenemos un contador de mayor
número de bits. La solución está en extender el Timer0 con
un registro (auxiliar) controlado por software.
– Dicho registro (auxiliar) contará el número de interrupciones
por desbordamiento que genera el Timer0, de forma de que
éste pase por cero, cuando haya pasado el tiempo que
estamos calculando.
Microcontroladores I Prof. Luis Zurita
11. USO DE REGISTRO AUXILIAR
Pasos:
1. Escoger un valor para el prescaler.
Un posible criterio es calcular todas las frecuencias de prescaler que
podemos obtener con cada divisor posible. Las frecuencias sin decimales
son interesantes al poder encontrar múltiplos de ellas a la salida del
TMR0 con mayor facilidad. En general, la elección del valor del prescaler
es empírica: depende del problema, la experiencia y sobre todo de la
práctica.
2. Determinar el valor del Registro Auxiliar, a partir del valor dado por
el TMR0.
Normalmente viene dado por un múltiplo de la frecuencia, asociada al
tiempo calculado. Con un ejemplo entenderemos mejor lo que se desea
plantear:
Ejemplo: Determine los valores del TMR0 y del Registro Auxiliar para
conseguir una temporización de 1 segundo. Utilice un oscilador XT.
Solución: XT= Frecuencia = 4 MHz ; Tosc= 250 ns
• Paso 1. Como no se nos ha impuesto que prescaler utilizar ni que
temporización, podemos aleatoria mente escogerlas, como en el ejemplo
6. Evaluando cualquiera, cuya temporización del TMR0 se basó en 5 ms,
escojamos el prescaler 128 y sustituyamos los valores en la ecuación
principal:
– Temporización= 4*250 ns*(256 - 217)*128 = 4.992 ms
Microcontroladores I Prof. Luis Zurita
12. CONTINUACIÓN DEL EJEMPLO ANTERIOR
• Paso 2. ¿Qué valor debe de tener el registro auxiliar?
a) Al tiempo de 4.992 ms, se asocia una frecuencia del TMR0 de =
1
= 200.3 Hz, redondeando, tomamos este múltiplo:
4.992 ms
200, Así, tendremos entonces que si multiplicamos 200*4.992
ms = 0.998 s, que es un valor bastante cercano a 1 segundo.
b) La misma operación pero interpretada de una forma más sencilla
es determinar cuantas veces necesitamos al tiempo calculado
para lograr un segundo:
1segundo
200.32
4.992 ms
La que usted entienda mejor es válida.
Nuestro registro auxiliar debe ser de 200!!!
Recuerde de que éste registro auxiliar no debe superar 255.
Si supera este valor, se debe adicionar un nuevo registro
auxiliar
Microcontroladores I Prof. Luis Zurita
13. CONFIGURACIÓN DEL TMR0
• Para que opere como temporizador, el bit TOCS (del
registro OPTION_REG) debe ser cero (0), el bit
PSA= 0 y deben ser cargados los bits PS2 a PS0,
según sea el preescaler a utilizar para lograr nuestra
temporización.
• Para que opere como contador, se usa una entrada de
reloj externo en el TMR0 y se deben de cumplir
ciertos requisitos para que el reloj externo pueda ser
sincronizado con el reloj interno (TOSC). Además
existe un retardo en el incremento real del TMR0,
después de la sincronización. El bit TOCS= 1. Se debe
seleccionar el tipo de flanco que producirá el
incremento del TMR0 ( TOSE = 1 ó 0).
Microcontroladores I Prof. Luis Zurita
14. REGISTRO OPTION_REG (Dirección 81H)
• bit 7, RPBU : Resistencia Pull-up, Puerto B, habilita el
bit
1: Desactivadas
0: Activadas PS2 PS1 PSO
• bit 6, INTEDG: Flanco activo para el control de
interrupciones
1: Con flanco Ascendente
0: Con flanco Descendente
• bit 5, TOCS: Fuente de Reloj para TMR0
1: Pulsos introducidos a través de RA4/T0CK1
(Contador)
0: Pulsos de reloj interno Fosc/4 (Temporizador)
• bit 4, TOSE: Tipo de flanco en TOCK1
1: Incremento de TMR0 cada flanco descendente
0: Incremento de TMR0 cada flanco ascendente
• bit 3, PSA: Bit de asignación del prescaler divisor de
frecuencia
1: El divisor de frecuencia se asigna al WDT
0: El divisor de frecuencia se asigna al TMR0
• bitS 2,1,0, PS2,PS1,PSO: Rango con el que actúa el
divisor de frecuencia o preescaler usado en los cálculos
Microcontroladores I Prof. Luis Zurita
15. EJEMPLOS DE CONFIGURACIÓN
• Configure al PIC16F84 para que el temporizador TMR0, trabaje con los
pulsos provenientes de un reloj externo, y el mismo cambie en el flanco
de bajada de cada dos pulsos externos:
• Configure al PIC16F84 para que el TMR0, trabaje con el reloj interno y la
frecuencia del mismo sea dividida por 32:
¿Cómo lo cargo al OPTION_REG?
En el primer caso: En el segundo caso:
movlw b’xx11x001’ movlw b’xx0x0100’
movwf OPTION_REG movwf OPTION_REG
¿Y los demás bits? = No importa lo que se cargue, si no se van
a trabajar con ellos
Microcontroladores I Prof. Luis Zurita
16. DE LOS CÁLCULOS A LA PROGRAMACIÓN
• Normalmente, se va a trabajar con el TMR0, para programarlo
con un tiempo en particular para que se desborde y produzca una
interrupción.
• Esto hará que se entre a una subrutina de interrupción que se
estudiará en las siguientes diapositivas, lo que permitirá ejecutar
un programa principal, y cada cierto tiempo (cálculos), va a
ejecutar una subrutina, regresando nuevamente al programa
principal, desde donde se produjo la interrupción.
• Para esto=
1. Se deben hacer los cálculos.
2. Se debe configurar el registro OPTION_REG, con el TMR0
como temporizador y asignar el valor del prescaler que se ha
utilizado en los cálculos.
3. Programar lo que se desea realizar durante la rutina de
interrupción por desborde del TMR0 y antes de salir de esta
rutina, cargar el valor del TMR0 para que vuelva a tener la
misma temporización.
Microcontroladores I Prof. Luis Zurita
17. Para que se produzca una interrupción cada 50 ms, se hacen los cálculos=
Temporización= 4 * 250 ns * (256 – 61 ) * 256 = 49.92 ms ≈ 50 ms
¿Qué valor se carga en el Prescaler?
¿Y qué valor se carga en el TMR0?
Microcontroladores I Prof. Luis Zurita
18. INTERRUPCIONES
• “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 una patilla del
microcontrolador, o bien, internos, como el desbordamiento de un
contador. Su comportamiento es similar al de la instrucción “call” de
llamado a subrutina. Se detiene la ejecución del programa en curso, se
salva la dirección actual del contador de programa (PC) en la pila (STACK)
y se carga el PC con una dirección, que en el caso de una interrupción es
una dirección reservada de la memoria de código, llamada vector de
interrupción”. Parejo. Microcontroladores PIC. Pág. 117. 2da Edición.
• En el PIC 16F84, este vector de interrupción está ubicado en la posición
04H, en donde comenzará la rutina de servicio de la interrupción. Ejemplo:
org 00H ; Vector de origen del programa
goto INICIO ; salto a la rutina de programa principal
org 04H ; Vector de interrupción
goto INTERR; salto a la rutina de interrupción.
• La idea de colocar una instrucción de salto incondicional, es la de trasladar
el flujo del programa a la zona de memoria de código que contiene a la
rutina de interrupción.
Microcontroladores I Prof. Luis Zurita
19. DIAGRAMA DE FLUJO DURANTE UNA INTERRUPCIÓN
Programa normal
Instrucción 1 Rutina de Servicio de Interrupción
Instrucción 2 Instrucción 1
Instrucción 3 Instrucción 2
… …
…
…
…
…
RETFIE
Instrucción 24
Instrucción 25
… Nota: Una Rutina de Servicio
… de Interrupción puede ser
igual de extensa e incluso
Instrucción N más que el mismo programa
Fin de programa principal.
Microcontroladores I Prof. Luis Zurita
21. CAUSAS DE INTERRUPCIÓN
1. Activación del pin RB0/INT
2. Desbordamiento del TMR0
3. Cambio de estado de una de los 4 pines de más peso
(RB7:RB4) del puerto B
4. Finalización de la escritura en la EEPROM de datos
REGISTRO INTCON
• Este registro se encuentra ubicado en la posición 0BH del banco
0 de los registros de funciones especiales (SFR). A continuación
se describirán cada uno de sus bits:
Microcontroladores I Prof. Luis Zurita
22. INTCON
• GIE: (Global Interrupt Enable), Permiso Global de Interrupciones
1: Habilita todas las interrupciones, cuyos bits de permiso individuales
también las permitan
0: Deshabilita todas las interrupciones
• EEIE: (EEPROM Interrupt Enable), Permiso de Interrupción por fin de
escritura en la EEPROM
1: Habilita la interrupción cuando termina la escritura de la EEPROM de
datos
0: Deshabilita esta interrupción
• TOIE: (TMR0 Overflow Interrupt Enable), Permiso de interrupción
por desborde del TMR0
1: Habilita una interrupción por desborde del TMR0
0: Deshabilita esta interrupción
• INTE: (Interrupt Enable RB0/INT), Permiso de interrupción por
activación del pin RB0/INT
1: Habilita la interrupción al activarse RB0/INT
0: Deshabilita esta interrupción
Microcontroladores I Prof. Luis Zurita
23. INTCON
• RBIE: (RB Port Change Interrupt Enable), Permiso de interrupción por
cambio de estado en RB7:RB4
1: Habilita esta interrupción
0: Deshabilita esta interrupción
• TOIF: (TMR0 Overflow Interrupt Flag), Señalizador de desborde del
TMR0
1: Ha ocurrido un desborde del TMR0
0: No se ha desbordado el TMR0
• INTF: (RB0/INT Interrupt Flag), Señalizador de activación del pin
RB0/INT
1: Se ha activado RB0/INT
0: No se ha activado RB0/INT
• RBIF: (RB Port Change Interrupt Flag), Señalizador de cambio de estado
en RB7:RB4
1: Pasa a 1 cuando cambia el estado de alguna de estas 4 líneas
0: No ha cambiado el estado de RB7: RB4
Microcontroladores I Prof. Luis Zurita
24. • Habilite la interrupción por desborde del TMR0=
movlw b’10100000’
movwf INTCON
• Habilite la interrupción por cambio de nivel en RB0/INT
movlw b’10010000’
movwf INTCON
• Habilite las interrupciones por desborde del TMR0 y
cambio de nivel en RB0/INT
movlw b’10110000’
movwf INTCON
Microcontroladores I Prof. Luis Zurita
25. ¿Cómo determinar la causa de una
interrupción?
• Si se han activado dos o más causas de interrupción, como
desborde del TMR0 y cambio de nivel en RB0/INT, cuando
alguna de éstas ocurren, ellas van a la misma rutina de
interrupción.
• Ahora ¿cómo saber cuál es la causa?, mediante el testeo de
los señalizadores o flags, recordando que se pondrán a nivel
alto (1), cuando se haya activado la correspondiente.
• Por lo tanto, con unas simples preguntas dentro de la rutina
de servicio de interrupción, se determinará la causante:
Microcontroladores I Prof. Luis Zurita
26. Ejemplo. Realicemos un programa
completo que contenga varias
interrupciones. Si la causa ha sido la
activación del pin RB0, se debe
mostrar un dos en binario en el ¿RB0/INT?
¿INTF=1?
puerto A, si ha sido un cambio de
nivel en RB4:RB7, se debe mostrar
el uno en binario en el puerto A y si
se ha desbordado el TMR0, se debe
mostrar el cuatro en binario en el ¿RB4:RB7?
¿RBIF=1?
puerto A.
¿TMR0?
¿TOIF=1?
Programa Principal RSI
Microcontroladores I Prof. Luis Zurita
27. SALVANDO EL ENTORNO
Salvar el entorno, se refiere a mantener el valor exacto que
tienen los registros de trabajo STATUS y W, y cualquier otro de
importancia, incluyendo los puertos que controlan a los
actuadores, que no vaya a ser modificado dentro de la subrutina
de servicio de interrupción.
Para salvar el entorno cuando ocurre una interrupción se
recomienda seguir los siguientes pasos:
– Salvar a w y a STATUS.
– Almacenar a w en un registro general llamado W_TEMP
– Almacenar a STATUS en un registro general llamado
STATUS_TEMP
– Almacenar cualquier PortX que maneje actuadores
– Se ejecuta la rutina de interrupción (queda expresada para
efectos del ejemplo siguiente)
– Restauramos a PortX
– Restauramos a STATUS
– Restauramos a w
NOTA: Los registros generales W_TEMP, STATUS_TEMP, y el de
puertos deben ser declarados al inicio del programa, para no
generar errores.
Microcontroladores I Prof. Luis Zurita
28. SALVANDO EL ENTORNO
; Asuma que desea salvar el PORTB, durante una interrupción=
; **** Rutina para salvar el entorno ****
PUSH movwf W_TEMP ; Salvamos w a este registro temporal
movf STATUS,0 ;
movwf STATUS_TEMP ; Salvamos STATUS en STATUS_TEMP
movf PORTB,0
movwf CopiaPORTB ; Salvamos a PORTB
RUT_INT
;Aquí estará la rutina de servicio de interrupción
;
POP movf CopiaPORTB,0 ; Restauramos el PORTB a su valor antes de
movwf PORTB ; haber entrado a la rutina de interrupción
movf STATUS_TEMP,0 ; Movemos w al registro STATUS,
; retornando el
movwf STATUS ; valor original
movf W_TEMP,0 ; W_TEMP lo trasladamos a w
; retornando el valor original que tenía antes
; de entrar a la rutina de interrupción.
Microcontroladores I Prof. Luis Zurita
29. ¿CUANDO UTILIZAR UNA
INTERRUPCIÓN?
Una interrupción es muy importante cuando deseamos realizar
una tarea que no dependa de una exploración constante del programa
sobre la misma.
También cuando deseamos que nuestro programa responda de
forma inmediata y automática a determinados eventos.
Ejemplo del uso de Interrupción:
• En los sistemas de control, cuando se necesita un pulsador de parada
de emergencia (PARE RB0/INT).
• En el manejo de teclados, se recomienda su uso, ya que se puede
meter al microcontrolador en un estado de reposo, ahorrando energía
y esperando a que se pulse una tecla para iniciar una rutina de
servicio (CLAVE).
• Cuando deseamos que el programa haga una tarea cada cierto tiempo,
independientemente de lo que se encuentre haciendo en el programa
principal. (DESBORDE DEL TMR0).
Microcontroladores I Prof. Luis Zurita