Problema interrupcion con timer en 18f4550

#1
Hola buenas, tengo el siguiente problema al realizar una interrupcion por timer con el pic 18f4550 aver si alguien puede ayudarme a encontrar el problema. El problema es que el timer interrumpe un nº muy bajo de veces (17 veces en mi caso) y se queda sin interrumpir mas,no consigue llegar al final del contador (0xff). el esquema que tengo es el siguiente:

Código:
   int32 const num_int=0xff;
   int32 tiempo=0;
   int8 modo_sleep;

#int_timer1
void diezsegundos()
   {
      if (tiempo>num_int)
         {
            modo_sleep=false;               
            tiempo=0;
         }
      else
         {
            modo_sleep=true;
            tiempo++;
         }
      clear_interrupt(int_timer1);
   }



void main(void) 
   setup_timer_1(t1_internal | t1_div_by_8);
   set_timer1(0);
   enable_interrupts(int_timer1);
   enable_interrupts(GLOBAL);  

while (TRUE)
   {
   while (modo_sleep)
      {
         sleep();
      }

   // RESTO DE PROGRAMA

   

   }
Gracias de antemano.

Bueno ya he dado con la solución. En modo sleep solo se le puede "despertar" con un reloj externo.
 
Última edición:
#2
hola, estoy comenzando a utilizar c para programar mis pics. Resulta que configuro interrupcion por timers, pero nunca interrumpen. ya intente con timer0, 1 y 2 pero el resultado es el mismo..
este es el código que tengo

Código:
void  TIMER2_isr(void) 
{
 output_low(PIN_B0);
      delay_ms(500);
      output_high(PIN_B0);
      delay_ms(500);
      set_TIMER2(0);
}



void main()
{
   
   setup_timer_2(T2_DIV_BY_16,255,16);      //16.3 ms overflow, 262 ms interrupt

   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);
set_TIMER2(0);
   while(true)
   {
  
   }

}

aparte cuando uso delay_ms() hace un delay de 2 segundos cuando le pongo 500 ms :/
todo es muy extraño, creo que me querdaré en ensamblador
ayuda por favor :cry:
 
#3
Hola, @cdavid120 no desesperes, te comento te falto una directiva que define la rutina de interrupcion.
Por otro lado, que tu interrupcion se dispare en ms y dentro de la interrupcion esperes 500ms x 2, de fucionar, funciona pero si tu intencion fue cambiar de estado el bit 0 de portb cada medio segundo podria ser tambien de este otro modo.
PD. El ASM es lo mejor, asi se tiene domino de "todo" pero uso el C por que me da flojera hacer algunas cosas.
 

Adjuntos

#4
gracias Saint_ por resonder, has solucionado mi problema :D

creo que usaré C sólo para hacer algunas cosas que si son algo tediosas en ASM, porque ya intenté otras cosas en C y también tienen sus problemas
 
Arriba