TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pajaro en 28 de Agosto de 2009, 14:36:07
-
Hola amigos
Tengo un reloj con un chip DS1307, me he propuesto con este reloj calendario,
ponerle alarmas o jecucion de eventos trascurrido un determinado tiempo o cuando el reloj llegue a una determinada hora de un dia.
1.-Como cuenta atras, en 10 minutos enciende un led.
2.- si la son las 14.00 del 30/08/2009 activa este proceso.
3.- No quiero que el pic este pendiente de estos procesos en todo momento,
En un perimer momento pense hacerlo con lo que lei del post del amigo REdpic.
http://www.todopic.com.ar/foros/index.php?topic=24801.msg202369#msg202369
tambien pense que deberia ser preciso y le eche un ojo a este otro post
http://www.todopic.com.ar/foros/index.php?topic=4840.0
más concretamente este mensaje del amigo Nocturno:
http://www.todopic.com.ar/foros/index.php?topic=4840.msg36679#msg36679
Empece probando el programita de redpic , cambio el encedido de un rele por el de un led, lo intente simular con protesu, pero me quede ahi... no se me enciende el led nunca, intente cambiale el tiempo, pero nada , pueden ayudarme.
Un saludo.
-
Si vas a usar el DS1307 no te preocupes por generar otro temporizador interno exacto, usa la señal generada por el ds1307 (SQW/OUT) para controlar los eventos.
Saludos!
-
Efectivamente, tal como indica Suky, el DS1307 tiene esa salida (SQW/OUT) que genera una salida programable de 1Hz, 4kHz, 8kHz ó 32kHz
-
Hola amigos
Pero si por ejemplo quiero hacer una lectura del DS1307 a cada segundo, configuro esta salida a 1hz.
Pero... como configuro para hacer el caso 1.- y el caso 2.- anteriormente nombrado.
En algunos post he leido que con esa señal activada, la pila dura menos que un chupachus en la puerta de un colegio.
Alguna idea.
Un saludo.
-
Hola,
A mi se me ocurre que debes comparar el string completo, es decir, guardas los datos de hora, minutos, fecha, mes, año en un string y lo comparas con el que tu programas. Usa la funcion strcmp(string1,string2).
Para la cuenta de minutos, pues, creo que al momento de activar la función, deberias leer el valor de los minutos y sumarle los diez de mas.
Saludos
-
hola amigo
Este proceso de comparacion lo tendria que hacer siempre de la misma forma que se lee la hora del ds1307,
se compara la hora actual.
alguna otra forma que se le les ocurra.
Un saludo
-
Hola.
La lectura del reloj debes hacerla siempre, ya que es tu base de tiempo. La ventaja es que el mismo reloj te da un pulso que te avisa por un evento externo que ha pasado un segundo (o menos).
Lo mejor es aprovechar ese evento para que cada segundo hagas tu comparación, si quieres mas tiempo, por ejemplo: minutos, pues simplemente asigna un contador a 60 y mediante un if habilitas la rutina de comparación.
Saludos
-
La resolución de la temporización va a ser de un segundo, así que comparar string no va ser ningún problema, aparte ser muy sencillo.
Saludos!
-
Desde luego lo mejor para un reloj de tiempo real es el ds1307, ya que se puede alimentar por la patilla 3 y 4 una bateria que sustenta el horario(fecha y hora) en el que se encuentra el octopodo, y ademas restrasa o adelanta horas automaticamente asi como los dias bisiestos....
yo cree un controlador de acuario al cual le añadi un ds1307 y os dire que es lo mejor, el en cuanto a lo de las alarmas.. pues bien facil
if((horas==horas_alarma)&(minutos==min_alarma)&(segundos=seg_alarma)).... cosa facil
pero ojo, si usas alguna interrupcion, antes de la lectura del ds1307 deberas de deshabilitarla... ya que la comunicacion por I2C no puede ser pospuesta por una interrupcion
-
Hola amigos..
entonces hay un pequeño problema con el I2C y las interrupciones?
Me estais asustando.
La idea de hacer comparacion para el tema de las alarmas, habia pensado hacerla por funcion,
en principio queria poderle predefinir de 10 a 20 alarmas, pero el tema esta un poco . .. puntiagudo..
si suena y tengo que parar la alarma tendra que pulsar una tecla para parar el evento,
y eso es por interrupcion, verdad?
un saludo
-
si y no, solo durante la lectura del ds1307 deberas desabilitarlas, pero acto segui do la puedes volver a activar
ejemplo.... aqui tienes una funcion de lectura del ds1307...
void lectura()
{
disable_interrupts(global); //se desabilitan
i2c_start();
i2c_write(0xd0);
i2c_write(0x00);
i2c_stop();
i2c_start();
i2c_write(0xd1);
segundos = i2c_read();
minutos = i2c_read();
horas = i2c_read();
dia_semana=i2c_read();
dia = i2c_read();
mes = i2c_read();
anio = i2c_read(0);
i2c_stop();
enable_interrupts(global); //se vuelven a habilitar
}
es muy corto el tiempo en el que estan dehabilitadas asi que no tendras problemas