Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

23/10/2013 #1


Como debo hacer una interrupción cada 15 minutos
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.
23/10/2013 #2

Avatar de LaElectronicaMeOdia

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
23/10/2013 #3


si, perdón , el pic que voy a utilizar va a ser el 18f4550.

llevo un buen rato con ello y todavía no me salió...
23/10/2013 #4

Avatar de Scooter

Con un RTC se pueden poner alarmas tipo "despertador"
23/10/2013 #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?
23/10/2013 #6
Moderador

Avatar de D@rkbytes

ajrob dijo: Ver Mensaje
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.
24/10/2013 #7

Avatar de cosmefulanito04

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.
24/10/2013 #8

Avatar de Ajna

cosmefulanito04 dijo: Ver Mensaje
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.
Haber mas despacito, no comprendi bien.
25/10/2013 #9

Avatar de cosmefulanito04

Ajna dijo: Ver Mensaje
Haber mas despacito, no comprendi bien.
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:

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.
    
}

25/10/2013 #10

Avatar de Ajna

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
25/10/2013 #11

Avatar de cosmefulanito04

Ajna dijo: Ver Mensaje
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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.