Autor Tema: Funcion de interrupcion (inconveniente)  (Leído 1177 veces)

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

Desconectado Ranculche

  • PIC12
  • **
  • Mensajes: 74
Funcion de interrupcion (inconveniente)
« en: 15 de Agosto de 2011, 09:53:34 »
Hola a todos, les escribo por un pequeño problemita que tengo en un programa en C18 para el PIC18f4620. El incoveniente que tengo es que a veces, solo a veces, el programa me queda clavado en la funcion de interrupcion del TIMER2 que elabore para usarlo de reloj ( no retorna al programa). El programa basicamente mide los tiempos de las luces de un semaforo y las envia por RS232. Lo que me llama la atencion es que a veces funcione de maravilla y otras, no. Esto lo veo depurando, y cuando lo reseteo se corrige o no. Lo que temo es que sea un problema es la pila, o algo por el estilo, ya que uso bastante variables y talves la este afectando. Aqui dejo el codigo para el que lo quiera ver y me de un consejo con el tema de las declaraciones o sobre el error que estoy comentiendo. Gracias a todos.

Saludos.-

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Funcion de interrupcion (inconveniente)
« Respuesta #1 en: 15 de Agosto de 2011, 10:43:23 »
Prueba esta modificación:

Código: C
  1. //interrupcion del TIMER2
  2. #pragma code prioridad_alta = 0x08     
  3. void interrupcion_alta(void)
  4. {
  5.         _asm
  6.                 btfsc   PIR1,1,0         //Chequeo si la interrupción vino del timer2
  7.                 goto interrupcion
  8.         _endasm
  9. }
  10. #pragma code
  11.  
  12.  
  13.  
  14.  
  15.  
  16. //Funcion de la interrupcion del TIMER2
  17. #pragma interrupt interrupcion
  18. void interrupcion(void)
  19. {      
  20.         miliseg = miliseg + 8;
  21.         if(miliseg>=1000){
  22.                  seg++;
  23.                  miliseg=0;
  24.         }
  25.  
  26.  _asm
  27.         bcf             PIR1,1,0                //Limpiamos el flag de la interrupc (el primer "1" indica el bit a limpiar, y el segundo indica que es un comando, si este ultimo estuviese en uno buscaría el registro en la RAM)
  28.         _endasm
  29.  
  30. }

Los cambios han sido básicamente los siguientes:
  • Ejecutar el código de la IT solamente si la fuente de IT es la del TIMER2
  • Dejar que el compilador cambie de banco, y administre directamente el acceso a las variables.
  • Desenmascar IT al finalizar.

Puede que tengas que ver como es que el compilador que utilizas maneja el asunto de las IT, tienes que ver que los registros de la pila que entran, también salgan y que las banderas queden en los valores correctos para que la IT no entre nuevamente una vez servida o para que no queden inhabilitadas para siempre.

Saludos
Reinier
PD: Puede que no te funcione a la primera, pero por allí puede andar la solución