duda sobre interrupciones cuando hay varias

hola que tal

tengo una duda referente a las interrupciones y es que ;

normalmente en los programas que veo de ejemplo la interrupcion salta 0x04
entonces si yo tengo una interrupcion que se ha de generar cuando llega un dato a la usart
y la pongo a continuacion de 0x04 pero tengo una interupcion que quiero que se genere cuando el conversor A/D termina de convertir ahi es cuando me viene la duda

cada interrupcion de las que tiene el pic16f876 tiene una direccion ?? 0x04 ,o 0x05 ect...
o como se hace esto cuando hay varias interrupciones

porque en los libros que tengo no abarca un programa que tenga varias y no se como funciona este tema

gracias por la ayuda
un saludo
 
En el PIC todas las interrupciones tienen la misma prioridad y saltan a la misma direccion (0004h), conocido como vector de interrupciones

Lo primero que se hace es probar secuencialmente todas y cada una de las interrupciones habilitadas en tu programa, asi tu puedes definir que interrupcion atenderas primero en caso de que existan 2 activas al mismo tiempo

Al finalizar la subrutina apagas la bandera de la interrupcion que atendiste y continuas probando las interrupciones restantes, y al final del vector retornas con la instruccion RETFIE que vuelve a habilitar las interrupciones globales, si durante la prueba del vector se volvio a activar una interrupcion previa, el PIC retornara automaticamente a la direccion 04 y comenzara de nuevo, y asi seguira hasta que ya no existan interrupciones por atender, entonces retornara al programa principal...
 
si durante la prueba del vector se volvio a activar una interrupcion previa, el PIC retornara automaticamente a la direccion 04 y comenzara de nuevo, y asi seguira hasta que ya no existan interrupciones por atender, entonces retornara al programa principal...

Aca creo estas equivocado, durante la atencion de rutinas al ingresar a ellas en la direccion 0x04 se DESHABILITAN globalmente las INTS (lo hace propiamente el PIC) , por ello es imposible que se produzcan otras mientras se atiende una de ellas, si fuera cierto estariamos hablando que tiene prioridad para atencion LA ULTIMA interrupcion generada y no es asi, chauuuuuuuuu
 
entonces digamos que a continuacion de 0x04 pongo el codigo de la interrupcion usart
cuando el programa salte al vector lee lo primero checkeo si la interrupcion es por la usart y si no lo es
salto a la siguiente interrupcion A/D a ver si se ha generado
es asi como se ha de hacer?

lo comento porque he visto programas que en vez de 0x04 hay puesto 0x05 y despues el codigo
supongo que seran subrrutinas

un saludo y gracias
 
Si asi se hace, la prioridad se las da tu al revisar los Flags de las INTs, cual revisas primero y ya, Microchip recomienda tambien al entrar a la rutina de INTs deshabilitar globalmente las INTs por software aunque el PIC lo hace.........porque??? no lo se solo recuerdo que lo lei en una nota de ellos, yo lo uso asi y no hay problem
 
Aca creo estas equivocado, durante la atencion de rutinas al ingresar a ellas en la direccion 0x04 se DESHABILITAN globalmente las INTS (lo hace propiamente el PIC) , por ello es imposible que se produzcan otras mientras se atiende una de ellas, si fuera cierto estariamos hablando que tiene prioridad para atencion LA ULTIMA interrupcion generada y no es asi, chauuuuuuuuu

:no::no: para nada...

De echo el manual explica claramente que las interrupciones NUNCA SE DESACTIVAN.... el PIC salta al vector de interrupciones con la combinacion de 3 bits que deben estar activados:

el primero es el GIE (Global Interrupt Enable) y es el encargado de habilitar las interrupciones globalmente, se desactiva automaticamente al entrar en la interrupcion y se vuelve a activar al salir del vector usando la interrupcion retfie (retorno de interrupcion), por lo mismo NUNCA se debe usar esta instruccion sino hasta el final del vector... de lo contrario si hay otra interrupcion el PIC volveria a saltar al vector

El segundo bit es el de habilitacion individual de cada interrupcion, (por ejemplo para el timer0 es el T0IE Timer 0 Interrupt Enable), ese se tiene que activar por software para indicar al CPU que queremos que salte al vector en caso de que se genere una interrupcion

Finalmente tenemos el Interrupt Flag (siguiendo el ejemplo del timer 0 seria el T0IF), la accion de este NUNCA SE PUEDE DESHABILITAR,... siempre que el modulo este ejecutando una accion se pondra a 1 cuando termine la tarea pendiente, por ejemplo para el caso del ADC se pondra a 1 cuando se termine la conversion. Se debe apagar por software una vez atendida la interrupcion de lo contrario el PIC siempre saltara al vector si estan habilitados los otros 2 bits...

Yo hice programas que no entraban al vector.. simplemente probaban la bandera de interrupcion (xxIF) para determinar si ya se habia completado la accion... y en base a eso corrian una subrutina... las llamaba interrupciones virtuales porque nunca interrumpian el programa principal....
 
No se pero te confundes: pego tu texto

"Al finalizar la subrutina apagas la bandera de la interrupcion que atendiste y continuas probando las interrupciones restantes, y al final del vector retornas con la instruccion RETFIE que vuelve a habilitar las interrupciones globales, si durante la prueba del vector se volvio a activar una interrupcion previa, el PIC retornara automaticamente a la direccion 04 y comenzara de nuevo, y asi seguira hasta que ya no existan interrupciones por atender, entonces retornara al programa principal..."
Si al entrar a la rutina DESACTIVAS globalmente las INTs es IMPOSIBLE que probando o testeando los vectores o FLAGs que es lo que se hace se active una interrupcion pues estan deshabilitadas globalmente.

Cuando te explico que se DESACTIVAN no quiero decir que NO SE PRODUCEN de hecho si lo hacen pero no tiene efecto pues estan deshabilitadas de forma global, al salir de la rutina de atencion de INTs si existe un flag activo SI saltara nuevamente al vector de INTs, pero NUNCA dentro de la prueba de FLAGs, eso si es IMPOSIBLE y es el error del que te dijo incurres, chauuuuuu

Ahora si dices que hiciste programas donde revisabas el flag sin entrar al vector de INTs, pues se puede hacer solo que estas malgastando tiempo y recursos en tu programa pues testeas o haces polling de una variable que no lo necesita. es como si vives en una casa y cada 10 minutos revisas si alguien esta tocando la puerta, si lo mas sencillo es esperar a que golpeen o toquen el timbre, es uan analogia, chauuuuuuuu

te anexo un diagrama logico de las iNTs, si el GIE esta deshabilitado o en "0" es IMPOSIBLE que la informacion de la INT llegue ala CPU.
 

Adjuntos

  • Logica INTs.JPG
    Logica INTs.JPG
    42.9 KB · Visitas: 17
Última edición:
No se pero te confundes: pego tu texto

"Al finalizar la subrutina apagas la bandera de la interrupcion que atendiste y continuas probando las interrupciones restantes, y al final del vector retornas con la instruccion RETFIE que vuelve a habilitar las interrupciones globales, si durante la prueba del vector se volvio a activar una interrupcion previa, el PIC retornara automaticamente a la direccion 04 y comenzara de nuevo, y asi seguira hasta que ya no existan interrupciones por atender, entonces retornara al programa principal..."
Si al entrar a la rutina DESACTIVAS globalmente las INTs es IMPOSIBLE que probando o testeando los vectores o FLAGs que es lo que se hace se active una interrupcion pues estan deshabilitadas globalmente.

Cuando te explico que se DESACTIVAN no quiero decir que NO SE PRODUCEN de hecho si lo hacen pero no tiene efecto pues estan deshabilitadas de forma global, al salir de la rutina de atencion de INTs si existe un flag activo SI saltara nuevamente al vector de INTs, pero NUNCA dentro de la prueba de FLAGs, eso si es IMPOSIBLE y es el error del que te dijo incurres, chauuuuuu

De entrada.... en que parte dije que saltara dentro de la prueba de FLAGS?

Segundo... no es imposible que salte dentro de la prueba de FLAGS... de echo es muy facil hacerlo y microchip lo dice en el manual para que se evite..... simplemente hay que usar la instruccion retfie dentro de la prueba de FLAGS y si hay una sola interrupcion activa el micro volvera a saltar a la direccion 4.. sin haber dejado previamente el vector, repite la accion suficientes veces y desbordaras la pila de 8 niveles..

Ahora si dices que hiciste programas donde revisabas el flag sin entrar al vector de INTs, pues se puede hacer solo que estas malgastando tiempo y recursos en tu programa pues testeas o haces polling de una variable que no lo necesita. es como si vives en una casa y cada 10 minutos revisas si alguien esta tocando la puerta, si lo mas sencillo es esperar a que golpeen o toquen el timbre, es uan analogia, chauuuuuuuu

te anexo un diagrama logico de las iNTs, si el GIE esta deshabilitado o en "0" es IMPOSIBLE que la informacion de la INT llegue ala CPU.

No es un malgasto de tiempo... simplemente es un uso mas adecuado de los recursos, mi programa principal tenia acciones que NO SE PODIAN DETENER... era aun mas importante e imperativo terminar el programa principal que atender las interrupciones.... asi que deshabilite todas las interrupciones, ejecutaba el programa principal y despues lo mantenia en un ciclo infinito poleando las variables hasta que ocurriera una interrupcion... despues volvia a ejecutar todo con los nuevos valores...
 
Claro te corrijo tu dices en el texto "prueba de vectores" los vectores no los puedes probar!!! imagino que lo que preubas son los FLAGs.

Muestrame donde dice Microchip que se use la instruccion RETFIE dentro de la prueba de FLAGS???, pues claramente se usa para SALIR de la rutina de INTs, si miras las plantillas de cualquier PIC en ASM notaras que solo se usa ahi "AL SALIR" de las INTs, si uso la instruccion RETFIE "YA NO ESTOY DENTRO DE LA RUTINA DE ATENCION DE LAS INTs" estoy donde el PC me haya llevado al sacar la informacion de la pila o stack, pues claramente esta instruccion retoma el valor guardado del PC en la pila y direcciona la ejecucion del programa nuevamente.

Ademas aclalra que defines o llamas vector pues hablas de probarlo y otras veces de abandonarlo, que es para Ti vector???

Otra cosa lo que hablas de desbordar la pila es imposible, cuando el PC es enviado al vector 0x04 se carga el valor del PC en la pila, pero RETFIE lo recupera, y el stack es un registro tipo FILO (primero en entrar ultimo en salir) por lo tanto no tiene porque desbordarse, eso pasaria si no se recuperara el valor del PC pues solo se estarian ingresando datos chauuuuuuuuuuuu

Lo de usar las INTs sin habilitarlas no le encuentro sentido, se llaman INTERRUPCIONES por que como su nombre lo indican deben INTERRUMPIR la ejecucion del programa principal y atenderse, conclusion usas Interrupciones que no tienen valor como tal y son simples operaciones amen de que usas simplemente el FLAG, por eso no se pueden llamar interrupciones solo simplemente procesos enmascarados.
 
Última edición:
OK.. para mi el vector de interrupcion son todas las instrucciones dedicadas a atender una o varias interrupciones... cuando entras al vector lo haces por la direccion 4 y cuando sales lo haces con la instruccion retfie... hablo de probar vectores por que en otros micros existen multiples vectores que atienden multiples interrupciones... en el caso del PIC es simple.. todas las interrupciones lo hacen saltar a la direccion 4, pero en otros micros (por ejemplo) el timer lo haria saltar a la direccion 13, el ADC a la direccion 20, el UART a la direccion 15, etc...

Yo nunca dije que Microchip recomiende usar la instruccion retfie dentro de la prueba de flags, lo que dice es EXACTAMENTE LO CONTRARIO... usarla solo hasta el final del vector de interrupcion, para ti y para mi puede resultar logico.. pero para un principiante que le enseñan que la instruccion retfie se usa solo en el vector de interrupcion no lo es.. de echo vi muchos casos de estudiantes que incluso usaban retfie para todo (incluso en el programa principal)... y obviamente desbordaban el stack...

Finalmente... cuando hagas una aplicacion con un convertidor AD de 16 bits con signo, que ejecute operaciones matematicas de correccion de señal usando ecuaciones lineales de tipo y=mx+b a 32 bits con signo, y conversion de hex a bcd (a 32 bits con signo), para pasar los datos via serial... me comentas si no le encuentras sentido a deshabilitar las interrupciones y probarlas solo al final... de echo esa aplicacion fue mi acabose con el mundo de los PICs... nunca mas volvi a usarlos por que descubri los limites que tienen... de alli en adelante use MSP430, FREESCALE y ATMEL...
 
Para el caso que nos ocupa de los PICs existe SOLO un vector de INTs, si hablas de otros vectores como en otros Microcontroladores pues estas mal, los PICs y Tu lo sabes solo tienen 1, el caso es concreto aca....los PICs.


"Segundo... no es imposible que salte dentro de la prueba de FLAGS... de echo es muy facil hacerlo y microchip lo dice en el manual para que se evite..... simplemente hay que usar la instruccion retfie dentro de la prueba de FLAGS y si hay una sola interrupcion activa el micro volvera a saltar a la direccion 4.. sin haber dejado previamente el vector, repite la accion suficientes veces y desbordaras la pila de 8 niveles.."

Esto es muy absurdo, pues claro que se puede y si me vas a decir que se puede hacer, yo te dijo que eso y mas burradas se pueden hacer, pero la idea es hacer algo que sirva y no algo lleno de errores que no sirva.

Respecto a lo ultimo, es muy CLARO, por si no lo sabias hay procesos que por ser criticos se deben hacer con las INTs deshabilitadas pero esto no significa que debeas hacer polling de las mismas luego del proceso, sencillamente se deshabilitan y luego las habilitamos nuevamente y espero que se produzcan, chauuuuuuuuu

te aclaro.......... crees que cosas como esta o mas dificiles no he hecho???

"Finalmente... cuando hagas una aplicacion con un convertidor AD de 16 bits con signo, que ejecute operaciones matematicas de correccion de señal usando ecuaciones lineales de tipo y=mx+b a 32 bits con signo, y conversion de hex a bcd (a 32 bits con signo), para pasar los datos via serial... me comentas si no le encuentras sentido a deshabilitar las interrupciones y probarlas solo al final... de echo esa aplicacion fue mi acabose con el mundo de los PICs... nunca mas volvi a usarlos por que descubri los limites que tienen... de alli en adelante use MSP430, FREESCALE y ATMEL..."

si pretendias posar de sabelotodo enumerando uno u otra cosa, estamos perdiendo tiempo, aca no se trata de quien parece mas sabio si no de quien sustenta sus argumentos de forma cierta, chauuuuuuuuu
 
Última edición:
Atrás
Arriba