Autor Tema: Problema para debuggear interrupciones  (Leído 1709 veces)

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

Desconectado mlen

  • PIC10
  • *
  • Mensajes: 10
Problema para debuggear interrupciones
« en: 28 de Abril de 2013, 20:27:20 »
Hola, tengo un problema para debugear en el mplab. Tengo un proyecto programado en c con el compilador ccs, este tiene que usar las interrupciones del timer 1, el problema es que al debuggear no entra a la función de interrupción del timer, siempre se queda en la función principal (loop), y si quiero poner un breakpoint en la función de interrupción me tira un error.
¿Alguna idea para debuggear y que pueda entrar a la función de interrupción?

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema para debuggear interrupciones
« Respuesta #1 en: 30 de Abril de 2013, 20:58:27 »
podrias poner tu código para ayudarte
"Nada es imposible, no si puedes imaginarlo"

Desconectado mlen

  • PIC10
  • *
  • Mensajes: 10
Re: Problema para debuggear interrupciones
« Respuesta #2 en: 02 de Mayo de 2013, 20:57:56 »
pongo solo el main y la interrupcion del timer si necesitas algo mas pedimelo


#include <libreria.h>
#fuses XT,NOWDT, NOPROTECT
#use delay(clock =20000000)
#use standard_io(A)   //uso standard_io
#use standard_io(B)   //uso standard_io
#use standard_io(C)   //uso standard_io
#use standard_io(D)   //uso standard_io
#use standard_io(E)   //uso standard_io

void main(void){

   //--------------------------------------------------------------------------------------
   // Variables Locales
   //--------------------------------------------------------------------------------------
   unsigned char    Tecla;      // Variable local utilizada para la lectura de las teclas
   
   port_b_pullups(TRUE);                     //inicio
   OUTPUT_C(0);
   OUTPUT_HIGH(PIN_E0);
   OUTPUT_LOW(PIN_E0);
   Leds = 0;
   est = 0;
   flag = 0;
   Estado = 0;
   est_juego = 0;
   turno = 0;
   mostrar = 0;
   cant=1; //1 son 2 jugadores, 0 un solo jugador, por defecto empiezan dos jugadores
   record = 0;                  //inicio a 0 los buffer de puntajes
   jug1 = 0;
   jug2 = 0;   
   puntos = 0;
   cont = 0;


   setup_timer_1 (T1_INTERNAL|T1_DIV_BY_8);
   set_timer1 (0xff29);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(global);                  //fin inicio
   
   TIMERS_Inicializar();   


   while(true){

      TIMERS_Verificar_Fin(); // Chequeo el vencimiento de los temporizadores
      Tecla = Get_Key();       // Chequeo si hubo alguna tecla presionada

      switch(Estado){

         case 0:         //estado standby
         
            if( Tecla == 1 ){
               Estado=1;flag=0;Leds = 0; seleccion  = 0; solto = 0;
               texto('J', 3);texto('U', 4);texto('G', 5);texto(55, 6);texto(55, 7);texto(57,8);      //no entiendo porque no anda mostrardis(2,1);
            }
            else if(flag==0){
               flag=1;
               MostrarDis(record,2); LimpiarPantalla(); texto('A', 3);texto('L', 4);texto('E', 5);texto('L', 6);texto('I', 7);texto(91, 8);
               Efectos(T0);           
            }   
            break;

         case 1:         //estado  menu
            if(flag==0){
               flag=1;TIMERS_Encender(2,4);
            }             
            switch(seleccion){
                case 0:
                  if(Tecla == 1){                   //va a seleccionar nivel de juego
                     TIMERS_Detener(2); seleccion = 1; flag = 0;tecla = 0;
                     /*LimpiarPantalla();*/ texto('F',3);texto('A',4);texto('C',5);texto('I',6);texto('L',7);texto(91,8);
                  }
                  if( Tecla == 2){
                     if(cant == 1){
                        cant=0;
                        Leds = 2;
                        //MostrarDis(1,1);
                        texto('J', 3);
                        texto('U', 4);
                        texto('G', 5);  //cambia a 1 JUG                   
                        texto(55, 6);
                        texto(55, 7);
                        texto(56, 8);
                     }
                     else {                       
                        cant = 1 ;
                        Leds = 4;
                        texto('J', 3); //CAMBIA  A 2 JUG
                        texto('U', 4);
                        texto('G', 5);                 
                        texto(55, 6);
                        texto(55, 7);
                        texto(57, 8);

                     }
                  }
                   break;
                   
                case 1:   //nivel =0 facil    -   nivel = 1 Dificil
                   if( Tecla == 1 ){ TIMERS_Detener(2); Estado = 2; flag = 0; } //va a estado juego
                  if( Tecla == 2 ){
                     if(nivel == 0){
                        nivel = 1; LimpiarPantalla();texto('D',3);texto('I',4);texto('F',5);
                     }
                     else {
                        nivel = 0 ;LimpiarPantalla();texto('F',3);texto('A',4);texto('C',5);texto('I',6);texto('L',7);                   
                     }
                  }
                   break;                   
           
            }             
            break;
         
         case 2:         //Estado:  Juego
            juego();
            break;
   
         default:
            break;
      }   
   } 
}





#int_TIMER1      //Interrupcion timer1
void Timer_Tick(void){
   disable_interrupts(INT_TIMER1);
   set_timer1 (0xff59);
   enable_interrupts(INT_TIMER1);


   
   //---------------------------------------------------------------------------------
   // Aca tengo que poner todas las funciones que quiero que funcionen a 1 milisegundos
   //---------------------------------------------------------------------------------
   barrido_leds();
   Barrido_Display();
   Board();
   TIMERS_Descuento(4);
   TIMERS_Descuento(3);
   //---------------------------------------------------------------------------------


   dec--;
   if(dec==0)                     // Base de tiempo de CENTESIMAS
   {
      dec = DECIMAS;
     
      //---------------------------------------------------------------------------------
      // Aca tengo que poner todas las funciones que quiero que funcionen a 1 centesima
      //---------------------------------------------------------------------------------
 
      TIMERS_Descuento(7);
      TIMERS_Descuento(1);
      //---------------------------------------------------------------------------------

      seg--;
      if(!seg)   // Base de tiempo de SEGUNDOS
      {
         seg = SEGUNDOS;
         //---------------------------------------------------------------------------------
         // Aca tengo que poner todas las funciones que quiero que funcionen a 1 segundos
         //---------------------------------------------------------------------------------
         TIMERS_Descuento(2);
         TIMERS_Descuento(5);
         TIMERS_Descuento(6);
         TIMERS_Descuento(7);
         //---------------------------------------------------------------------------------

         min--;
         
         if(!min)                     // Base de tiempo de MINUTOS
         {
            min = MINUTOS;
         
            //---------------------------------------------------------------------------------
            // Aca tengo que poner todas las funciones que quiero que funcionen a 1 centesima
            //---------------------------------------------------------------------------------
            //---------------------------------------------------------------------------------

            hor--;

            if(!hor)                      // Base de tiempo de HORAS
            {
               hor = HORAS;

               //---------------------------------------------------------------------------------
               // Aca tengo que poner todas las funciones que quiero que funcionen a 1 centesima
               //---------------------------------------------------------------------------------
               //---------------------------------------------------------------------------------
            }
         }
      }
   }

}

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema para debuggear interrupciones
« Respuesta #3 en: 02 de Mayo de 2013, 21:04:37 »
las interrupciones se desactivan automáticamente cuando entras a la interrupción, también, no es recomendable llamar a funciones dentro de una interrupcion.
lo que debe hacer es activar una bandera dentro de tu interrupción y en el main mandar a llamar a la función que deseas cuando la bandera este activa
"Nada es imposible, no si puedes imaginarlo"

Desconectado mlen

  • PIC10
  • *
  • Mensajes: 10
Re: Problema para debuggear interrupciones
« Respuesta #4 en: 02 de Mayo de 2013, 21:11:57 »
Ok, entonces no se puede poner breakpoints en interrupciones ?

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema para debuggear interrupciones
« Respuesta #5 en: 02 de Mayo de 2013, 21:21:48 »
si deberían de funcionarte las interrupciones dentro de tu interrupción, lo que te comento es para optimizar tu código, pero no deberías tener problema con tus breakpoints.

podrías checar si el mplab si esta compilando con el ccs, o intenta debugguear en proteus
"Nada es imposible, no si puedes imaginarlo"


 

anything