Autor Tema: interrupcion!!! ayuda  (Leído 1788 veces)

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

Desconectado championx

  • PIC10
  • *
  • Mensajes: 22
interrupcion!!! ayuda
« en: 02 de Marzo de 2006, 01:10:00 »
que tal! bueno paso a contarles, tengo un 16f628 que ejecuta instrucciones permanentemente, pero cuando recibe un pulso en el RB0 ejecuta una interrupcion, todo anda perfecto... el problema al parecer es que la rutina de interrupcion es demasiado larga o compleja (getc y algunos delays, if, etc), entonces necesitaria usar un GOTO, para que vaya al main al lugar donde se encuentra la rutina que deseo ejecutar, pero el compilador no me deja utilizar GOTO, tampoco puedo usar Flags, ya que en el momento que cambia el flanco de RB0 debe hacerse la instruccion sin perder NADA de tiempo.

alguien tiene alguna sugerencia?


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: interrupcion!!! ayuda
« Respuesta #1 en: 02 de Marzo de 2006, 03:03:00 »
Yo de tí usaría una variable global. En el main estarías continuamente chequeando su valor, que por defecto podría ser 0.
De esta manera, al saltar la interrupción, te limitarías a cambiar el valor a 1 y ejecutar la rutina en el propio main.

De todas formas, si quieres bajar un poco de nivel, ya hay un bit en el micro que se comporta exactamente como he descrito arriba. Sería cuestión de buscar en la data cuál es el bit y chequearlo en el main.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: interrupcion!!! ayuda
« Respuesta #2 en: 02 de Marzo de 2006, 17:57:00 »
Escrito originalmente por nocturno66
Yo de tí usaría una variable global. En el main estarías continuamente chequeando su valor, que por defecto podría ser 0.
De esta manera, al saltar la interrupción, te limitarías a cambiar el valor a 1 y ejecutar la rutina en el propio main.

De todas formas, si quieres bajar un poco de nivel, ya hay un bit en el micro que se comporta exactamente como he descrito arriba. Sería cuestión de buscar en la data cuál es el bit y chequearlo en el main.


Coincido con nocturno.  esto es lo que se suele hacer, setear una variable o un "flag" o "banderas" que le indiquen al bucle principal que ocurrió una interrupcion.

Las rutinas de interrupcion por lo gral deben ser breves, hacer lo que tengan que hacer (en este caso solo marcar una variable) y luego volver al hilo normal del programa.

Si se te complica la gestión de esto, revisa como has diseñado tus rutinas, seguramente si no puedes chequear el flag en el mail es tienes una mal estructura de tu software.  

Por supuesto la rutina de gestión de una interrupción no debe ser tan larga que produzca que se generen 2 interrupciones seguidas!!

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 migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: interrupcion!!! ayuda
« Respuesta #3 en: 02 de Marzo de 2006, 22:59:00 »
Pues si dices que el micro está muy ocupado haciendo su función main y todavía de paso tiene que hacer una subrutina de interrupción muy larga que no se puede incluir en el main solo me queda darte una opción... súbele los MHz a tu PIC. Sonrisa Gigante

Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
RE: interrupcion!!! ayuda
« Respuesta #4 en: 03 de Marzo de 2006, 10:57:00 »
Mi opinion es que una interrupcion debe ser lo mas rápida posible, y que todas las operaciones adicionales las hagas fuera....tampoco puedes usar un goto para salir cuando estas en una interrupcion ya que se va llenando tu pila y si usas un el 16f628 creo que solo tiene 8 niveles en la pila, asi que solo vas a poder hacer la interrupcion 8 veces....

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: interrupcion!!! ayuda
« Respuesta #5 en: 03 de Marzo de 2006, 22:01:00 »
Escrito originalmente por omibaya
Mi opinion es que una interrupcion debe ser lo mas rápida posible, y que todas las operaciones adicionales las hagas fuera....tampoco puedes usar un goto para salir cuando estas en una interrupcion ya que se va llenando tu pila y si usas un el 16f628 creo que solo tiene 8 niveles en la pila, asi que solo vas a poder hacer la interrupcion 8 veces....


Estas mezclando las cosas. Un goto no aumenta el nivel de pila,  ni tampoco te hace salir de la interrupcion, sencillamente porque no reactiva al GIE.  Eso se hace con el RETFIE cuya finalidad es esa....

Si quieres salir de la rutina de interrupcion sin habilitar el GIE, lo haces con RETURN pero no estaras reactivando el GIE.


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 vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: interrupcion!!! ayuda
« Respuesta #6 en: 04 de Marzo de 2006, 05:46:00 »
Como bien dice el amigo manuix, la instruccion "goto" en lenguaje c no hace salir de una interrupcion ni tampoco de una subrutina y ni de nada, la funcion "goto" es simplemente saltar a un sitio determinado del programa, si la instruccion esta dentro de una funcion de interrupcion, dicha instruccion "goto" no podra salirse de la funcion de interrupcion, es decir no la direcciones al main! los programadores en lenguaje de medio-alto nivel, y los de c, no recomiendan la instruccion goto )excepto en casos extremos) ya que genera programas no estructurados y a la larga son tediosos de volver a ver o revisar.

Para usar la instruccion goto para salir de la funcion d einterrupcion simplemente dirigela al final del programa.


Suerte!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: interrupcion!!! ayuda
« Respuesta #7 en: 04 de Marzo de 2006, 08:14:00 »
Escrito originalmente por vszener
Como bien dice el amigo manuix, la instruccion "goto" en lenguaje c no hace salir de una interrupcion ni tampoco de una subrutina y ni de nada, la funcion "goto" es simplemente saltar a un sitio determinado del programa, si la instruccion esta dentro de una funcion de interrupcion, dicha instruccion "goto" no podra salirse de la funcion de interrupcion, es decir no la direcciones al main!



De hecho es lo mismo para el C o para el Assembly... no te hace salir simplemente porque sigues con el RETFIE apagado.  El regreso al main.. o a donde sea que esté el software cuando se ejecute la interrupción.  

Una interrupción funnciona como un "call" donde el microcontrolador almacena la dirección de donde se produjo la llamada a la rutina de interrupcion.  Cuando uno "regresa" de la misma, entonces se el Program Counter retoma el valor que tenia antes + 1  en el caso de los pics 16 y + 2 en el caso de los pic18.


Escrito originalmente por vszener

los programadores en lenguaje de medio-alto nivel, y los de c, no recomiendan la instruccion goto )excepto en casos extremos) ya que genera programas no estructurados y a la larga son tediosos de volver a ver o revisar.



Asi es, un goto en C es una aberración.  Jamás me he visto obligado a usarlos a pesar de que hace casi 20 años que programo en C y Pascal.  El Pascal es muy muy similar al C en casi todo lo que tenga que ver con la estructuracion del código, solo que el pascal es menos permisivo que el C.  Es bueno para empezar el pascal para luego pasarse al C.


Escrito originalmente por vszener

Para usar la instruccion goto para salir de la funcion d einterrupcion simplemente dirigela al final del programa.

Suerte!!!Giño


Como????  Nooo, esto no funciona asi.  Si lo mandas al final del programa, la pila sigue cargadita como antes, el program counter hace un overflow y empezará de 0 pero de ninguna manera habrás descargado la pila.


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 vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: interrupcion!!! ayuda
« Respuesta #8 en: 04 de Marzo de 2006, 09:03:00 »
Jeje bueno un error sintactico ha sido el culpable de que el amigo maunix me corriga debidamente, asi que matizo o mejor dicho escribo de otra forma lo que queria decir!jeje cuando me refiero a que si no hay mas alternativas que usar un goto para poder salir de la funcion y que éste debes llevarlo "al final del programa",he aqui mi error de expresion jeje!, me refiero a que lo lleves al final de la funcion donde se encuentra el goto, claro esta que no lleves el goto al final del programa ya que de ser asi se acabaria.....gracias por la rectificacion maunix!

Por cierto, revisate el programa que hay instrucciones como break, return que te pueden servir mejor que el goto.


Suerte!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte


 

anything