Contenido>Indice>Intro Tutor

PROCESO DE INTERRUPCIÓN



Como se ha indicado en capítulo 8 el ciclo máquina del µC 8051 está compuesta por 12 pulsos de reloj. Dos ciclos completos de reloj forman un estado, habiendo un total de 6 por cada ciclo máquina, y cada estado esta compuesto por dos fases (P1 y P2).

proceso_interrupcion.GIF (3202 bytes)

Los flags de interrupción son muestreados por el sistema de interrupciones en la fase 2 del estado 5 (S5P2) de cada ciclo máquina y se procede con su procesamiento a no ser que exista una situación de bloqueo.

Si no existe ninguna situación de bloqueo:

  1. En el primer ciclo máquina el sistema de interrupciones detecta los flags activados.

  2. En el segundo ciclo máquina se realiza el escrutinio de las interrupciones, analizando si están habilitadas y si es así, cuál es su nivel de prioridad, al mismo tiempo que  puede ejecutarse un instrucción de 1 ciclo máquina o terminar la que estaba ejecutando

  3. Durante los ciclos máquina 3 y 4, el sistema de interrupciones genera un LCALL (llamada) al vector de la interrupción que seguidamente se va a ejecutar.

Por lo tanto, el tiempo mínimo de respuesta de una interrupción, sin que haya ninguna situación de bloqueo, que tiene el µC desde que solicita ésta hasta que comienza su ejecución, es algo mayor que la duración de 3 ciclos máquina.

Por otro lado, estas son la situaciones de bloqueo con las que se puede encontrar el sistema de interrupciones:

Se está ejecutando una instrucción en el ciclo máquina 3, y hasta que no finalice no se puede generar el LCALL (llamada) por hardware al vector de interrupción

Se está atendiendo otra interrupción con nivel de prioridad igual o mayor, entonces al menos una instrucción más del programa principal tendrá que ser ejecutada antes de que la interrupción sea vectorizada (el PC se carga con el vector correspondiente)

Se está ejecutando la instrucción RET I o alguna de acceso a IE o a IP, entonces al menos una instrucción más del programa principal tendrá que ser ejecutada antes que la interrupción sea vectorizada.

En caso de bloqueo y dado que el muestreo de los indicadores de interrupción se repite en cada ciclo máquina, la nueva muestra reemplaza a la antigua y, si la petición de interrupción todavía está presente, será tenida en cuenta en el siguiente ciclo máquina. En caso de que la petición de interrupción provenga de una fuente interna (Puerto serie, Timer, ..), el indicador aún estará activo, bien porque debe estar desactivado por programa, o bien porque se vuelve a poner a cero en el momento del salto a la subrutina de servicio de la interrupción. Por tanto, la petición de interrupción se tendrá en cuenta de nuevo inmediatamente después del bloqueo.

Por el contrario, en caso de una interrupción proveniente de una fuente externa programada para interrumpir por nivel, es posible que la petición de interrupción nunca sea atendida. Al bloquearse la petición es preciso que el cambio de estado dure hasta el próximo muestreo, un ciclo de máquina más tarde, para que un nuevo análisis conduzca a la ejecución de la petición.

Interrupciones externas

Utilizando dos líneas del puerto P3 cuyas funciones secundarias son, respectivamente INT0' (1) e INT1' se puede definir que ocurra una interrupción externa. Las interrupciones externas INT0' e INT1' se pueden programar por nivel (cambio de estado lógico) o por flanco (cambio de estado de 1 a 0). El control se realiza con el registro TCON (cuatro bits de menor peso LSB).

TCON

     

LSB

IE1

IT1

IE0

IT0

Si IT0 e IT1 están a 1, la petición de interrupción en INT0' e INT1' respectivamente se hace por flanco de bajada, mientras que si están a 0 se hace por nivel bajo.

Los bits IE0 e IE1 se ponen a 1 cuando ha habido una petición de interrupción INT0' o INT1' respectivamente. Estos bits también pueden servir para provocar cualquiera de las dos interrupciones por software. Para hacer esto, primero hay que habilitar la interrupción en el registro IE y luego poner el bit IT0 o IT1 a 1 para habilitar la interrupción por flanco de bajada, seguidamente activar el bit IE0 o el IE1 para hacer la petición de INT0' o INT1' respectivamente. Esto provocará la interrupción exactamente igual que si se hubiera producido por hardware.

Cuando el programa salta a la subrutina de interrupción automáticamente se borra el bit de petición de interrupción correspondiente (IE0 o IE1) mientras que el bit de modo de petición (IT0 o IT1) se mantiene invariable siempre y cuando se haya producido por flanco de bajada. En cambio, si se ha producido por un cambio de estado lógico el indicador IE0 o IE1 permanecerán a 1, por lo que han de ser puestos a cero por programa.

Interrupciones de los timers

Los indicadores o flags TF0 y TF1, correspondientes a el timer 0 y timer 1 respectivamente, reflejan las peticiones de interrupción de estas dos fuentes. Cuando se produce un desbordamiento (overflow) en los timers se produce un pulso en TFx (automáticamente se pone a 0) que a su vez provoca una interrupción (si está permitida). Esta interrupción hace que el programa principal salte al lugar indicado por el vector de interrupción correspondiente.

Interrupción del puerto serie

En el puerto serie existen dos indicadores que reflejan las peticiones de interrupción. Se trata de los indicadores o flags RI y TI. El falg RI indica la petición de interrupción debida a la recepción de un byte a traves de la línea serie y el flag TI indica que el buffer de transmisión está libre, siendo posible el envío de un nuevo byte. Estos indicadores no se ponen automáticamente a 0 por lo que el propio programador ha de hacerse con el cargo de ponerlos a 0.

i088.gif (541 bytes)La petición de interrupción se reconoce sobre la operación lógica <<OR>> entre los dos indicadores RI yTI.

   

l002.gif (417 bytes)

(1) El carácter < ' > utilizado en todo el tutorial indica que el elemento a que se refiere es activo a nivel bajo, esto es, es activo cuando su nivel lógico es un cero.


   Contenido>Indice>Intro Tutor