TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Cortijero en 23 de Mayo de 2010, 13:09:52

Título: Reloj-calendario-termometro DS1307
Publicado por: Cortijero 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

Título: Re: Reloj-calendario-termometro DS1307
Publicado por: Cortijero 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
Título: Re: Reloj-calendario-termometro DS1307
Publicado por: Cortijero 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.

(http://img31.imageshack.us/img31/7505/62755058.jpg)


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!
Título: Re: Reloj-calendario-termometro DS1307
Publicado por: Miquel_S 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
Título: Re: Reloj-calendario-termometro DS1307
Publicado por: Cortijero 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 :(
Título: Re: Reloj-calendario-termometro DS1307
Publicado por: Miquel_S 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
Título: Re: Reloj-calendario-termometro DS1307
Publicado por: MarkKnopfler81 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.

Título: Re: Reloj-calendario-termometro DS1307
Publicado por: Cortijero 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!
Título: Re: Reloj-calendario-termometro DS1307
Publicado por: MarkKnopfler81 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.
Título: Re: Reloj-calendario-termometro DS1307
Publicado por: victorzx en 25 de Enero de 2013, 03:23:02
Amigo al final terminaste tu proyecto...para que me puedas echar una mano al mio