Autor Tema: interrupcion , retfie y return  (Leído 6837 veces)

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

Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
interrupcion , retfie y return
« en: 11 de Diciembre de 2005, 16:16:00 »
amigos, esta es una pregutna basica, como hago si quiero salir de una interrupcion, por ejemplo de la RB0 (#int_ext) si tengo una condicional, puedo hacerlo con return?, en asembler se hace con retfie, en asembler si uso return me genera un lugar menos de pila y no sirve, Como hago esto en C ya que quiero salir en mitad de la interrupcion si se me cumple una condicional

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: interrupcion , retfie y return
« Respuesta #1 en: 13 de Diciembre de 2005, 07:46:00 »
¿No te sirve poner un "goto" a una etiqueta que esté justo delante del "return" de tu función?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: interrupcion , retfie y return
« Respuesta #2 en: 13 de Diciembre de 2005, 10:29:00 »
Dicen por ahí que no se debe se usar el GOTO en C. Desde luego funcionaría, pero yo lo haría usando sentencias del tipo if o while.

Depende de cual sea el programa que hay dentro de la interrupción. ¿no puedes hacer if(la condición contraria), entonces que haga el programa de la interrupción, de lo contrario se saldrá fuera de la función de la interrupción? Ya te digo depende de lo que tengas dentro, convendría mirarlo.

Un saludo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: interrupcion , retfie y return
« Respuesta #3 en: 13 de Diciembre de 2005, 12:17:00 »
Sí, eso dicen. Es cierto que queda horrible un "goto" en medio de un programa, y suele ser señal de que no está bien estructurado. Pero como parche, es inigualable Muchas risas

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: interrupcion , retfie y return
« Respuesta #4 en: 13 de Diciembre de 2005, 15:34:00 »
Con la instrucción "return" o "break" se sale desde cualquier punto de una interrupción o subrrutina.

El compilador se encarga de hacer el correspondiente "goto" para restaurar el contexto de la pila.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: interrupcion , retfie y return
« Respuesta #5 en: 13 de Diciembre de 2005, 19:38:00 »
Y en una rutina de interrupcion lo menos recomendable es usar sentencias del tipo if y similar.Cuanto mas escueta mejor y menos tiempo se está dentro de la interrupción mejor.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: interrupcion , retfie y return
« Respuesta #6 en: 14 de Diciembre de 2005, 10:10:00 »
Me podrías explicar porqué no es bueno estar mucho tiempo dentro de una interrupción?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: interrupcion , retfie y return
« Respuesta #7 en: 14 de Diciembre de 2005, 12:25:00 »
Porque inhibes otras posibles interrupciones,puedes perder eventos.Si,sé que para eso están las máscaras y las prioridades,pero aun así siempre puede haber interrupciones de baja prioridad q salgan perjudicadas

Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
RE: interrupcion , retfie y return
« Respuesta #8 en: 14 de Diciembre de 2005, 14:44:00 »
sabemos que se ve feo usar un goto en C porque no estaria bien estructurado, y que no es bueno usar muchos if dentro de un interrupción, entonces es factible poner return;?, si hago esto en asembler en lugar de usar retfie solo tendria para hacer 8 interrupciones segun la pila del 16f877, porque cada vez que se haga esta interrupcion con return se come un nivel de pila.....

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: interrupcion , retfie y return
« Respuesta #9 en: 14 de Diciembre de 2005, 15:18:00 »
Se supone que el micro guarda el contexto de acumulador/es en cada entrada a interrupción,por lo que si usas return no sacarías de la pila este guardado de contexto.Si lo haces en C,puede valer que uses un goto,tal y como dice Nocturno,que te haga saltar al final de la rutina de interrupción,pero sin añadir sentencias del tipo return,el compilador ya lo hace por tí,por ejemplo:

void interrupcion()
{
...
...
...
goto sal_int;
...
...
...
sal_int: asm("nop");  //   Por ejemplo...a lo mejor te deja poner la etiqueta
                                  //  sin añadir ninguna instrucción,pruébalo
}

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: interrupcion , retfie y return
« Respuesta #10 en: 15 de Diciembre de 2005, 07:01:00 »
Ah bueno, ¡ en el caso que tengas varias interrupciones ! y también dependiendo de cuando te vayan a venir, pero en caso de que tengas solo una sola interrupción como es el caso que plantea omibaya pués no pasa absolutamente nada.

Omibaya puedes poner el trozo de programa de la interrupción y la condicional desde la cual quieres abandonar la interrupción?

Un saludo

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: interrupcion , retfie y return
« Respuesta #11 en: 15 de Diciembre de 2005, 19:44:00 »
Escrito originalmente por Modulay

void interrupcion()
{
...
...
...
goto sal_int;
...
...
...
sal_int: asm("nop"Giño;  //   Por ejemplo...a lo mejor te deja poner la etiqueta
                                  //  sin añadir ninguna instrucción,pruébalo
}


Yo en este caso pondría en vez de "goto sal_int" un return simplemente. Es el compilador el que te crea el goto hasta el final de la rutina y te coloca un refie por tratarse de una interrupción.

Yo lo he probado en C30 con una interrupción del módulo DCI que salta cada 20us y no hay desbordamiento de pila ni nada.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: interrupcion , retfie y return
« Respuesta #12 en: 15 de Diciembre de 2005, 21:39:00 »
Ciertamente.Lo acabo de comprobar y es tal como dice Antonio.De lo que tb me acabo de dar cuenta es de que CCS no parece hacer guardado de contexto ninguno

Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
RE: interrupcion , retfie y return
« Respuesta #13 en: 16 de Diciembre de 2005, 09:27:00 »
correcto amigos, tambien lo comprobe, me ayudaron a desasnarme, gracias

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: interrupcion , retfie y return
« Respuesta #14 en: 16 de Diciembre de 2005, 18:03:00 »
Escrito originalmente por Modulay
De lo que tb me acabo de dar cuenta es de que CCS no parece hacer guardado de contexto ninguno


El C30 creo que por defecto tampoco lo crea. Le tienes que decir tu que tipo de guardado hace:

Codigo:
/* Interrucpión del módulo interfaz del códec       */
/* Salva el contexto rápidamente (push.s, pop.s)    */

void __attribute__((__interrupt__, __shadow__)) _DCIInterrupt(void)


Con el atributo "__shadow__" salva el contexto en la pila rápidamente