Autor Tema: 16F628A - Interrupciones que se interrumpen  (Leído 3484 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
16F628A - Interrupciones que se interrumpen
« en: 10 de Septiembre de 2008, 16:29:16 »
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.-
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: 16F628A - Interrupciones que se interrumpen
« Respuesta #1 en: 11 de Septiembre de 2008, 01:18:01 »
Hola.

En que lenguaje programas? ASM o C?

Saludos
El papel lo aguanta todo

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: 16F628A - Interrupciones que se interrumpen
« Respuesta #2 en: 11 de Septiembre de 2008, 01:38:47 »
depende de la prioridad de la interrupcion, y si esta activado el tema de las prioridades.
a qué interrupciones te referis especificamente?

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: 16F628A - Interrupciones que se interrumpen
« Respuesta #3 en: 11 de Septiembre de 2008, 02:01:39 »
Hola buenas noches ahorita casualmentes estaba realizando unas pruebas con interrupciones con este mismo pic aca le dejo un ejemplo de interrupcion en RB0/int
espero y te sea de un poco de utilidad y tu mismo saques tus conclusiones.

hota el led enciende solo cuando el puerto A edsta en %00001001 y logicamente hay una interrupcione en el pin BO del puerto B
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: 16F628A - Interrupciones que se interrumpen
« Respuesta #4 en: 11 de Septiembre de 2008, 03:21:39 »
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... :D :D :D).



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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: 16F628A - Interrupciones que se interrumpen
« Respuesta #5 en: 11 de Septiembre de 2008, 08:23:26 »
Mejor imposible la explicacion que dio el colega BrunoF, asi que has tu codigo y somete todo a prueba.

Saludos.
Atten.Alexander Santana.
Barcelona-Venezuela
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE


 

anything