Autor Tema: Problema interrupcion timer 0 y subrutinas  (Leído 3669 veces)

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

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Problema interrupcion timer 0 y subrutinas
« en: 03 de Agosto de 2010, 17:36:23 »
Hola a ver si os puedo plantear mi problema de una forma un poco esquematica. El pic que utilizo es el 16f88

Para empezar en mi programa tengo dos fuentes de interrupcion la del timer 0 y la externa.

En mi programa se produce esta secuencia:

se produce la inter externa -> rutina de atencion a las interrupciones - > deshabilito la inter del timer 0 (T0IE==0, incluso tambien GIE=0, para que el timer 0 no me moleste) -> llamo a una subrutina (el tiempo que dura esta subrutina es de 1 segundo), pero esta subrutina es interrumpida ya que como el timer 0 sigue funcionando activa su flag de desbordamiento y me vuelve a la rutina de atencion a las interrupciones interrumpiedome esa subrutina con lo que el programa empieza a hacer cosas raras.

No entiendo como despues de desactivar las interrupciones el timer 0 sigue interrumpiendo a no ser que sea porque desde la rutina de la interrupciones llamo a esa subrutina que dura 1 segundo y entonces ya no tenga validez lo del T0IE= y GIE=0.


« Última modificación: 03 de Agosto de 2010, 17:54:33 por yipi »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema interrupcion timer 0 y subrutinas
« Respuesta #1 en: 03 de Agosto de 2010, 17:41:40 »
Las interrupciones están para ser atendidas y salir rápidamente, se puede setear una bandera (variable) y tratarla adecuadamente en el bucle principal.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema interrupcion timer 0 y subrutinas
« Respuesta #2 en: 03 de Agosto de 2010, 18:00:18 »
Suki no se si has leido el post completo es que me equivoque y lo he tenido que modificar
Lo que tu dices ya lo habia pensado pero entonces lo que tengo que hacer es deshabilitar las interrupciones restantes mientras atiendo una en particular en el bucle principal, y asi con todas.

Otra solucion seria utilizar el timer1 ya que este lo puedo parar y arrancar cuando necesite y entonces no se va a desbordar mientras se esten ejecutando otras cosas..

Gracias.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Problema interrupcion timer 0 y subrutinas
« Respuesta #3 en: 03 de Agosto de 2010, 18:28:16 »
 :wink: regla básica y principal que siempre tengo en cuenta cuando trabajo con interrupciones.

Por lo que dices tu programa no esta orientado a multitarea, imagino que usas la Interrupcion externa para detectar que se ha presionado un pulsador, pero entras en una subrutina hasta presionar otro pulsador que es el que confirma la entrada, como si se tratara del ENTER en el teclado.

Lo que puedes hacer es armarte una matriz dependiendo de la cantidad de pulsadores que tienes y poner como salidas de la matriz y entradas al PIC los pines RB4 al RB7 que los puedes usar como interrupcion en cambio de nivel. De esta forma detectas cuando se presiona una tecla o pulsador, seteas algun flag especial para que tu programa en el bucle principal sepa que se ha presionado ese pulsador y haga lo necesario, así como te comentaba Suky. De esta forma no dejas al pic atascado en una subrutina.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema interrupcion timer 0 y subrutinas
« Respuesta #4 en: 03 de Agosto de 2010, 19:21:08 »
Ante todo gracias.

Es una cosa parecida a lo que dices willynovi

La interrupcion externa me hace entrar el programa en una subrutina mediante la cual defino dos valores de 3 cifras con dos pulsadores leidos mediante consulta y que se van representando y formando en el lcd, un pulsador mueve los digitos del cero al nueve y otro se va moviendo desde las centenas a las decenas y unidades hasta conformar los dos numeros (eso ya lo tengo probado y funciona perfectamente), una vez salgo de esa subrutina y tras unas operaciones entro en otra subrutina que me graba los dos valores en la eeprom(esta subrutina tambien esta probada y funciona perfectamente) y normalmente es en esta subrutina cuando el timer 0 se desborda y me devuelve el programa al vector de interrupcion por lo que empieza a hacer cosas raras.

Lo que no entiendo es que si despues de la interrupcion externa deshabilito las interrupciones como el timer 0 me lleva el programa al vector de interrupcion en medio de la subrutina de grabacion en la eeprom

 

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Problema interrupcion timer 0 y subrutinas
« Respuesta #5 en: 03 de Agosto de 2010, 22:28:16 »
a ver si entiendo, estas llamando a una subrutina desde la interrupción?
Si es así, es ahi donde tienes el problema, en la atencion a la interrupcion, sea cual sea, tienes que ejecutar lo menos posible y volver a salir.

Luego en el bucle principal haces todo lo otro, escribir la memoria, seleccionar los digitos, lo que sea.

Mientras leo tu programa me imagino el diagrama de flujo, pero fijate si puedes hacerlo tu dibujado, aunque sea en una hoja con papel y veras que te ayudará mucho. Es una herramienta importante para esquematizar el flujo del programa y poder descifrar problemas como el que se te presenta.

Saludos, Willy
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema interrupcion timer 0 y subrutinas
« Respuesta #6 en: 04 de Agosto de 2010, 08:43:53 »
Desde la interrupcion llamo a una subrutina efectivamente, osea que lo que tengo que hacer es activar unos flags o unas variables para cada una de las dos fuentes de interrupcion que tengo, luego salir de la interrupcion y en el bucle principal consultar esos flags o variables y ejecutar las subrutina que sea.

Pero aun asi tengo que desactivar las interrupciones mientras se ejecutan las subrutinas en el bucle principal porque en cuanto salga de la rutina de la interrupcion el GIE se activa automaticamente y ya se pueden producir interrupciones de nuevo no es asi?

Ah y  si  que utilizo diagramas de flujo son de gran ayuda a la hora de escribir posteriormente el codigo y tambien como dices para encontrar fallos.

Gracias de nuevo

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Problema interrupcion timer 0 y subrutinas
« Respuesta #7 en: 04 de Agosto de 2010, 11:59:27 »
Desde la interrupcion llamo a una subrutina efectivamente, osea que lo que tengo que hacer es activar unos flags o unas variables para cada una de las dos fuentes de interrupcion que tengo, luego salir de la interrupcion y en el bucle principal consultar esos flags o variables y ejecutar las subrutina que sea.
No lo podrías haber dicho mejor  ;-)

Pero aun asi tengo que desactivar las interrupciones mientras se ejecutan las subrutinas en el bucle principal porque en cuanto salga de la rutina de la interrupcion el GIE se activa automaticamente y ya se pueden producir interrupciones de nuevo no es asi?
Eso dependerá de que en momento quieres recibir las interrupciones y cuales son las que quieres atender.
Sino puedes usar ese mismo flag, que hasta no terminar con lo que estas haciendo en el bucle principal no lo reseteas.
Luego en la rutina de atencion a interrupciones, cuando entras ves el estado de los flag y si aun estan seteados sales y no haces nada.

Ah y  si  que utilizo diagramas de flujo son de gran ayuda a la hora de escribir posteriormente el codigo y tambien como dices para encontrar fallos.
Claro, fundamental herramienta, aunque yo te la recomiendo no soy de usarla mucho, pero de vago nomas  :D

Saludos, Willy
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema interrupcion timer 0 y subrutinas
« Respuesta #8 en: 04 de Agosto de 2010, 13:01:24 »
Muchas gracias me pongo a ello.

Saludos.


 

anything