Autor Tema: Reloj-calendario-termometro DS1307  (Leído 10249 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Reloj-calendario-termometro DS1307
« en: 23 de Mayo de 2010, 13:09:52 »
Hola! aqui estoy de nuevo dando el coñazo!

Llevo un par de semanas que entre rato y rato de estudio, hecho un rato con este cachibache que me gustaria montarme...

Se trata de un (de momento) Reloj-calendario con un DS1307; y mas adelante me gustaria hacer que mostrara la temperatura, y almacenara unos valores maximos y minimos, y la fecha y hora de esos valores maximos y minimos (pero el tema de la temperatura para cuando deje terminado el tema del DS1307.

El objetivo no es otro que seguir aprendiendo... pero ahora me he atascado un poco.

Por ahora, muestro fecha y hora en lcd, y pulsando el pulsador "Conf" puedo acceder a la "configuracion del DS1307" para cambiar hora y fecha; y todo parece ir bien, se van incrementando las variables (hora, minutos, dia, mes...) hasta unos valores maximos (24 horas, 12 meses....) para los que se ponen en su valor minimo, hasta ahi todo bien.

El problema está en que cuando acabo de "configurar" todas las variables, le ordeno al DS1307 que se guarde todos esos valores, y lo hace, pero se queda bloqueado, deja de contar.

Lo culego todo a ver si me podeis hechar una manilla. El programa aun está algo "desordenado", y tengo que simplificar varias cosas, asi que se admiten todo tipo de sujerencias!

Saludos y gracias!


PD: parece que algo no marcha del todo bien al "configurar" el dia de la semana


Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Re: Reloj-calendario-termometro DS1307
« Respuesta #1 en: 24 de Mayo de 2010, 06:50:29 »
Bueno... yo creo que el problema esta en estas lineas:

Código: [Seleccionar]
   ds1307_set_date_time(day,month,year,dow,hour,min,sec); //configuramos DS1307
   enable_interrupts(int_timer0);

al hacer ese set-date-time el DS1307 se queda pillado, pero no veo que este mal puesto; es mas, en el proteus, cambia sus valores, pero deja de andar.

Sigo investigandolo a ver... :D

Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Re: Reloj-calendario-termometro DS1307
« Respuesta #2 en: 13 de Julio de 2010, 16:32:17 »
Bueno, acabados los examenes, me he vuelto a poner al lio. Estoy intentando hacer que la salida del DS1307 haga saltar una interrupcion externa del pic, pero soy incapaz... pongo el trozo de codigo y una imagen de las conexiones a ver si me podeis ayudar.




Código: [Seleccionar]
#include <18F4550.h>

#fuses XT,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN // fuse con cristal 4Mhz

#use delay(clock=4M)

#byte portB=0x06

//Definimos Pines LCD
#define LCD_ENABLE_PIN  PIN_A0                                   
#define LCD_RS_PIN      PIN_A1                                   
#define LCD_RW_PIN      PIN_A2
#define LCD_DATA4       PIN_D4
#define LCD_DATA5       PIN_D5                                   
#define LCD_DATA6       PIN_D6                                   
#define LCD_DATA7       PIN_D7
#include <lcd.c>

//Definimos pines DS1307
#define RTC_SDA Pin_B1
#define RTC_SCL Pin_B2
#include "k:\Practicas PIC\Librerias\_DS1307.c"


//---------------VARIABLES GLOBALES------------------------------------------------

byte day,month,year,dow,hour,min,sec; //variables para DS1307
byte caux; //variable auxiliar para configuracion
//int temp=0,alarma=0,conf=0,ok=0;
int flag=0,var=20;  //variables para Timer0
int a=1; //variable para configuracion (para saber que configuramos)
int bandera=0,bandera1=0;
int1 sqw; //variable para ver la onda cuadrada del DS1307


// I-----------NTERRUPCION por EXT Clock Out --------------------------------------------

#int_ext
ext_handler() {
 lcd_putc("aqui estamos");
  if(sqw==1){
     ext_int_edge(0,H_TO_L);
     output_low(PIN_E0);
  }else{
     ext_int_edge(0,L_TO_H);
     output_high(PIN_E0);
  }
  sqw++;
}

//-------------PROGRAMA PRINCIPAL-----------------------------------------------

void main()

   set_tris_a(0b0111111);
   set_tris_b(0b00000111);
   set_tris_e(0b00000000);
   output_e(0x00);
   port_b_pullups(false);
   
   disable_interrupts(global);
   disable_interrupts(INT_TIMER0);
   disable_interrupts(int_ext);
   
   
   enable_interrupts(global); 
   
 
  sqw=0;
  enable_interrupts(int_ext);
  ext_int_edge(0,H_TO_L);
   
   ds1307_init(DS1307_OUT_ON_DISABLED_HIHG | DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);//inicializa DS1307
   delay_ms(10);
   lcd_init();
   ds1307_set_date_time(31,12,99,1,23,59,45); //configuramos DS1307 
   while(1)
   {
     
   }
}


Bueno, a ver si me podeis ayudar...

Saludos y gracias de antemano!

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Reloj-calendario-termometro DS1307
« Respuesta #3 en: 17 de Julio de 2010, 05:13:47 »
Hola Cortijero me surge una duda ¿Tienes en cuenta que una vez grabado el pic con el ds conectado debes volver a borrar el pic y antes de volver a grabar comentar la linea de configuracion del ds

Código: CSS
  1. // ds1307_set_date_time(31,12,99,1,23,59,45); //configuramos DS1307

Saludos Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Re: Reloj-calendario-termometro DS1307
« Respuesta #4 en: 25 de Julio de 2010, 15:36:14 »
Hola Cortijero me surge una duda ¿Tienes en cuenta que una vez grabado el pic con el ds conectado debes volver a borrar el pic y antes de volver a grabar comentar la linea de configuracion del ds

Código: CSS
  1. // ds1307_set_date_time(31,12,99,1,23,59,45); //configuramos DS1307

Saludos Miquel_S

Perdon por la tardanza, estas semanas no tengo una buena conexion a internet (ejemm)

No entiendo lo que quieres decir con eso de grabar y borrar el pic :(

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Reloj-calendario-termometro DS1307
« Respuesta #5 en: 13 de Agosto de 2010, 19:45:06 »
Perdon por no contestar antes pero he estado muy liado, me explico:
Tu grabas el pic con el ds 1307 conectado via i2c y la pila de respaldo del ds en su sitio, al grabar el pic configuras el ds con la fecha que tienes configurada en el ds1307_set_date_time, luego vuelves a borrar el pic comentas la linea ds1307_set_date_time y vuelves a programar el pic y problema resuelto.

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado MarkKnopfler81

  • PIC12
  • **
  • Mensajes: 64
    • PICs, Electrónica y Robótica
Re: Reloj-calendario-termometro DS1307
« Respuesta #6 en: 17 de Agosto de 2010, 08:49:15 »

Hola

No conozco esa libreria y no se como estará hecha, pero prueba a hacer una pausa luego de guardar los valores, por ejemplo asi:

Código: CSS
  1. mostrar();
  2. ds1307_set_date_time(day,month,year,dow,hour,min,sec); //configuramos DS1307
  3.  
  4. delay_ms(10);     // 10 ms de pausa antes de reanudar el funcionamiento.
  5.  
  6. enable_interrupts(int_timer0);

Por otro lado lo que dice Miquel_S es para que cada vez que apagues el reloj no vuelva la hora a cero, pero el problema que tiene ese metodo es que si la pila se agota, ya no volvería a funcionar el reloj, para detectar un problema en el RTC cuando alimento por primera vez el circuito yo lo hago asi:

Al principio y antes del bucle principal, leo los segundos y lo guardo en un temporal, hago una pausa de 1100 ms mas o menos, siempre un poco mas de un segundo, y vuelvo a leer los segundos, si es igual al temporal guardo una hora y una fecha "cero".

De ese modo la primera vez que inicio el circuito me guarda una fecha y horas validas, y si la pila se agota, cuando la cambio, vuelve a funcionar sin tener que modificar nada en el circuito.

saludos.


Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Re: Reloj-calendario-termometro DS1307
« Respuesta #7 en: 29 de Agosto de 2010, 08:12:49 »

Hola

No conozco esa libreria y no se como estará hecha, pero prueba a hacer una pausa luego de guardar los valores, por ejemplo asi:

Código: CSS
  1. mostrar();
  2. ds1307_set_date_time(day,month,year,dow,hour,min,sec); //configuramos DS1307
  3.  
  4. delay_ms(10);     // 10 ms de pausa antes de reanudar el funcionamiento.
  5.  
  6. enable_interrupts(int_timer0);

Por otro lado lo que dice Miquel_S es para que cada vez que apagues el reloj no vuelva la hora a cero, pero el problema que tiene ese metodo es que si la pila se agota, ya no volvería a funcionar el reloj, para detectar un problema en el RTC cuando alimento por primera vez el circuito yo lo hago asi:

Al principio y antes del bucle principal, leo los segundos y lo guardo en un temporal, hago una pausa de 1100 ms mas o menos, siempre un poco mas de un segundo, y vuelvo a leer los segundos, si es igual al temporal guardo una hora y una fecha "cero".

De ese modo la primera vez que inicio el circuito me guarda una fecha y horas validas, y si la pila se agota, cuando la cambio, vuelve a funcionar sin tener que modificar nada en el circuito.

saludos.



Interesante, hare lo que me dices :D

Por ahora, me aparece tanto hora como fecha y temperatura en la lcd, pero no consigo hacer que me funcione la interrupcion por cambio de estado de los pies rb4:rb7

Es extraño... porque en un principio usaba el timer para actualizar la fecha en la lcd, y la interrupcion rb4:rb7 funcionaba bien. Despues cambie el programa para que se actualizara "al son de la onda cuadrada" del ds1307, y dejo de funcionar la interrupcion rb4:rb7... sigo en ello

Va muy lento, por falta de tiempo, y a base de equivocaciones, pero es la mejor forma de aprender!

Desconectado MarkKnopfler81

  • PIC12
  • **
  • Mensajes: 64
    • PICs, Electrónica y Robótica
Re: Reloj-calendario-termometro DS1307
« Respuesta #8 en: 31 de Agosto de 2010, 13:29:17 »
Una pregunta ¿has puesto la resistencia Pull-Up en el pin 7 (SQW/OUT) del DS1307? recuerda que ese pin es colector abierto.

Saludos.

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Reloj-calendario-termometro DS1307
« Respuesta #9 en: 25 de Enero de 2013, 03:23:02 »
Amigo al final terminaste tu proyecto...para que me puedas echar una mano al mio