Timer 0 Interrupciones Pic16f887

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

GUA RPIDA

TIMER 0 E
INTERRUPCIONES
PROF. LUIS ZURITA

Microcontroladores I

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 informacin 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

REGISTRO TMR0
Es el corazn del mdulo Timer0. Puede ser ledo o
escrito en cualquier momento. El TMR0 se
incrementar automticamente por cada ciclo de
instruccin 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

CMO CUENTA EL TMR0?


El TMR0 cuenta exclusivamente de
forma
ascendente,
nunca
descendente.
Quin incrementa al TMR0?
Cada instruccin que se ejecuta en un
programa
se
encarga
de
incrementarlo

00H
FFH

00H
(28 N10)
00H
FFH

Si el TMR0 se carga con un valor,


ste comenzar a contar desde el
valor cargado hasta que se
desborda (cuando pasa a 00H)

Valor cargado
En el TMR0
00H

Microcontroladores I

Prof. Luis Zurita

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 seal de menor frecuencia a la salida, que ser la seal de reloj
de entrada al registro TMR0.
Ralentiza seales de entrada demasiado rpidas para nuestros propsitos.
Tambin existe un postescaler, asociado al perro guardin 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 especficas cuando se cambia la asignacin del
prescaler del TMR0 al WDT. Esta secuencia debe ser seguida, an cuando el WDT
est inactivo.

Microcontroladores I

Prof. Luis Zurita

CLCULOS 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 expresin:

Temporizacin= 4*TOSC*ValorRealTMR0*ValorPreescaler

TOSC = perodo de oscilacin = 1 / FOSC


FOSC = viene dado por el cristal de cuarzo o resonador
que se est utilizando. Los tpicos 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

CLCULOS 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.
Solucin: Sea XT = Frecuencia = 4 MHz, T = 0.25 s.
Temporizacin= 4*0.25 s* (256 100) * 32 = 4.992 ms.
Se desea saber: Qu valor debemos cargar en el TMR0, si
deseamos obtener una temporizacin de 10,24 ms, utilizando
un preescaler de 128 y un cristal XT?
Solucin:
(256 N10) =

Temporizac in
=
4 TOSC Valorprees caler

10,24ms
4 250ns 128

= 80

(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

Elegir el TMR0, para generar un retraso de 50 ms utilizando un


oscilador de 4 MHz.
Solucin: Sea Fosc= 4 MHz, T = 0.25 s.
(256 N10) =

Temporizacin
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
nmero negativo, no es vlido, 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

Entonces se debe cargar 60,69, aproximado a 61 en el TMR0


para que tarde en desbordarse=
Temporizacin= 4*TOSC*ValorRealTMR0*ValorPreescaler,
sustituyendo
Temporizacin= 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 clculos, estos deben de estar cercanos a la
respuesta que se espera del temporizador que est diseando,
comprobando los resultados.
Ejemplo. Diga cunto es la mxima temporizacin que se puede
hallar con el TMR0? Asuma que se est trabajando con un XT.
Solucin: Tomamos el mximo factor de escala de divisin todos
los estados que puede contar el TMR0:
Temporizacin= 4*0.25 s*(256 )*256 = 65.536 ms.
Este es el mximo valor que podemos conseguir del TMR0.
Microcontroladores I

Prof. Luis Zurita

Cmo 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
nmero de bits. La solucin est en extender el Timer0 con
un registro (auxiliar) controlado por software.
Dicho registro (auxiliar) contar el nmero 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

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 mltiplos de ellas a la salida del
TMR0 con mayor facilidad. En general, la eleccin del valor del prescaler
es emprica: depende del problema, la experiencia y sobre todo de la
prctica.
2. Determinar el valor del Registro Auxiliar, a partir del valor dado por
el TMR0.
Normalmente viene dado por un mltiplo 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 temporizacin de 1 segundo. Utilice un oscilador XT.
Solucin: XT= Frecuencia = 4 MHz ; Tosc= 250 ns
Paso 1. Como no se nos ha impuesto que prescaler utilizar ni que
temporizacin, podemos aleatoria mente escogerlas, como en el ejemplo
6. Evaluando cualquiera, cuya temporizacin del TMR0 se bas en 5 ms,
escojamos el prescaler 128 y sustituyamos los valores en la ecuacin
principal:
Temporizacin= 4*250 ns*(256 - 217)*128 = 4.992 ms

Microcontroladores I

Prof. Luis Zurita

CONTINUACIN 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 mltiplo:
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 operacin pero interpretada de una forma ms 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 vlida.


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

CONFIGURACIN 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,
segn sea el preescaler a utilizar para lograr nuestra
temporizacin.
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). Adems
existe un retardo en el incremento real del TMR0,
despus de la sincronizacin. 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

REGISTRO OPTION_REG (Direccin 81H)

bit 7, RPBU : Resistencia Pull-up, Puerto B, habilita el


bit
1: Desactivadas
0: Activadas
PS2
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 travs 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 asignacin 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 acta el
divisor de frecuencia o preescaler usado en los clculos

Microcontroladores I

PS1 PSO

Prof. Luis Zurita

EJEMPLOS DE CONFIGURACIN

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:

Cmo lo cargo al OPTION_REG?


En el primer caso:

En el segundo caso:

movlw

bxx11x001

movlw

bxx0x0100

movwf

OPTION_REG

movwf

OPTION_REG

Y los dems bits? = No importa lo que se cargue, si no se van


a trabajar con ellos

Microcontroladores I

Prof. Luis Zurita

DE LOS CLCULOS A LA PROGRAMACIN


Normalmente, se va a trabajar con el TMR0, para programarlo
con un tiempo en particular para que se desborde y produzca una
interrupcin.
Esto har que se entre a una subrutina de interrupcin que se
estudiar en las siguientes diapositivas, lo que permitir ejecutar
un programa principal, y cada cierto tiempo (clculos), va a
ejecutar una subrutina, regresando nuevamente al programa
principal, desde donde se produjo la interrupcin.
Para esto=
1. Se deben hacer los clculos.
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 clculos.
3. Programar lo que se desea realizar durante la rutina de
interrupcin por desborde del TMR0 y antes de salir de esta
rutina, cargar el valor del TMR0 para que vuelva a tener la
misma temporizacin.
Microcontroladores I

Prof. Luis Zurita

Para que se produzca una interrupcin cada 50 ms, se hacen los clculos=
Temporizacin= 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

INTERRUPCIONES

Las interrupciones son desviaciones del flujo de control del programa


originadas asncronamente, por diversos sucesos que no se hallan bajo la
supervisin de las instrucciones. Dichos sucesos pueden ser externos al
sistema, como la generacin 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 instruccin call de
llamado a subrutina. Se detiene la ejecucin del programa en curso, se
salva la direccin actual del contador de programa (PC) en la pila (STACK)
y se carga el PC con una direccin, que en el caso de una interrupcin es
una direccin reservada de la memoria de cdigo, llamada vector de
interrupcin. Parejo. Microcontroladores PIC. Pg. 117. 2da Edicin.

En el PIC 16F84, este vector de interrupcin est ubicado en la posicin


04H, en donde comenzar la rutina de servicio de la interrupcin. Ejemplo:
org 00H
; Vector de origen del programa
goto INICIO ; salto a la rutina de programa principal
org 04H
; Vector de interrupcin
goto INTERR; salto a la rutina de interrupcin.

La idea de colocar una instruccin de salto incondicional, es la de trasladar


el flujo del programa a la zona de memoria de cdigo que contiene a la
rutina de interrupcin.

Microcontroladores I

Prof. Luis Zurita

DIAGRAMA DE FLUJO DURANTE UNA INTERRUPCIN


Programa normal
Instruccin 1

Rutina de Servicio de Interrupcin

Instruccin 2

Instruccin 1

Instruccin 3

Instruccin 2

Instruccin 24

RETFIE

Instruccin 25

Instruccin N
Fin de programa
Microcontroladores I

Nota: Una Rutina de Servicio


de Interrupcin puede ser
igual de extensa e incluso
ms que el mismo programa
principal.
Prof. Luis Zurita

DIAGRAMA DE
FLUJO RSI

Microcontroladores I

Prof. Luis Zurita

CAUSAS DE INTERRUPCIN
1.
2.
3.
4.

Activacin del pin RB0/INT


Desbordamiento del TMR0
Cambio de estado de una de los 4 pines de ms peso
(RB7:RB4) del puerto B
Finalizacin de la escritura en la EEPROM de datos

REGISTRO INTCON
Este registro se encuentra ubicado en la posicin 0BH del banco
0 de los registros de funciones especiales (SFR). A continuacin
se describirn cada uno de sus bits:

Microcontroladores I

Prof. Luis Zurita

INTCON

GIE: (Global Interrupt Enable), Permiso Global de Interrupciones


1: Habilita todas las interrupciones, cuyos bits de permiso individuales
tambin las permitan
0: Deshabilita todas las interrupciones
EEIE: (EEPROM Interrupt Enable), Permiso de Interrupcin por fin de
escritura en la EEPROM
1: Habilita la interrupcin cuando termina la escritura de la EEPROM de
datos
0: Deshabilita esta interrupcin
TOIE: (TMR0 Overflow Interrupt Enable), Permiso de interrupcin
por desborde del TMR0
1: Habilita una interrupcin por desborde del TMR0
0: Deshabilita esta interrupcin
INTE: (Interrupt Enable RB0/INT), Permiso de interrupcin por
activacin del pin RB0/INT
1: Habilita la interrupcin al activarse RB0/INT
0: Deshabilita esta interrupcin

Microcontroladores I

Prof. Luis Zurita

INTCON

RBIE: (RB Port Change Interrupt Enable), Permiso de interrupcin por


cambio de estado en RB7:RB4
1: Habilita esta interrupcin
0: Deshabilita esta interrupcin
TOIF: (TMR0 Overflow Interrupt Flag), Sealizador de desborde del
TMR0
1: Ha ocurrido un desborde del TMR0
0: No se ha desbordado el TMR0
INTF: (RB0/INT Interrupt Flag), Sealizador de activacin del pin
RB0/INT
1: Se ha activado RB0/INT
0: No se ha activado RB0/INT
RBIF: (RB Port Change Interrupt Flag), Sealizador de cambio de estado
en RB7:RB4
1: Pasa a 1 cuando cambia el estado de alguna de estas 4 lneas
0: No ha cambiado el estado de RB7: RB4

Microcontroladores I

Prof. Luis Zurita

Habilite la interrupcin por desborde del TMR0=


movlw
b10100000
movwf
INTCON
Habilite la interrupcin por cambio de nivel en RB0/INT
movlw
b10010000
movwf
INTCON
Habilite las interrupciones por desborde del TMR0 y
cambio de nivel en RB0/INT
movlw
b10110000
movwf
INTCON
Microcontroladores I

Prof. Luis Zurita

Cmo determinar la causa de una


interrupcin?
Si se han activado dos o ms causas de interrupcin, como
desborde del TMR0 y cambio de nivel en RB0/INT, cuando
alguna de stas ocurren, ellas van a la misma rutina de
interrupcin.
Ahora cmo saber cul es la causa?, mediante el testeo de
los sealizadores o flags, recordando que se pondrn a nivel
alto (1), cuando se haya activado la correspondiente.
Por lo tanto, con unas simples preguntas dentro de la rutina
de servicio de interrupcin, se determinar la causante:

Microcontroladores I

Prof. Luis Zurita

Ejemplo. Realicemos un programa


completo que contenga varias
interrupciones. Si la causa ha sido la
activacin del pin RB0, se debe
mostrar un dos en binario en el
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
puerto A.

RB0/INT?
INTF=1?

RB4:RB7?
RBIF=1?

TMR0?
TOIF=1?

Programa Principal
Microcontroladores I

RSI

Prof. Luis Zurita

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 interrupcin.
Para salvar el entorno cuando ocurre una interrupcin 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 interrupcin (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

SALVANDO EL ENTORNO
; Asuma que desea salvar el PORTB, durante una interrupcin=
; **** 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 interrupcin
;
POP
movf
CopiaPORTB,0 ; Restauramos el PORTB a su valor antes de
movwf PORTB
; haber entrado a la rutina de interrupcin
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 tena antes
; de entrar a la rutina de interrupcin.

Microcontroladores I

Prof. Luis Zurita

CUANDO UTILIZAR UNA


INTERRUPCIN?
Una interrupcin es muy importante cuando deseamos realizar
una tarea que no dependa de una exploracin constante del programa
sobre la misma.
Tambin cuando deseamos que nuestro programa responda de
forma inmediata y automtica a determinados eventos.
Ejemplo del uso de Interrupcin:
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 energa
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

También podría gustarte