CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo...

28
CAPÍTULO 9 – INTERRUPCIONES 9.1 CONTENIDO. Para responder con rapidez a eventos externos al CPU, el PIC18F452 presenta el esquema de interrupciones a ser tratado en este capítulo. 9.2 ESTRUCTURA DE TIEMPOS PARA INTERRUPCIONES DE BAJA PRIORIDAD. Una fuente de interrupciones se puede caracterizar por los siguientes dos parámetros: - TPi, el intervalo de tiempo entre interrupciones de la fuente #i. Si este varía de una interrupción a otra, entonces TPi será el intervalo más corto ( peor caso ). - Ti, el tiempo durante el cual el CPU abandona al programa principal para ejecutar al servidor de la interrupción. Si este tiempo es variable, entonces Ti estará representado por el tiempo de mayor valor. ( peor caso ). Ilustración 9-1. Parámetros de tiempo para una interrupción. Para una aplicación con una sola fuente de interrupción, se deberá cumplir con T1 < TP1 como lo muestra la Ilustración 9-1. Lo anterior significa que el CPU completará la ejecución del servidor de interrupción antes que se le exija volver a ejecutar dicho servidor. Las necesidades del programa principal se verán satisfechas si el tiempo restante de TP1 – T1, es

Transcript of CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo...

Page 1: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

CAPÍTULO 9 – INTERRUPCIONES

9.1 CONTENIDO.Para responder con rapidez a eventos externos al CPU, el PIC18F452 presenta el esquema de interrupciones a ser tratado en este capítulo.

9.2 ESTRUCTURA DE TIEMPOS PARA INTERRUPCIONES DE BAJA PRIORIDAD.Una fuente de interrupciones se puede caracterizar por los siguientes dos parámetros: - TPi, el intervalo de tiempo entre interrupciones de la fuente #i. Si este varía de una interrupción a otra, entonces TPi será el intervalo más corto ( peor caso ).

- Ti, el tiempo durante el cual el CPU abandona al programa principal para ejecutar al servidor de la interrupción. Si este tiempo es variable, entonces Ti estará representado por el tiempo de mayor valor. ( peor caso ).

Ilustración 9-1. Parámetros de tiempo para una interrupción.

Para una aplicación con una sola fuente de interrupción, se deberá cumplir con

T1 < TP1

como lo muestra la Ilustración 9-1. Lo anterior significa que el CPU completará la ejecución del servidor de interrupción antes que se le exija volver a ejecutar dicho servidor. Las necesidades del programa principal se verán satisfechas si el tiempo restante de TP1 – T1, es suficiente para ejecutar las subrutinas del programa principal durante cada lazo de 10 milisegundos. En esta sección solo serán tratadas las interrupciones de baja prioridad. Si existen dos fuentes de interrupciones, el diagrama 9-2 muestra los tiempos en el peor de los casos. El primer diagrama representa a la fuente de interrupción #1 ( IS#1 ). Justo antes de que requiera el servicio del CPU, IS#2 requiere servicio y lo obtiene. Debido a que el CPU, al servir a IS#2, inhabilita automáticamente a las demás interrupciones temporalmente, IS#1 es puesto en espera hasta que finalice la atención a IS#2. Este tiempo está representado como T2, la duración del servidor. Por la tanto el retardo en el peor de los casos para IS#1 es T2. Se puede observar que aun en el peor de los casos, IS#1 es servido mucho antes de que requiera servicio nuevamente. En general, se debe cumplir la condición

T2 + T1 < TP1

La Ilustración 9-2b muestra el diagrama de tiempos en el peor de los casos para IS#2. En este caso, IS#2 requiere servicio justo después de que IS#1 ha requerido y obtenido

Page 2: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

servicio. Nuevamente, se requiere que IS#2 obtenga servicio antes de que lo requiera nuevamente o

T1 + T2 < TP2

Ilustración 9-2. Diagramas de tiempo para dos fuentes de interrupción en el peor de los casos.

Para tres o más fuentes de interrupción, los requerimientos que se deben cumplir para cada fuente de interrupción depende del orden en que son verificadas en la rutina de escrutinio mostrada en la Ilustración 6-2 y repetida en la Ilustración 9-3. Reasignando el orden de verificación, puede en algunos casos resolver problemas de tiempo en la requisición de servicios de interrupción. Dos factores inciden en el tiempo para el peor de los casos – 1- En el peor de los casos, una fuente de interrupción requiere de servicio justo después de que el servidor de mayor duración que lo sigue en la cola, ha obtenido servicio.2- Además, todos los servidores delante de esta fuente, serán servidos primero.La primera condición ocurre debido a que al iniciarse el servicio de una interrupción, todas las demás interrupciones son inhabilitadas. De tal manera, el servidor de interrupción es ejecutado hasta el final.La segunda condición es el resultado de la construcción

CONTINUE_

que es ejecutada al finalizar cada servidor de interrupciones. Esta construcción regresa la ejecución del programa hasta el inicio de la rutina de escrutinio, y en el peor de los casos, todas las fuentes de interrupción por delante de la actual, están esperando por servicio.

Page 3: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

Ilustración 9-3. Rutina de escrutinio para servicio de interrupciones.

Estas consideraciones nos llevan a las siguientes restricciones de tiempo para cuatro fuentes de interrupción

( máximo de T2, T3, T4 ) + T1 < TP1( máximo de T3, T4 ) + T1 + T2 < TP2

T4 + T1 + T2 + T3 < TP3 T1 + T2 + T3 + T4 < TP4

Las rutinas servidoras de interrupción se muestran en la Ilustración 9-4. Cuando ocurre una interrupción, se lleva a cabo la siguiente secuencia de actividades automáticamente:

- El CPU finaliza la ejecución de la instrucción en curso.- El bit ( GIEL ) que habilita globalmente las interrupciones de baja prioridad es aclarado a cero, con lo cual quedan inhabilitadas todas las interrupciones de baja prioridad.- Los contenidos del contador del programa ( con la dirección de la siguiente instrucción a ser ejecutada en el programa principal ) son guardados en la pila ( stack ).- Se carga en el contador del programa el vector 0x0018 correspondiente a las interrupciones de bajo nivel.

Para evitar resultados incorrectos en la rutina principal, es importante que el servidor de interrupciones guarde temporalmente y luego restablezca el contenido de registros importantes como los son WREG y STATUS.

Page 4: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

+

Ilustración 9-4. Mecanismo de interrupciones de baja prioridad.

Page 5: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

Las presunciones mostradas en la Ilustración 9-4c se sugieren para evitar la cantidad de otros registros del CPU que deben ser guardados y luego restablecidos.

9.3 ESTRUCTURA PARA INTERRUPCIONES DE BAJA PRIORIDAD.Para utilizar la estructura de interrupciones de baja prioridad, se comienza por establecer el bit IPEN mostrado en la Ilustración 9-5 a con

bsf RCON, IPEN ; habilita los niveles de prioridad

Ilustración 9-5. Estructura para interrupciones de baja prioridad.

La alternativa, IPEN = 0, revierte a la estructura existente en los chips PIC de primera generación perdiendo las ventajas que presenta esta nueva estructura. El bit GIEH ( Habilitación global para interrupciones de alta prioridad ) habilita a todas las interrupciones tanto de alta prioridad como de baja prioridad. Generalmente es establecido por la última instrucción antes de return en la subrutina Initial, después de que cada fuente de interrupciones utilizada en la aplicación, ha sido inicializada.El bit GIEL ( Habilitación global para interrupciones de baja prioridad ) habilita todas las interrupciones de baja prioridad. También es establecido al final de la subrutina Initial. Se aclara automáticamente al ocurrir una subrutina de bajo nivel, bloqueando a otras interrupciones. El bit GIEL es reestablecido al ejecutar la instrucción

retfie ; regreso de interrupción

al finalizar el servicio de una interrupción.

Page 6: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

El bit GIEL también puede ser utilizado en el código del programa principal para inhabilitar las interrupciones durante la ejecución de una región crítica. Cada fuente de interrupción tiene asociado un bit de prioridad para asignarle baja o alta prioridad. El estado por defecto de estos bits, al iniciar el sistema, es de alta prioridad.De tal manera, para asignarle baja prioridad a las interrupciones, se puede utilizar la siguiente instrucción en la rutina Initial

bcf INTCON2, TMR0IP

que asignará a la interrupción de sobreflujo del Timer0, prioridad baja.La Ilustración 9-6 muestra la ubicación de los bits de prioridad así como sus fuentes de interrupción.

Ilustración 9-6. Registros y nombre de los bits para las fuentes de interrupciones.

Ejemplo 9-1 La subrutina LoopTime discutida en la sección 5.4, permitía utilizar el estado de la bandera TMR0IF para establecer tiempos precisos para el lazo de 10 milisegundos con un reloj interno de 2,5 Mhz así como el uso de Timer0 con la escala de 25.000. Algo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala de 100.000. El contador requiere el uso de la pre-escala de Timer0 y la escritura al Timer0 re-inicializa la pre-escala. Para la mayoría de las aplicaciones, el error resultante es insignificante. Con la interrupción por sobreflujo del Timer0, este error puede ser eliminado. Desarrolle la rutina de interrupción y la subrutina LoopTime modificada.

Solución

Page 7: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

Un servidor de interrupciones TMR0handler, puede ser implementado de tal manera que la bandera TMR0IF se establezca precisamente cada 50.000 ciclos o 5 milisegundos. Cada vez que esto ocurra, es decrementada la variable TMR0CNT. La subrutina LoopTime espera por TMR0CNT a ser igual a cero para señalar que han transcurrido 10 milisegundos. Luego se re-inicializa TMR0CNT a 2. La subrutina resultante se muestra en la Ilustración 9-7 a. La inicialización para las interrupciones de Timer0 se muestran en la Ilustración 9-7b. El servidor de interrupciones TMR0handler se muestra en la Ilustración 9-7c. La rutina servidora de interrupción LoPriISR se muestra en la Ilustración 9-7d, asumiendo que no existen otras banderas de interrupción por ser verificadas.

Ilustración 9-7. Ejemplo 9-1.

Page 8: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

Ejemplo 9-2. Determine los valores “T1” y “TP1” para las interrupciones del Timer0 del último ejemplo. También determine el porcentaje de tiempo que el CPU se ocupa en el manejo de las interrupciones.

SoluciónEl intervalo entre interrupciones TP1, es de 50.000 ciclos o 5.000 microsegundos, considerando el reloj interno de 10 MHz del chip. Cuando ocurre un sobreflujo del Timer0, el CPU toma dos ciclos después de la ejecución del código principal antes de ejecutar el vector de interrupción

goto LoPriISR En consecuencia,

T1 = 2 + 12 + 18 = 32 ciclos.

El porcentaje de tiempo del CPU manejando las interrupciones es

( 32 / 50000 ) x 100 = 0,064 %

Ejemplo 9-3 Si se añade otra interrupción de baja prioridad a la interrupción del Timer0 tratado en el último problema, y si las interrupciones del Timer0 fuesen colocadas en segundo lugar en la rutina de escrutinio, ¿Cuál será el tiempo de retardo para la nueva interrupción debido a la interrupción del Timer0?

SoluciónEn el peor de los casos, ha ocurrido una interrupción del Timer0, STATUS y WREG han sido respaldados, y la rutina de supervisión, encuentra que la nueva interrupción no requiere de servicio. En este preciso momento ( peor de los casos ), la nueva fuente de interrupción establece su bandera, solicitando servicio. Mientras tanto, en LoPriISR, donde las interrupciones son inhabilitadas, el CPU ejecutará,

- El salto asociado con la construcción IF_ para la nueva interrupción ( 2 ciclos ).- La verificación de la bandera TMR0IF ( 2 ciclos ).- La llamada al TMR0handler ( 2 ciclos ).- La ejecución del manejador ( 18 ciclos ).- El salto para la construcción CONTINUE_ después del regreso de la rutina de escrutinio ( 2 ciclos ).- La verificación de la bandera de interrupción ( 2 ciclos ).- La llamada al nuevo servidor de interrupción ( 2 ciclos ).

Después de este retardo de 30 ciclos, o 3 microsegundo, el CPU procederá a ejecutar la primera instrucción del nuevo servidor de interrupción.

9.4 ESTRUCTURA DE INTERRUPCIONES DE ALTA PRIORIDAD.Una fuente de interrupción a la cual se le asigna su bit “IP” como de alta prioridad, puede suspender la ejecución del programa principal e inhabilitar todas las interrupciones de bajo nivel. Además, puede suspender la ejecución de la rutina de baja prioridad LoPriISR. Excepto por una posible breve inhabilitación para proteger una

Page 9: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

región crítica, una sola fuente de interrupción establecida como de alta prioridad, no experimenta ninguna demora para ser servida. Este beneficio se desvanece al existir más de una fuente de interrupciones de alta prioridad.Los diseñadores del PIC18F452, añadieron una ventaja adicional a las interrupciones de alta prioridad al crear registros sombra, de tal manera, los contenidos de STATUS, WREG y BSR son automáticamente copiados a los registros sombra. Una vez que la interrupción ha sido servida, la ejecución de la instrucción

retfie FAST

1- Restablece no solo el contador del programa sino también STATUS, WREG y BSR.2- Restablece el bit GIEH, volviendo a habilitar a las interrupciones de alta prioridad y de baja prioridad como lo muestra la Ilustración 9-9.

Ilustración 9-8. Uso de registros sombra con interrupciones de alta prioridad.

Page 10: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

Ilustración 9-9. Estructura de interrupciones para alta/baja prioridad.

Ejemplo 9-4. En la sección 13-9, se mostrará que la frecuencia de una onda cuadrada puede ser medida con una precisión de 50 partes por millón del cristal utilizado por el microcontrolador. La entrada “CCP2” será utilizada por el PIC18F452 para generar la interrupción de alta prioridad para cada 16th flanco de subida de la onda en la entrada. Estas interrupciones serán contadas en un intervalo de aproximadamente 1 segundo. Conociendo el número exacto de ciclos internos ( por ejemplo 2500540 ) sobre el cual un número entero de periodos de la onda han ocurrido ( por ejemplo 16 x 123456 = 1975296 ) da la información necesaria para calcular la frecuencia de entrada. Si el reloj interno del microcontrolador tiene un período de 0,4 microsegundos, la frecuencia de entrada está dada por

Frecuencia = 1975296 / ( 2500540 x 0,4 ) = 1,97487 MHz

El tiempo requerido para contar cada 16th flanco de la señal, determina la frecuencia máxima que puede ser medida. Muestre el servidor de interrupción de alta prioridad requerido para incrementar un contador de tres bytes

FCOUNTU : FCOUNTH : FCOUNTL

Page 11: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

SoluciónLa rutina servidora de interrupción de alto nivel se muestra en la Ilustración 9-10. Con dos ciclos para salir del programa principal

goto HiPriISR

dos ciclos adicionales para ejecutar la instrucción goto, y siete ciclos para HiPriISR, el CPU utiliza once ciclos, o

11 x 0, 4 = 4, 4 microsegundos

La frecuencia máxima que puede ser medida es

16 / 4,4 = 3, 6 MHz

Ilustración 9-10. Ejemplo 9-4.

9.5 REGIÓNES CRÍTICAS

Una región crítica es una secuencia de instrucciones que no debe ser interrumpida para evitar resultados incorrectos en la ejecución de las mismas. Un ejemplo de ello es la subrutina LoopTime, Timer0 fue leído, manipulado y reescrito. Para que la operación no falle, son requeridos exactamente 12 ciclos entre la lectura y la escritura. Una interrupción en este momento, modificaría esta cantidad de ciclos y extendería el tiempo del lazo. Un recurso compartido por el programa principal y un servidor de interrupciones es un punto potencial para que ocurran fallas en el sistema.

Ejemplo 9-5. Considere el arreglo de tres Leds en PORTA de la tarjeta QwikFlash, como lo muestra la Ilustración 4-2 a. Una rutina de interrupción debe establecer RA3 cuando ocurra una condición poco usual. Cuando enciende el LED, el usuario conocerá que esta condición ocurrió. Suponga que RA2 y RA1 son utilizados en el programa principal para mostrar el estado de RPG ( PORTD RD1 y RD0 ). Muestre el código para presentar el estado de RPG con los Leds, describa una posible falla, y provea la solución.

SoluciónUna posible solución se muestra en la Ilustración 9-11 a. PORTA es copiado a WREG, los dos bits que contienen el valor de RPG son aclarados a cero y el resultado guardado en TEMP. Seguidamente, PROD es copiado hacia WREG, desplazando los bits 1 y 0 de PORTD a los bits 2 y 1 de WREG. Los bits restantes de WREG son llevados a cero. El

Page 12: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

resultado es aplicado con la función lógica OR a la copia manipulada de PORTA ubicada en TEMP, luego el resultado es regresado a PORTA.Observe que si ocurre una interrupción que establezca el bit 3 de PORTA después que ha sido leído PORTA y antes que sea regresado el valor a PORTA, entonces el bit 3 de PORTA será aclarado a su estado original por la escritura de vuelta a PORTA.La posibilidad de que la interrupción ocurra en el preciso momento que esta secuencia de instrucciones esta siendo ejecutada en el programa principal, es muy remota. Como consecuencia, la falla potencial es difícil de detectar. Existe soluciones para evitar este tipo de problemas. La Ilustración 9-11b trata al código en el programa principal como una región crítica y pospone por algunos microsegundos la ejecución de la interrupción. Una solución mejor es el acceso a PORTA con unicamente instrucciones de lectura-modificar-escritura. En la ilustración 9-11c,

andwf PORTA, f

lee a PORTA, lo modifica y escribe de vuelta en el mismo. Todo lo anterior con una sola instrucción. Debido a que una interrupción no puede impedir la completa ejecución de una instrucción, la secuencia lectura-modificación-escritura no está comprometida.Una tercera solución se muestra en la Ilustración 9-11d. En este caso, solamente son utilizadas las instrucciones leer-modificar-escribir

bsfy

bcf

lo cual impide la posibilidad de fallas.La cuarta solución hace que la rutina servidora de interrupción, establezca una bandera en una variable ( en lugar de RA3 directamente ). En cada vuelta del programa principal, el CPU verifica el estado de este bit. Si está establecido, el CPU establece RA3.

Page 13: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

Ilustración 9-11. Ejemplo 9-5.

9.6 INTERRUPCIONES EXTERNAS.

El PIC18F452 dispone de tres interrupciones externas:

INT0 INT1 INT2

Estas interrupciones están compartidas con los bits 0, 1 y 2 de PORTB. Para poder utilizar cualquiera de estas interrupciones, es necesario establecer su correspondiente bit de control de acuerdo a la información en la Ilustración 9-12.

Page 14: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

Ejemplo 9-6. Establezca INT1 como una entrada sensible a los flancos descendientes y con baja prioridad.

SoluciónSerá suficiente la ejecución del siguiente código:

bsf TRISB, 1 ; entradabcf INTCON2, INTEDG! ; flanco descendientebcf INTCON3, INT1IP ; baja prioridadbcf INTCON3, INT1IF ; aclara la banderabsf INTCON3, INT1IE ; habilita fuente de interrupciónbsf INTCON, GIEL ; habilita interrupciones de baja prioridadbsf INTCON, GIEH ; habilita todas las interrupciones

Cuando un flanco descendiente aparece en la entrada INT1, el CPU será interrumpido y dará paso al servidor de interrupción de baja prioridad definido por el vector de interrupción en 0x0018 como lo describe la Ilustración 9-4. Dentro de la subrutina INT1handler, la bandera de interrupción puede ser aclarada con la instrucción

bcf INTCON3, INT1IF

además de la ejecución del código correspondiente al servidor de la interrupción.

Ejemplo 9-7. Utilice el pin INT1 para generar una interrupción de baja prioridad tanto con un flanco descendente como un flanco ascendente en su entrada.

Solución Dentro del manejador INT1, incluya

btg INTCON2, INTEDG1 ; cambia la transición

Page 15: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

Ilustración 9-12. Interrupciones externas.

9.7 INTERRUPCIONES POR CAMBIOS EN PORTB ( PINES RB7:RB4 ).

Una transición de nivel alto a nivel bajo o una transición de nivel bajo o nivel alto en cualquiera de los cuatro pines superiores de entrada en PORTB, siempre y cuando se haya inicializado como entrada, puede ser utilizada para generar una interrupción.La transición establecerá el bit RBIF ( bandera de interrupción en PORTB ) en el registro INTCON. Si las interrupciones han sido habilitadas correctamente ( con RBIE, RBIP, GIEL y GIEH ), el CPU será interrumpido. Un servidor de interrupciones deberá atender la interrupción. La bandera RBIF es aclarada en dos pasos:

1- Lectura de PORTB ( o escritura ) para copiar los cuatro bits superiores y remover la situación de incongruencia.

2- Ejecutar bcf INTCON, RBIF

Page 16: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

Observe que una vez establecido RBIF, el primer paso puede ser realizado por una rutina no relacionada que requiera acceso a PORTB, por ejemplo

bsf PORTB, 2

llevará a cabo el primer paso necesario para aclarar RBIF, sin embargo, hasta que el segundo paso no se lleve a cabo,

bcf INTCON, RBIF

la bandera se mantendrá establecida.Puede ocurrir un problema si uno de los cuatro bits superiores de PORTB se encuentra cambiando de estado mientras una rutina extraña al proceso, accede a PORTB.

.

PROBLEMAS9-1 Secuencia de escrutinio. Una aplicación requiere tres fuentes de interrupción con los siguientes tiempos:

TA = 10 µs TPA = 2500 µsTB = 10 µs TPB = 250 µsTC = 10 µs TPC = 25 µs

Por simplicidad, asuma que estos tiempos son los únicos tiempos consumidos en las rutinas servidoras de interrupción ( otras pruebas y saltos en la rutina de escrutinio no son considerados ).

( a ) Muestre el diagrama del peor-tiempo para IS#C. Si las interrupciones son asignadas a la rutina de escrutinio en el orden A, B, C. ¿Será servida adecuadamente IS#C bajo estas circunstancias?.( b ) Repita la parte – a- con el orden C, B, A en la rutina de escrutinio.

9-2 Limitantes en el tiempo para la peor respuesta. Considere las limitantes de tiempo para las fuentes de interrupción ( 9 – 1 ) de la sección 9-2.

( a ) ¿Por qué la segunda limitante, impuesta por IS#2, depende del máximo de T3 y T4?.( b ) ¿Por qué la limitante impuesta por IS#3 es igual a la impuesta por IS#4 si TP3 = TP4? De hecho, ¿Por qué su posición superior en la rutina de escrutinio no le ayuda a IS#3?

9-3 LoPriISR. Durante la discusión sobre la Ilustración 9-4, se mencionó que el orden de restablecimiento de WREG y STATUS al final del servicio de la interrupción, es importante. Indique si es importante el orden en que son colocados WREG y STATUS al principio de la rutina para el servicio de la interrupción.

Page 17: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

9-4 Asunciones sobre LoPriISR. Considere las asunciones sobre la Ilustración 9-4c. Si varias rutinas de interrupción requieren el uso del direccionamiento indirecto, entonces FSR2 ( consistente en dos bytes, FSR2H y FSR2L ) debe ser compartido entre ellas.

( a ) Muestre el código utilizado por IS#1 al principio de su manejador para cargar su propio puntero desde FSR21H : FSR21L hacia FSR2.( b ) Muestre el código utilizado por IS#1 al principio de su manejador para guardar los contenidos de FSR2 de vuelta a FSR21H : FSR21L.( c ) Muestre la cantidad de ciclos que el manejo de estos punteros, son añadidos al manejador de IS#1.

9-5 Subrutina LoopTime para operación a 10 MHz. La subrutina LoopTime mostrada en la Ilustración 9-7 a hace que TMR0CNT cuente …, 1, 0 → 2, 1, 0 → 2, 1, 0 → 2, …en una secuencia de dos estados.

( a ) Si el resto del código toma solo 2 milisegundos para ser ejecutado durante un paso a lo largo del lazo principal, ¿Cuál será el estado de TMR0CNT cuando se inicia la ejecución de la rutina LoopTime?( b ) Responda la parte ( a ) si el resto del código de la rutina principal, toma 7 milisegundos para ser ejecutado.( c ) Responda la parte ( a ) si, en raras ocasiones, le resto del código toma 12 milisegundos para ser ejecutado.( d ) Modifique la rutina LoopTime para evaluar el bit más significativos ( MSb ) de TMR0CNT. Cuando este bit se establece en uno, cuando TMR0CNT es decrementado de 0x00 a 0xff, incremente TMR0CNT dos veces y luego regrese de la subrutina.( e ) Una vez realizado este último cambio en LoopTime, responda nuevamente las preguntas ( a ), ( b ) y ( c ).

9-6 Peor retardo. El ejemplo 9-3 investigaba el peor retardo experimentado por una segunda interrupción de baja-prioridad debido a interrupciones del Timer0 en la Ilustración 9-7. Esto ignoraba el efecto de una rutina de alta-prioridad. Si, en efecto, fuese utilizada la interrupción de alta-prioridad de la Ilustración 9-10 en la aplicación, entonces ¿Cuál sería el peor retardo experimentado por la segunda interrupción de baja-prioridad? Dibuje un diagrama del peor retardo.

9-7 Mínimo retardo. El texto al principio de la sección 9-4, implicaba que se puede obtener cero retardo para una fuente de interrupción si el código de la aplicación nunca requería inhabilitar interrupciones de alta-prioridad para proteger regiones críticas de código y si la interrupción de “cero retardo” fuese una interrupción de alta-prioridad. En verdad, el código HiPriISR mostrado en la Ilustración 9-10, muestra una demora diferente a cero, desde el momento que la bandera de interrupción es establecida en uno hasta que se ejecuta la primera instrucción en HiPriISR. Tres ciclos son automáticamente insertados por el CPU entre el establecimiento de la bandera al final de un ciclo y la ejecución de la instrucción de un byte en el vector 0x0008, “goto”. Por lo tanto, la primera instrucción en HiPriISR es ejecutada en el cuarto o quinto ciclo después de que la bandera es establecida.

( a ) ¿Cuál sería el retardo si el

goto HiPriISR

Page 18: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

en la Ilustración 9-10 es reemplazado por la misma rutina para servicio de interrupción HiPriISR?( b ) En general, cuantas instrucciones puede contener HiPriISR antes de que interfiera con el vector correspondiente a las interrupciones de baja-prioridad?

9-8 Registros sombra. El mecanismo de registros sombra mostrado en la Ilustración 9-8, puede ser utilizado por una interrupción de alta-prioridad simplemente finalizando HiPriISR con la instrucción

retfie FAST

Asumiendo que LoPriISR finaliza ( como debería ser ) con

retfie¿Cumple alguna función el funcionamiento del registro sombra como lo muestra la Ilustración 9-8 a tanto para las interrupciones de baja-prioridad como las de alta-prioridad?

9-9 Medición del retardo en HiPriISR. En la tarjeta QwikFlash, coloque un puente entre el bit 1 ( RB1 ) del puerto PORTB y la entrada de interrupción de alta-prioridad RB0/INT0.

( a ) Escriba una rutina para servicio de interrupción de alta-prioridad comenzando directamente en la dirección 0x0008 con la instrucción

bcf PORTB, RB1

esto aclara la bandera INT0IF y regresa de la interrupción.( b ) Escriba un programa principal que inicialice las interrupciones de alta-prioridad para flancos de subida en la entrada INT0. Una instrucción

bsf INTCON2, INTEDG0

especificará que las interrupciones INT0 deberán ocurrir con flancos de subida. Después que se complete la inicialización, el lazo en el programa principal consistirá en

bsf PORTB, RB1

seguido por un docena de instrucciones nop. Esto asegurará que una instrucción de una sola palabra se esté ejecutando cuando el CPU responda a una interrupción en INT0 causada por el flanco ascendente en RB1. Luego salte de vuelta a

bsf PORTB, RB1

para repetir indefinidamente el lazo.( c ) Ejecute el programa y con un osciloscopio visualice el ancho de pulso en RB1. Si se define como cero retardo al ancho de pulso que se genera al ejecutar las siguientes instrucciones,

Page 19: CAPÍTULO 9 – INTERRUPCIONES · Web viewAlgo de precisión se pierde al tratar de lograr el lazo de 10 milisegundos con un reloj interno de 10 MHz y el uso de Timer0 con una escala

bsf PORTB, RB1bcf PORTB, RB1

Entonces, ¿Cuál es el retardo medido en al ancho del pulso RB1 debido a la interacción entre el programa principal y las interrupciones?

9-10) Regiones críticas. Asuma que se ha definido una variable de un byte como FLAG. Bits específicos de FLAG son utilizados para pasar información desde cualquiera de varios servidores de interrupción hacia el programa principal para indicar que ha ocurrido un evento de interrupción y que el programa principal debe tomar las correspondientes acciones, y luego aclarar el bit específico en FLAG. Por lo tanto, FLAG es una variable a la cual acceden múltiples servidores de interrupción así como el programa principal. ¿Por qué los accesos ha esta variable compartida desde el programa principal no representa una región crítica?