Autor Tema: Como finalizo una interrupcion antes de tiempo?  (Leído 2095 veces)

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

Desconectado naieto

  • PIC10
  • *
  • Mensajes: 45
Como finalizo una interrupcion antes de tiempo?
« en: 05 de Junio de 2006, 14:40:02 »
Hola gente, hay alguna forma de salir abruptamente de una interrupcion antes que esta finalice? ejemplo:
blablalba
#INT_EXT
funcion1()
        {
         for(contador_1=0;contador_1<=10;contador_1++)
            {
             for(contador_2=0;contador_2<=100;contador_2++)
                {
                 for(contador_3=0;contador_3<=200;contador_3++)
                    {
                     if(input(PIN_B1))
                       {
                        TERMINAR CON LA INTERRUPCION
                       }
                     output_high(PIN_A0);
                    }
                 }
             }
          }

main()
      {
       blablabla; 
       while(1)
              {
               enable_interrupts(GLOBAL);
               enable_interrupts(INT_EXT);
               ext_int_edge(L_TO_H);
               output_low(PIN_A0);
               }
       }
Si aprieto un pulsador en rb0 entro en funcion1 y me prende un led hasta que termine la interrupcion (es decir hasta que terminen de contar los for anidados), pero si aprieto un pulsador en rb1 antes que termine dicha interrupcion quiero que esta finalice inmediatamente. Al principio crei que si desabilitaba la interrupcion inmediatamente salia, pero no es asi por las pruebas que hice.
gracias
El fruto solo madura con el tiempo

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Como finalizo una interrupcion antes de tiempo?
« Respuesta #1 en: 05 de Junio de 2006, 14:55:04 »
Si bien no es una solución elegante... podrias hacerlo.  Has probado con ¿exit? ¿return? ¿goto?

De todas formas, tener rutinas grandes en una rutina de interrupción no es para nada aconsejable y es una mala práctica de programación que debieras comenzar a evitar.  Eso te acarrea mas problemas que soluciones y además no atenderías otra interrupción mientras procesas la actual. 

Saludos




- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Como finalizo una interrupcion antes de tiempo?
« Respuesta #2 en: 05 de Junio de 2006, 15:05:10 »
Puedes utilizar un antiestético goto que te mande al final de la función de interrupción.

P.D.: veo que se me ha adelantado Maunix con la misma solución  :D

Desconectado naieto

  • PIC10
  • *
  • Mensajes: 45
Re: Como finalizo una interrupcion antes de tiempo?
« Respuesta #3 en: 05 de Junio de 2006, 15:23:44 »
Bueno muchachos, contestaron mas rapido de lo que esperaba. Gracias, voy a probar lo que me sugirieron. Pregunte por las dudas que hubiera alguna funcion especifica de la interrupcion, pero veo que no solo no existe sino que no se usa hacer esto.
Salu2
Sebastian Nieto
El fruto solo madura con el tiempo

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
Re: Como finalizo una interrupcion antes de tiempo?
« Respuesta #4 en: 05 de Junio de 2006, 15:31:01 »
si , es lo malo que tiene al recrearse en ellas mucho tiempo
Código: [Seleccionar]
#INT_EXT
/************************************************************/
Mi_interrupcion(){
/************************************************************/
 if ((pulsador & 1)== 1){ // segunda pulsacion
    contador_1 = 11;  // lo cual forzara a salir de todos los "for"
    contador_1 = 101;
    contador_1 = 201;
 }
 
 Pulsador ++;
}
/************************************************************/
funcion1(){
/************************************************************/

         for(contador_1=0;contador_1<=10;contador_1++)
            {
             for(contador_2=0;contador_2<=100;contador_2++)
                {
                 for(contador_3=0;contador_3<=200;contador_3++)
                    {

                     output_high(PIN_A0);
                    }
                 }
             }
          }         
         
/************************************************************/
main() {
/************************************************************/     
       blablabla;
     
      byte pulsador;
      Pulsador = 0;
       
       while(1)
              {
               enable_interrupts(GLOBAL);
               enable_interrupts(INT_EXT);
               ext_int_edge(L_TO_H);
               output_low(PIN_A0);
               
               if ((pulsador & 1)== 1){funcion1();} // o verificar la bandera que la produjo
               }
       }

yo usaria banderitas


Este ejemplo quizas no funcione , solo es una idea .


Desconectado naieto

  • PIC10
  • *
  • Mensajes: 45
Re: Como finalizo una interrupcion antes de tiempo?
« Respuesta #5 en: 05 de Junio de 2006, 15:59:37 »
Me gusto la idea de hacer
contador_1=11
contador_2=101
contador_3=201
asi me evito usar un goto que recuerdo una vez haberme traido problemas al compilar, no se si a alguien le paso tambien de no poder compilar con goto o fue algun problema mio.
El fruto solo madura con el tiempo

Desconectado Arbolito

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 893
Re: Como finalizo una interrupcion antes de tiempo?
« Respuesta #6 en: 05 de Junio de 2006, 16:05:14 »
pues si que no es muy estetico el goto no ?
y ademas que se te dijo en el curso sobre los saltos dentro de las interrupciones?
jejeje :lol:
Como andas seba veo que por fin te animaste a postear bueno solo saludarte y darte la vienvenida y
Existo, aunque pienses que no pienso

Desconectado naieto

  • PIC10
  • *
  • Mensajes: 45
Re: Como finalizo una interrupcion antes de tiempo?
« Respuesta #7 en: 05 de Junio de 2006, 20:24:01 »
Bueno, agradezco la ayuda, les cuento que al final puse un if(blablabla) {break;} dentro del lazo for para salir inmediatamente de este y por ende en mi ejemplo salir de la interrupcion. Todo esto venia porque queria hacer un programa que me prenda un led en ra0 si mantenia apretado un pulsador en rb0 un tiempo minimo, si no llegaba a ese tiempo minimo que no haga nada. Aca dejo el programita por si a alguien le interesa:

# INCLUDE <16F84.h>
# USE DELAY(clock=4000000)
# FUSES HS,NOWDT,NOPUT
# USE FAST_IO(A)
# USE FAST_IO(B)

int contador_1;
int contador_2;
int contador_3;
int1 estado_pulsador=0;

#INT_EXT
funcion1()
        {
         estado_pulsador=1;
         for(contador_1=0;contador_1<=5;contador_1++)
            {
             for(contador_2=0;contador_2<=100;contador_2++)
                {
                 for(contador_3=0;contador_3<=200;contador_3++)
                    {
                     if(!input(PIN_B0))
                       {
                        estado_pulsador=0;
                        break;
                       }
                     if(estado_pulsador==1)
                       {output_low(PIN_A0);
                       }
                    }
                 }
             }
          }

main()
   {
    set_tris_a(0);
    set_tris_b(1);
    output_low(PIN_A0);
    while(1)
          {
           enable_interrupts(GLOBAL);
           enable_interrupts(INT_EXT);
           ext_int_edge(L_TO_H);
           if(estado_pulsador==1)
            {
             output_high(PIN_A0);
             delay_ms(2000);
             output_low(PIN_A0);
             estado_pulsador=0;
            }
          }
   }
Cualquier sugerencia para mejorarlo es aceptada por supuesto
salu2 Seba Nieto
El fruto solo madura con el tiempo

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Como finalizo una interrupcion antes de tiempo?
« Respuesta #8 en: 05 de Junio de 2006, 20:54:07 »
Yo pondria:

#define TRUE    1
#define FALSE   0

inicializo la variable Salir = FALSE;

en cada for ponemos (por ejemplo): (contador_1<5) && (!Salir)

Si ponemos Salir=TRUE

Todos los bucles terminan

Un saludo.
« Última modificación: 05 de Junio de 2006, 20:56:47 por jfh900 »
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
Re: Como finalizo una interrupcion antes de tiempo?
« Respuesta #9 en: 06 de Junio de 2006, 14:14:36 »
Hola, bueno creo que tambien es posible que en donde quieras finalizar la interrupcion escribas en ASM la instruccion RETFIE, pero cuidado, recuerda que si haces esto deberias recuperar los registros W, STATUS y todo lo que pretendas mantener al ingresar al la interrupcion antes de retornar de ella, esto en C es automatico, bueno dejo la idea, obviamente requiere conocer algo de ASM.

saludos.
saludos
PikMan

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Como finalizo una interrupcion antes de tiempo?
« Respuesta #10 en: 06 de Junio de 2006, 14:44:32 »
Hola, bueno creo que tambien es posible que en donde quieras finalizar la interrupcion escribas en ASM la instruccion RETFIE, pero cuidado, recuerda que si haces esto deberias recuperar los registros W, STATUS y todo lo que pretendas mantener al ingresar al la interrupcion antes de retornar de ella, esto en C es automatico, bueno dejo la idea, obviamente requiere conocer algo de ASM.

saludos.

Yo no haría eso.  El C no solo guarda el contexto típico del pic sino que también suele guardar contextos propios del stack interno que utiliza para sus propias variables.

Hacer algo asi, volvería de la rutina de interrupción pero nos podría acarrear otros problemas como sobreescritura de variables por no haberse vaciado correctamente la pila, etc.


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything