Como debo hacer una interrupción cada 15 minutos

#1
Hola gente;

Me ha salido una complicación, necesito realizar una interrupción cada 15 minutos para guardar datos en eeprom...

Utilizo lenguaje C, es posible realizarlo con el timer1 del pic o necesito un circuito externo tipo reloj/calendario??

Igual es una pregunta fácil para ustedes pero me cuesta ponerlo en marcha.

Me podrían poner un pequeño ejemplo?
Muchas gracias.
 
#2
Utilizo lenguaje C, es posible realizarlo con el timer1 del pic o necesito un circuito externo tipo reloj/calendario??
si si es posible, haz que desborde cada por ejemplo 100mS y vas incrementando una variable digamoso mseg=mseg+100, despues pones una condicion que al llegar a los 1000 incremente una variable Segundos y reinice la mseg y al ser 60segundos incremente una variable minutos y borre la segundos

para hacer un ejemplo debes poner que pic usaras porque no todos son iguales en los timers e interrupciones.

puedes tambien poner un cristal externo de 32.768 khz y utilizar la interrupcion externa y hacer casi el mismo procedimiento anterior.

o puedes utilizar el ds1307
 
Última edición:
#5
mseg=mseg+100;
if(mseg==1000){
seg=0;
seg++;
mseg==0;

if(seg==60){
min=0;
min++;
seg==0;
}
if(min==10){
ESCRIBIR EEPROM}

}


esto es lo que entendí, sé que probablemente no esté bien ...
pero voy encaminado?
 
#6
necesito realizar una interrupción cada 15 minutos para guardar datos en eeprom...

Utilizo lenguaje C, es posible realizarlo con el timer1 del pic o necesito un circuito externo tipo reloj/calendario??

Igual es una pregunta fácil para ustedes pero me cuesta ponerlo en marcha.

Me podrían poner un pequeño ejemplo?
Aquí tienes la solución a tu pregunta: Mira este ejemplo.
Luego, para contar 15 minutos debes crear una variable int16.
Por ejemplo int16 segundos = 0; y dentro de la rutina de interrupción la incrementas cada segundo...
segundos ++;
if (segundos == 900){ // 900 segundos = 15 minutos.
segundos = 0;
write_eeprom (address, value) // Escribes la memoria.
}

Suerte.
 
#7
Para mí la más fácil es un timer configurado a un cierto tiempo patrón y colgarte de ahí con una variable.

Eso si, lo ideal es que ese tiempo patrón salga de un cristal externo.
 
#9
Haber mas despacito, no comprendi bien. :confused:
Un manejo similar a lo que puso D@rkbytes, pero sin RTC.

La idea es por ej. que a partir de una buena base de tiempo (un cristal externo, por ej 12MHz), configurar un timer para que aproximadamente c/10mS salte una interrupción (si puede ser mayor el tiempo, mejor, ya que implica menos interrupciones para el uC). Luego en esa interrupción usar una variable global del tipo "unsigned long int" que pueda contar hasta 90k cuentas (15 min.)

Ej. de la estructura del código:

PHP:
typedef unsigned char		u8;
typedef unsigned long int		u32;

u8 flag_tiempo=0;
u32 contador=90000;

void timer_isr()
{
  contador--; //Esta instrucción necesita trabajar con una variable de 32 bits, llevará 4 o más ciclos según el uC,
  if(!contador)
     {
        contador=90000;
        flag_tiempo=1;  
     }
  
  //Limpiar la interrupción si es necesario
}

int main()
{
  ....//Inicialización, incluyendo el timer y la interrupción
  while(1)
    {
      if(flag_tiempo)
        {
          flag_tiempo=0;
          //Acción a tomar c/15 min
        }

       //El resto de las acciones, las cuales pueden incluir un sleep.
    }
}
 
#10
Ya te entendi, bueno eso es lo que habia entendido de D@rkbytes, solo que lo dijiste un tanto diferente y no entendí, lo malo de esto es que hay que estar revisando constantemente a "flag_tiempo", creo que por muchos optan por un rtc o algo que cuente de forma externa
 
#11
Ya te entendi, bueno eso es lo que habia entendido de D@rkbytes, solo que lo dijiste un tanto diferente y no entendí, lo malo de esto es que hay que estar revisando constantemente a "flag_tiempo", creo que por muchos optan por un rtc o algo que cuente de forma externa
Deberá "chequear" al igual que el RTC interno de D@rkbytes, la diferencia radica en que él implementa un cristal de 32,768kHz como oscilador secundario directo al timer (eso le va a dar menor error de cuenta, porque justo es 2^15) y tendrá solo 1 interrupción por segundo.

Salvo que el uC este saturado en tareas, por lo menos yo no veo muy práctico utilizar un RTC externo solo para saber cuando pasaron los 15 minutos.

Por otro lado, si la acción a tomar c/15 minutos es relativamente corta, se podría implementar directamente desde la rutina de interrupción, evitando el uso del "flag_tiempo" en la rutina principal.
 
Arriba