Hola
Esoy trabajando con el pic 16f628a, es mi primer experiencia con un pic y tengo una duda con respecto a la atencion de las interrupciones.
Cuando se lanza una interrupcion, el codigo que escribi la atiende.
Cuando el codigo esta atendiendo la interrupcion, se lanza otra interrupcion, el micro corta la ejecucion del codigo asociado a la interrupcion que se esta atendiendo o espera que finalice?
Muchas gracias
Saludos.-
Hola.
Supongo que programás en asm, así que me meto de lleno a nivel bajo:
En esta familia de microcontroladores con la que estás trabajando, cuando se produce un evento asociado a una interrupción, se setea el flag correspondiente a dicha interrupción. Luego de esto, si el bit GIE está activo(es decir, el bit de interrupciones globales está seteado) el uC carga en su pila(STACK) la posición 0x004(es como hacer un call 0x004). Esta posición 0x004 se conoce con el nombre de vector de interrupción. También automáticamente el uC pone a cero el bit GIE, por lo que el uC en este punto no volverá a interrumpir si sucede otra interrupción. Entonces dentro de la rutina de interrupción, el bit GIE continúa desactivado. Al finalizar la rutina de interrupción, podés salir de dos formas: con un return o con un retfie. El retfie es un return y a la vez activa el bit GIE. Si volvés con un return, se descarga de la pila la posición 0x004, pero no se activa el bit GIE. Luego tendrás que reactivarlo si deseas atender otras interrupciones utilizando el vector de interrupciones.
Hay que destacar lo siguiente:
El uC ingresa a la subrutina de interrupción cuando suceden tres cosas: La interrupción está activa, el flag de dicha interrupción está seteado y el bit GIE está seteado también. Esto es suficiente para que el uC automáticamente ingrese a la rutina de interrupción.
La mayoría de las interrupciones requieren que el flag de interrupción sea limpiado(puesto a cero) por el usuario. Cuando se produce una interrupción previamente configurada, el uC la atenderá. Si no limpiás dicho flag antes de volver a setear el bit GIE, el uC va a volver a ingresar al vector de interrupción.¿Por qué? Porque se producen las 3 condiciones necesarias que mencioné previamente para que el pic ingrese al vector de interrupcion.
Entonces, volviendo al asunto que estás preguntando: No es tan sencillo responderte, porque podés adulterar el comportamiento de las interrupciones de manera bastante significativa...pero resumiendote:
Cuando trabajas con más de una interrupción, el uC carga el vector de interrupción(0x004) y ejecuta el código a continuación. Cuando trabajás con más de una interrupción, la manera de saber cuál fue la que lo produjo es revisando cada flag de cada interrupción. Si un flag está seteado, dicha interrupción sucedió y tu decidirás qué hacer. Si sucede otra interrupción mientras..todo depende! de si sucede antes o después de que hayas revisado el flag asociado. Si sucede antes, el uC no va a volver a interrumpir, pero al toparse con la línea en la que revisas su flag, va a atender al código que hayas elegido para dicha interrupción. Si sucede después, y no limpiás el flag de la ultima interrupción, dicho flag continuará seteado, por lo que en cuanto vuelvas a activar el bit GIE(sea mediante un retfie o mediante otra instrucción manualmente) el uC va a volver a ingresar al vector de interrupción porque se cumplen los 3 requisitos...
Metiendote más en lo freaky, se puede una vez dentro del vector de interrupción, activar manualmente el bit GIE. Esto sería como una interrupción dentro de otra interrupción. Para nada recomendable porque el código se hace muy complejo y resulta dificil(y hasta no se que punto IMPOSIBLE(debería meditarlo)) descargar la STACK luego ya que se cargan dos niveles del STACK con el vector 0x004 y se hace un lindo merengue de código para poder liberarlos correctamente luego.
Resumiendo encondes. bajo programación normal y sencilla. El uC atenderá la nueva interrupción en cuanto salga de la previa. Es decir: en cuanto se vuelva a setear el bit GIE.
Obviamente para que esto ocurra, es necesario también que la interrupción correspondiente esté activada. Siempre recordá que el uC "salta" al vector de interrupción cuando se cumplen esas tres condiciones.
Si trabajás en otro lenguaje, como CCS, no vale por ahi la pena que te comas tanto el coco con lo que dije. El CCS atenderá a la nueva interrupción en cuanto termine con la actual.
Y podría seguir escarvando infinitamente en este tema, asi que mejor lo dejo acá(por ahora...
).
depende de la prioridad de la interrupcion, y si esta activado el tema de las prioridades.
a qué interrupciones te referis especificamente?
En esta familia de uC no hay prioridades en las interrupciones, por lo que el uC no diferencia ni prioriza una sobre otra. A eso debe hacerlo el usuario por software y con ciertas limitaciones...
Saludos.