guía rápida tmr0 e interrupciones

30
GUÍA RÁPIDA TIMER 0 E INTERRUPCIONES INTERRUPCIONES PROF. LUIS ZURITA Microcontroladores I

Upload: luis-zurita

Post on 30-Jun-2015

1.759 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Guía rápida tmr0 e interrupciones

GUÍA RÁPIDATIMER 0 E

INTERRUPCIONESINTERRUPCIONES

PROF. LUIS ZURITA

Microcontroladores I

Page 2: Guía rápida tmr0 e interrupciones

REGISTROS ASOCIADOS ALTEMPORIZADOR TMR0

TMR0: Registro de 8 bits de lectura/escritura• TMR0: Registro de 8 bits de lectura/escritura• OPTION_REG: Configura al TMR0 para que trabaje

como temporizador ó contador y asigna el valor alprescaler

• INTCON: Da información mediante el bit “TOIF”cuando el TMR0 se ha desbordado.

• TRISA (PUERTO A): Permite el ingreso de pulsoscuando el TMR0 está configurado como contador porRA4/TOCKI

Prof. Luis ZuritaMicrocontroladores I

Page 3: Guía rápida tmr0 e interrupciones

REGISTRO TMR0

• Es el corazón del módulo Timer0. Puede ser leído oescrito en cualquier momento. El TMR0 seincrementará automáticamente por cada ciclo deinstrucción y contará desde 0 (00H) hasta 255 (FFH)(Contador de 8 bits).

• Ejemplo. Escribir 100 en el TMR0=• 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

Prof. Luis ZuritaMicrocontroladores I

Page 4: Guía rápida tmr0 e interrupciones

¿CÓMO CUENTA EL TMR0?

El TMR0 cuenta exclusivamente deforma ascendente, de uno en uno,nunca descendente.

00H

FFH00H

¿Quién incrementa al TMR0?Cada instrucción que se ejecuta en unprograma se encarga de

Si el TMR0 se carga con un valor,éste comenzará a contar desde elvalor cargado hasta que sedesborda (cuando pasa a 00H)

00H

FFH

Valor cargadoEn el TMR0

00H

(28 – N10)

Prof. Luis Zurita

Cada instrucción que se ejecuta en unprograma se encarga deincrementarlo.

Microcontroladores I

Page 5: Guía rápida tmr0 e interrupciones

¿QUÉ ES EL PRESCALER?

• Divide la frecuencia de reloj de entrada del Timer0, entrevalores predefinidos, como se ve en la tabla asociada al registroOPTION, 1:32, 1: 64, 1:256, etc., genera una nueva señal demenor frecuencia a la salida, que será la señal de reloj deentrada al registro TMR0.

• “Ralentiza” señales de entrada demasiado rápidas para nuestrospropósitos.

• Nota: Para evitar un RESET no deseado del sistema, es necesarioejecutar una secuencia de instrucciones específicas cuando secambia la asignación del prescaler del TMR0 al WDT. Estacambia la asignación del prescaler del TMR0 al WDT. Estasecuencia debe ser seguida, aún cuando el WDT esté inactivo.

Prof. Luis ZuritaMicrocontroladores I

Page 6: Guía rápida tmr0 e interrupciones

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 dadopor 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 resonadorque se esté utilizando. Los típicos son=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

Prof. Luis ZuritaMicrocontroladores I

Page 7: Guía rápida tmr0 e interrupciones

CÁLCULOS CON EL TMR0

Sea un valor a cargar en el TMR0 de 100, un prescalerseleccionado de 1:32 y un oscilador XT. Determine el tiempoen 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, sideseamos obtener una temporización de 10,24 ms, utilizandodeseamos obtener una temporización de 10,24 ms, utilizandoun preescaler de 128 y un cristal XT?

Solución:

(256 – N10) = = = 80

(256 – N10) = 80, despejando N10 = (256 – 80) = 176, el valor quedebemos cargar en el TMR0 es 176, para que éste cuente desde176 hasta 256.

Prof. Luis Zurita

calerValorpreesT

iónTemporizac

OSC 4 1282504

24,10

ns

ms

Microcontroladores I

Page 8: Guía rápida tmr0 e interrupciones

• Elegir el TMR0, para generar un retraso de 50 ms utilizandoun oscilador de 4 MHz.

Solución: Sea Fosc= 4 MHz, T = 0.25 μs.

(256 – N10) = =

N10 = 256 - (50000/Valorpreescaler), supongamos que elegimosPreescaler 32, entonces tendremos=

N10 = 256 - (50000/32) = 256 – 1562,5 = - 1306,5. Si da unnúmero negativo, no es válido, por lo que debemos subir el valordel preescaler hasta que la resta sea positiva.

calerValorpreesT

iónTemporizac

OSC 4 calerValorpreesns

ms

2504

50

del preescaler hasta que la resta sea positiva.

Para un preescaler de 64, tendremos =

N10 = 256 - (50000/64) = 256 – 781,25= - 525,25. Como esnegativo, subimos el preescaler nuevamente.

Para un preescaler de 128, tendremos =

N10 = 256 - (50000/128) = 256 – 390,625= - 134,625. Como esnegativo, subimos el preescaler nuevamente.

Para un preescaler de 64, tendremos =

N10 = 256 - (50000/256) = 256 – 195,3125= 60,69. Como espositivo tomaremos este preescaler.

Prof. Luis ZuritaMicrocontroladores I

Page 9: Guía rápida tmr0 e interrupciones

Entonces se debe cargar 60,69, aproximado a 61 en el TMR0para 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 puedevariar, siempre y cuando la resta [Valor Real TMR0 = (28 – N10) =(256 – N10) ] sea positiva, por lo que puede darse cuenta de queno hay un solo resultado para los ejercicios. Sin embargo, lo quesi debe cumplirse es que sea cualquiera que sean los valores quese tomen para los cálculos, estos deben de estar cercanos a lasi debe cumplirse es que sea cualquiera que sean los valores quese tomen para los cálculos, estos deben de estar cercanos a larespuesta que se espera del temporizador que esté diseñando,comprobando los resultados.

• Ejemplo. Diga ¿cuánto es la máxima temporización que se puedehallar con el TMR0? Asuma que se está trabajando con un XT.

Solución: Tomamos el máximo factor de escala de división todoslos 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.

Prof. Luis ZuritaMicrocontroladores I

Page 10: Guía rápida tmr0 e interrupciones

• ¿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 mayornúmero de bits. La solución está en extender el Timer0 conun registro (auxiliar) controlado por software.

– Dicho registro (auxiliar) contará el número de interrupcionespor desbordamiento que genera el Timer0, de forma de queéste pase por cero, cuando haya pasado el tiempo queestamos calculando.

Prof. Luis ZuritaMicrocontroladores I

USO DE REGISTRO AUXILIAR

Pasos:1. Escoger un valor para el prescaler.

Un posible criterio es calcular todas las frecuencias deprescaler que podemos obtener con cada divisor posible. Lasfrecuencias sin decimales son interesantes al poder encontrarmúltiplos de ellas a la salida del TMR0 con mayor facilidad. Engeneral, la elección del valor del prescaler es empírica: depende delproblema, la experiencia y sobre todo de la práctica.

Page 11: Guía rápida tmr0 e interrupciones

USO DE REGISTRO AUXILIAR

Pasos: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 entenderemosmejor lo que se desea plantear:

Ejemplo: Determine los valores del TMR0 y del Registro Auxiliarpara conseguir una temporización de 1 segundo. Utilice unpara conseguir una temporización de 1 segundo. Utilice unoscilador XT.Solución: XT= Frecuencia = 4 MHz ; Tosc= 250 ns

• Paso 1. Como no se nos ha impuesto que prescaler utilizar ni quetemporización, podemos aleatoria mente escogerlas, como en elejemplo 6. Evaluando cualquiera, cuya temporización del TMR0 sebasó en 5 ms, escojamos el prescaler 128 y sustituyamos losvalores en la ecuación principal:– Temporización= 4*250 ns*(256 - 217)*128 = 4.992 ms

Prof. Luis ZuritaMicrocontroladores I

Page 12: Guía rápida tmr0 e interrupciones

CONTINUACIÓN DEL EJEMPLO ANTERIOR

• Paso 2. ¿Qué valor debe de tener el registro auxiliar?¿cuantas veces necesitamos al tiempo calculado para lograr unsegundo?

Nuestro registro auxiliar debe ser de 200=

32.200992.4

1

ms

segundo

Recuerde de que éste registro auxiliar no debe superar 255.Si supera este valor, se debe adicionar un nuevo registroauxiliar

mssegundo 992.4*32.2001

Prof. Luis ZuritaMicrocontroladores I

Page 13: Guía rápida tmr0 e interrupciones

CONFIGURACIÓN DEL TMR0

• Para que opere como temporizador, el bit TOCS (delregistro OPTION_REG) debe ser cero (0), el bitPSA= 0 y deben ser cargados los bits PS2 a PS0,según sea el preescaler a utilizar para lograr nuestratemporización.

• Para que opere como contador, se usa una entrada dereloj externo en el TMR0 y se deben de cumplirreloj externo en el TMR0 y se deben de cumplirciertos requisitos para que el reloj externo pueda sersincronizado con el reloj interno (TOSC). Ademásexiste un retardo en el incremento real del TMR0,después de la sincronización. El bit TOCS= 1. Se debeseleccionar el tipo de flanco que producirá elincremento del TMR0 ( TOSE = 1 ó 0).

Prof. Luis ZuritaMicrocontroladores I

Page 14: Guía rápida tmr0 e interrupciones

REGISTRO OPTION_REG (Dirección 81H)

• bit 7, RPBU : Resistencia Pull-up, Puerto B, habilita el bit1: Desactivadas0: Activadas

• bit 6, INTEDG: Flanco activo para el control deinterrupciones1: Con flanco Ascendente0: Con flanco Descendente

• bit 5, TOCS: Fuente de Reloj para TMR0• bit 5, TOCS: Fuente de Reloj para TMR01: Pulsos introducidos a través de RA4/T0CK1 (Contador)0: Pulsos de reloj interno Fosc/4 (Temporizador)

• bit 4, TOSE: Tipo de flanco en TOCK11: Incremento de TMR0 cada flanco descendente0: Incremento de TMR0 cada flanco ascendente

• bit 3, PSA: Bit de asignación del prescaler divisor defrecuencia1: El divisor de frecuencia se asigna al WDT0: El divisor de frecuencia se asigna al TMR0

• bitS 2,1,0, PS2,PS1,PSO: Rango con el que actúa eldivisor de frecuencia o preescaler usado en los cálculos

Prof. Luis Zurita

PS2 PS1 PSO

Microcontroladores I

Page 15: Guía rápida tmr0 e interrupciones

EJEMPLOS DE CONFIGURACIÓN

• Configure al PIC16F84 para que el temporizador TMR0, trabajecon los pulsos provenientes de un reloj externo, y el mismocambie en el flanco de bajada de cada dos pulsos externos:

• Configure al PIC16F84 para que el TMR0, trabaje con el reloj internoy la frecuencia del mismo sea dividida por 32:y la frecuencia del mismo sea dividida por 32:

Prof. Luis Zurita

¿Y los demás bits? = No importa lo que se cargue, si no se vana trabajar con ellos

¿Cómo lo cargo al OPTION_REG?

En el primer caso:

movlw b’xx11x001’

movwf OPTION_REG

En el segundo caso:

movlw b’xx0x0100’

movwf OPTION_REG

Microcontroladores I

Page 16: Guía rápida tmr0 e interrupciones

DE LOS CÁLCULOS A LA PROGRAMACIÓN

• Normalmente, se va a trabajar con el TMR0, para programarlocon un tiempo en particular para que se desborde y produzca unainterrupción.

• Esto hará que se entre a una subrutina de interrupción que seestudiará en las siguientes diapositivas, lo que permitirá ejecutarun programa principal, y cada cierto tiempo (cálculos), va aejecutar una subrutina, regresando nuevamente al programaprincipal, desde donde se produjo la interrupción.

• Para esto=• Para esto=

1. Se deben hacer los cálculos.

2. Se debe configurar el registro OPTION_REG, con el TMR0como temporizador y asignar el valor del prescaler que se hautilizado en los cálculos.

3. Programar lo que se desea realizar durante la rutina deinterrupción por desborde del TMR0 y antes de salir de estarutina, cargar el valor del TMR0 para que vuelva a tener lamisma temporización.

Prof. Luis ZuritaMicrocontroladores I

Page 17: Guía rápida tmr0 e interrupciones

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

¿Y qué valor se carga en el TMR0?

¿Qué valor se carga en el Prescaler?

Prof. Luis ZuritaMicrocontroladores I

Page 18: Guía rápida tmr0 e interrupciones

INTERRUPCIONES

• “Las interrupciones son desviaciones del flujo de control del programaoriginadas asíncronamente, por diversos sucesos que no se hallan bajo lasupervisión de las instrucciones. Dichos sucesos pueden ser externos alsistema, como la generación de un flanco o nivel activo en una patilla delmicrocontrolador, o bien, internos, como el desbordamiento de uncontador. Su comportamiento es similar al de la instrucción “call” dellamado a subrutina. Se detiene la ejecución del programa en curso, sesalva 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 unainterrupción es una dirección reservada de la memoria de código, llamadavector de interrupción”. Parejo. Microcontroladores PIC. Pág. 117. 2daEdición.vector de interrupción”. Parejo. Microcontroladores PIC. Pág. 117. 2daEdición.

• En un PIC 16F8XX, este vector de interrupción está ubicado en laposición 04H, en donde comenzará la rutina de servicio de lainterrupción. Ejemplo:org 00H ; Vector de origen del programagoto INICIO ; salto a la rutina de programa principalorg 04H ; Vector de interrupcióngoto INTERR ; salto a la rutina de interrupción.

• La idea de colocar una instrucción de salto incondicional, es la detrasladar el flujo del programa a la zona de memoria de código quecontiene a la rutina de interrupción.

Prof. Luis ZuritaMicrocontroladores I

Page 19: Guía rápida tmr0 e interrupciones

DIAGRAMA DE FLUJO DURANTE UNAINTERRUPCIÓNPrograma normal

Instrucción 1

Instrucción 2

Instrucción 3

Rutina de Servicio de Interrupción

(RSI)

Instrucción 1

Instrucción 2

Prof. Luis Zurita

Instrucción 24

Instrucción 25

Instrucción N

Fin de programa

RETFIE

Nota: Una Rutina de Serviciode Interrupción puede serigual de extensa e incluso másque el mismo programaprincipal.

Microcontroladores I

Page 20: Guía rápida tmr0 e interrupciones

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 INTCONREGISTRO INTCON• Este registro se encuentra ubicado en la posición 0BH del banco

0 de los registros de funciones especiales (SFR). A continuaciónse describirán cada uno de sus bits:

Prof. Luis ZuritaMicrocontroladores I

Page 21: Guía rápida tmr0 e interrupciones

• GIE: (Global Interrupt Enable), Permiso Global deInterrupciones

1: Habilita todas las interrupciones, cuyos bits de permisoindividuales también las permitan

0: Deshabilita todas las interrupciones

• EEIE: (EEPROM Interrupt Enable), Permiso de Interrupción porfin de escritura en la EEPROM

1: Habilita la interrupción cuando termina la escritura de laEEPROM de datos

INTCON

EEPROM de datos

0: Deshabilita esta interrupción

• TOIE: (TMR0 Overflow Interrupt Enable), Permiso deinterrupció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ónpor activación del pin RB0/INT

1: Habilita la interrupción al activarse RB0/INT

0: Deshabilita esta interrupción

Prof. Luis ZuritaMicrocontroladores I

Page 22: Guía rápida tmr0 e interrupciones

INTCON

• RBIE: (RB Port Change Interrupt Enable), Permiso deinterrupció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 dedesborde 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• INTF: (RB0/INT Interrupt Flag), Señalizador de activacióndel 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 deestado 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

Prof. Luis ZuritaMicrocontroladores I

Page 23: Guía rápida tmr0 e interrupciones

• Habilite la interrupción por desborde del TMR0=

movlw b’10100000’

movwf INTCONmovwf INTCON

• Habilite la interrupción por cambio de nivel en RB0/INT

movlw b’10010000’

movwf INTCON

• Habilite las interrupciones por desborde del TMR0 ycambio de nivel en RB0/INT

movlw b’10110000’

movwf INTCON

Prof. Luis ZuritaMicrocontroladores I

Page 24: Guía rápida tmr0 e interrupciones

¿Cómo determinar la causa de unainterrupción?

• Si se han activado dos o más causas de interrupción, comodesborde del TMR0 y cambio de nivel en RB0/INT, cuandoalguna de éstas ocurren, ellas van a la misma rutina deinterrupción (RSI).

• Ahora ¿cómo saber cuál es la causa?, mediante el testeo delos señalizadores o flags, recordando que se pondrán anivel alto (1), cuando se haya activado la correspondiente.nivel alto (1), cuando se haya activado la correspondiente.

• Por lo tanto, con unas simples preguntas dentro de larutina de servicio de interrupción, se determinará lacausante:

Prof. Luis ZuritaMicrocontroladores I

Page 25: Guía rápida tmr0 e interrupciones

SALVANDO/RESTAURANDO EL ENTORNO

Salvar y restaurar el entorno, se refiere a mantener el valorexacto que tienen los registros de trabajo STATUS y W, ycualquier otro de importancia, incluyendo los puertos quecontrolan a los actuadores, que no vaya a ser modificado dentrode la subrutina de servicio de interrupción y luego se restauranal salir de esta.

Para salvar y restaurar el entorno cuando ocurre unainterrupció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– 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 depuertos deben ser declarados al inicio del programa, para nogenerar errores.

Prof. Luis ZuritaMicrocontroladores I

Page 26: Guía rápida tmr0 e interrupciones

SALVANDO/RESTAURANDO EL ENTORNO

; **** 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_TEMPmovf PORTB,0movwf CopiaPORTB ; Salvamos a PORTB

RUT_INT

; Asuma que desea salvar el PORTB, durante una interrupción=

RUT_INT;Aquí estará la rutina de servicio de interrupción;

POP movf CopiaPORTB,0 ; Restauramos el PORTB a su valor antes demovwf PORTB ; haber entrado a la rutina de interrupciónmovf STATUS_TEMP,0 ; Movemos w al registro STATUS,

; retornando elmovwf STATUS ; valor originalmovf 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

Page 27: Guía rápida tmr0 e interrupciones

Est

ructu

ratípica

Microcontroladores I Prof. Luis Zurita

Est

ructu

ratípica

Page 28: Guía rápida tmr0 e interrupciones

Est

ructu

ratípica

Prof. Luis ZuritaMicrocontroladores I

Est

ructu

ratípica

Page 29: Guía rápida tmr0 e interrupciones

Ejemplo. Realicemos un programacompleto que contenga variasinterrupciones. Si la causa ha sido laactivación del pin RB0, se debemostrar un dos en binario en elpuerto A, si ha sido un cambio denivel en RB4:RB7, se debe mostrarel uno en binario en el puerto A y sise ha desbordado el TMR0, se debemostrar el cuatro en binario en elpuerto A.

¿RB0/INT?¿INTF=1?

¿RB4:RB7?¿RBIF=1?puerto A.

Programa Principal RSI

¿TMR0?¿TOIF=1?

Prof. Luis ZuritaMicrocontroladores I

Page 30: Guía rápida tmr0 e interrupciones

¿CUANDO UTILIZAR UNAINTERRUPCIÓN?

Una interrupción es muy importante cuando deseamosrealizar una tarea que no dependa de una exploración constantedel programa sobre la misma.

También cuando deseamos que nuestro programa respondade forma inmediata y automática a determinados eventos.

Ejemplo del uso de Interrupción:

• En los sistemas de control, cuando se necesita un pulsador deparada de emergencia (PARE RB0/INT).parada de emergencia (PARE RB0/INT).

• Cuando deseamos que el programa haga una tarea cada ciertotiempo, independientemente de lo que se encuentre haciendo enel programa principal. (DESBORDE DEL TMR0).

• En el manejo de teclados, se recomienda su uso, ya que sepuede meter al microcontrolador en un estado de reposo,ahorrando energía y esperando a que se pulse una tecla parainiciar una rutina de servicio (CLAVE).

Prof. Luis ZuritaMicrocontroladores I