TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Thulsa Doom en 06 de Mayo de 2018, 18:08:14
-
Hola a todos, Quiero usar las interrupciones externas del PIC, uso el PIC18F4620 y mi duda es.
A suponer que tengas las interrupciones externas todas por flanco de subida y todas están en alta prioridad, llegado el momento se activa la interrupción del pin RB1, ¿mientras la bandera de esta interrupción esté activada se puede activar otra interrupción, supongamos que la del pin RB2 o hay que esperar a que termine de atender la interrupción del PIN RB1 para que se pueda atender la interrupción del pin RB2?
-
Las interrupciones en los PIC18 tienen 2 niveles si lo deseas, voy a basarme en XC8 que es mas explicito.
Las de alta prioridad pueden interrumpir a las de baja prioridad.
Las de alta prioridad NO pueden interrumpir a una de alta prioridad.
En si.. Si 2 interrupciones de alta prioridad se activan juntas, el codigo es quien va a determinar si se hace primero una u otra. Ejemplo
void interrupt altaPrio(void)
{
if(int del RB0?)
{}
if(int del RB1?)
{}
}
Voy a dar unos casos
En este caso si ambos se activan entonces RB0 va a tener una "prioridad" sobre RB1.
Si por ejemplo se activa RB0 entra a la interrupcion y mientras esta dentro del if de RB0, en realidad antes de que se ejecute el if de RB1 se activa RB1. En este caso en una sola entrada de interrupcion va a atenderse ambos.
Si por otro lado RB1 se activa luego de que el micrcontrolador pregunto por el if de RB1, eso quiere decir que el micro va a salir de la interrupcion y apenas salga va a volver a entrar ahora si para ejecutar lo de RB1
En CCS como sabes no tenes que preguntar por la bandera, sino que el compilador internamente crea esos if por si solo.
-
Entiendo, y otra pregunta, supongamos que en RB0 hay un función donde su código es mucho más extenso, se activa la interrupción del RB0, se activa su bandera de interrupción y se entra en la función, ¿mientras está ejecutando el código de la función de RB0 si se cambia el estado del pin RB1 se activa su bandera?
-
Entiendo, y otra pregunta, supongamos que en RB0 hay un función donde su código es mucho más extenso, se activa la interrupción del RB0, se activa su bandera de interrupción y se entra en la función, ¿mientras está ejecutando el código de la función de RB0 si se cambia el estado del pin RB1 se activa su bandera?
Si pensa que cada modulo es aparte e independiente, el nucleo del PIC detecta los flags puestos a 1 mientras tiene activa las interrupciones. Los modulos pueden poner a 1 ese flag sin intervencion del nucleo.
Por eso mismo tenes que mientras no esta en una interrupcion (sea por que salio de la misma o en el programa principal) apenas detecta un 1 en un flag, va a entrar a la interrupcion.
Y tenes que recordar que mientras esta en la interrupcion se desactiva la interrupcion de esa prioridad y de menores prioridades, ejemplo, si estas en una interrupcion de alta prioridad deshabilita las interrupciones de alta y baja. Al salir de la interrupcion, la instruccion para volver tambien habilita la interrupcion y si detecta algun 1 en los flags vuelve a entrar a la interrupcion que le corresponda.
En tu caso , mientras RB0 se esta ejecutando , RB1 se activa el flag, entonces al estar en la interrupcion, recordando que tenemos las interrupciones deshabilitadas de forma automatica por el nucleo, quedan 2 opciones que ya habia comentado.
- La primera es que si el codigo de RB1 le continua al codigo de RB0, va a entrar, ejecutar el codigo, limpiar el flag de RB1 y salir de la interrupcion, en este caso se atendieron ambas interrupciones en una sola entrada a la interrupcion.
- La segunda opcion es que RB1 se hubiera activado luego de que preguntes si estaba activo o no el flag del mismo. Esto va a hacer que salgas de la interrupcion, al salir se activan las interrupciones, el nucleo detecta el flag activo, procede a saltar al vector de interrupcion y desactivar las interrupciones. En resumen, vuelve a entrar a la interrupcion. A la cual va a preguntar de nuevo por RB0 y RB1, pero solo tenemos el flag de RB1 activado.
-
Prefecto, entendido, en este caso me interesa ese comportamiento ya que estoy implementando un encoder rotatorio y me interesa ese comportamiento para detectar el sentido de giro del encoder, el código ya lo tengo implementado y en principio funciona en el proteus ahora hay que ver el comportamiento en hardware.
Muchas gracias por tu ayuda y por tu tiempo que has empleado en responderme ;-)