TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: zagoaristides en 12 de Diciembre de 2011, 22:44:03

Título: Problema con interrupcion Timer 1, no salta cuando ingresa a una funcion
Publicado por: zagoaristides en 12 de Diciembre de 2011, 22:44:03
Es así, tengo este bloque de funcion

Código: [Seleccionar]
   if (flag_autoconfigurando == FALSE && flag_motores_frenados == TRUE){
      var_decrementa_delay_en_slide_timer_1--;
     
      if (var_decrementa_delay_en_slide_timer_1 == 0){
      var++;
         cambio_de_slide();
         var_decrementa_delay_en_slide_timer_1 = delay_en_slide_timer_1;
      }
   }

que me lleva a la funcion

Código: [Seleccionar]
void cambio_de_slide(void)
{
////controlo primero el numero de slide, si es el último, cambio el sentido
////de giro y reseteo la cuenta. Luego acelero

   if (slide_actual == num_de_slides){
     
      sentido_de_giro = !sentido_de_giro;
     
      slide_actual = 0;
   }
   var_decrementa_arranque = 50; //dependiente de Timer 1   
   acelerar (sentido_de_giro);
   
}

y finalmente a este

Código: [Seleccionar]
void acelerar (int sentido)
{
int1 flag_hecho = 0;

   //var_decrementa_arranque = 50; //dependiente de Timer 1
   flag_motores_frenados = FALSE;
   
   enable_interrupts(INT_TIMER1);
   set_timer1(0);
   
   while(var_decrementa_arranque > 1){
      if (sentido == sentido_abajo && flag_hecho == 0){
         marcha (motor_Sup, sentido, veloc_retencion); //ya que le alcanza para girar sumado el peso de la lona
         marcha (motor_Inf, sentido, veloc_baja);
         flag_hecho = 1;
      }
     
      if (sentido == sentido_arriba && flag_hecho == 0){
         marcha (motor_Sup, sentido, veloc_baja); //ya que le alcanza para girar sumado el peso de la lona
         marcha (motor_Inf, sentido, veloc_baja);
         flag_hecho = 1;
      }   
   }


      if (sentido == sentido_abajo){
         marcha (motor_Sup, sentido, veloc_baja); //ya que le alcanza para girar sumado el peso de la lona
         marcha (motor_Inf, sentido, veloc_media);
      }
     
      if (sentido == sentido_arriba){
         marcha (motor_Sup, sentido, veloc_media); //ya que le alcanza para girar sumado el peso de la lona
         marcha (motor_Inf, sentido, veloc_baja);
      }

}

en esta última funcion se queda dando vueltas en el while y nunca salta la Interrupcion del timer 1. Simulando en Proteus me fijo por las dudas todas las banderas y supuestamente están bien. Inclusive probé (se ve en este ultimo código borrar el flag del interrupt pero nada.

Código: [Seleccionar]
void acelerar (int sentido)
{
int1 flag_hecho = 0;

   //var_decrementa_arranque = 50; //dependiente de Timer 1
   flag_motores_frenados = FALSE;
   
   set_timer1(0);
   clear_interrupt(int_timer1);
   
   while(var_decrementa_arranque > 1){
      if (sentido == sentido_abajo && flag_hecho == 0){
         marcha (motor_Sup, sentido, veloc_retencion); //ya que le alcanza para girar sumado el peso de la lona
         marcha (motor_Inf, sentido, veloc_baja);
         flag_hecho = 1;
      }
     
      if (sentido == sentido_arriba && flag_hecho == 0){
         marcha (motor_Sup, sentido, veloc_baja); //ya que le alcanza para girar sumado el peso de la lona
         marcha (motor_Inf, sentido, veloc_baja);
         flag_hecho = 1;
      }   
   }


      if (sentido == sentido_abajo){
         marcha (motor_Sup, sentido, veloc_baja); //ya que le alcanza para girar sumado el peso de la lona
         marcha (motor_Inf, sentido, veloc_media);
      }
     
      if (sentido == sentido_arriba){
         marcha (motor_Sup, sentido, veloc_media); //ya que le alcanza para girar sumado el peso de la lona
         marcha (motor_Inf, sentido, veloc_baja);
      }

}

alguna ayudita... sigo intentando

Grazie mille!

Título: Re: Problema con interrupcion Timer 1, no salta cuando ingresa a una funcion
Publicado por: KALLITOS en 12 de Diciembre de 2011, 22:51:32
Hola, seteaste bien el timer1??

coloca el codigo completo para poder ver mejor en donde podria estar el error.

saludos
Título: Re: Problema con interrupcion Timer 1, no salta cuando ingresa a una funcion
Publicado por: zagoaristides en 12 de Diciembre de 2011, 22:57:26
Hola, seteaste bien el timer1??

coloca el codigo completo para poder ver mejor en donde podria estar el error.

saludos

Sisi, fijate que me faltó poner pero la funcion cambio_de_slide(); se llama desde dentro de Timer 1 (o sea, salta). Será ese el problema?
Título: Re: Problema con interrupcion Timer 1, no salta cuando ingresa a una funcion
Publicado por: zagoaristides en 12 de Diciembre de 2011, 23:08:06
Hola, seteaste bien el timer1??

coloca el codigo completo para poder ver mejor en donde podria estar el error.

saludos

Sisi, fijate que me faltó poner pero la funcion cambio_de_slide(); se llama desde dentro de Timer 1 (o sea, salta). Será ese el problema?

Es así:

Código: [Seleccionar]
#int_TIMER1
void  TIMER1_isr(void)
{
var_decrementa_arranque--;

   if (flag_autoconfigurando == FALSE && flag_motores_frenados == TRUE){
      var_decrementa_delay_en_slide_timer_1--;
     
      if (var_decrementa_delay_en_slide_timer_1 == 0){
         var++;
         cambio_de_slide();
         var_decrementa_delay_en_slide_timer_1 = delay_en_slide_timer_1;
      }
   }
 
   if (flag_autoconfigurando == FALSE && flag_motores_frenados == FALSE){
   
      if (OPTO1 == TRUE)
         desacelerar (sentido_de_giro);
      if (FC1 == TRUE)
         frenar (sentido_de_giro);   
   
   }

que estaría más completo de donde se llama al "camino sin retorno"...
Título: Re: Problema con interrupcion Timer 1, no salta cuando ingresa a una funcion
Publicado por: KALLITOS en 12 de Diciembre de 2011, 23:51:32
Utiliza la interrupcion lo mas eficiente que puedas, para eso usa solo banderas que indiquen que ha ocurrido una interrupcion, no llames a funciones dentro de la interrupcion, en tu caso estas llamado una funcion que llama a otra y esta llama a otra.

Cuando no estes seguro de si entra o no a una interrupcion usa un led que indique, si la interrupcion es muy rapida igual usa un led y mira el pulso en el osciloscopio en proteus

saludos
Título: Re: Problema con interrupcion Timer 1, no salta cuando ingresa a una funcion
Publicado por: zagoaristides en 13 de Diciembre de 2011, 10:06:50
Utiliza la interrupcion lo mas eficiente que puedas, para eso usa solo banderas que indiquen que ha ocurrido una interrupcion, no llames a funciones dentro de la interrupcion, en tu caso estas llamado una funcion que llama a otra y esta llama a otra.

Cuando no estes seguro de si entra o no a una interrupcion usa un led que indique, si la interrupcion es muy rapida igual usa un led y mira el pulso en el osciloscopio en proteus

saludos

Solucionado, era así. Creo que esto que quise hacer es una especie de recursión? Bueno, en todo caso, no hay que hacer procesos largos en una interrupción, eso lo sabía pero... en el frenesí de la programación y en un programa tan largo (voy unas 3000 líneas) era de suponer equivocarse no?

Un abrazo a todos!
Título: Re: Problema con interrupcion Timer 1, no salta cuando ingresa a una funcion
Publicado por: KALLITOS en 13 de Diciembre de 2011, 11:09:44
Que bueno que lo soluciones  :).

saludos