Banner publicitario de PCBWay

Problema interrupcion con timer en 18f4550

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:
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:
 
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

  • ej_int_timer.rar
    35.9 KB · Visitas: 24
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
 
Atrás
Arriba