Autor Tema: Bateria de respaldo Ds1307  (Leído 6975 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Bateria de respaldo Ds1307
« en: 02 de Marzo de 2013, 01:06:58 »
Hola amigos del foro queria preguntarles algo que me esta pasando..tengo el codigo para realizar un reloj programable bueno en si se programa todo hora minutos,mes año etc pero cuando lo apago deberia aun seguir contando los segundos pero cuando lo prendo se me pierde la hora...yo tengo conectada la bateria de resplado al pin 3 dl ds1307 y mido esa pila con um multimetro y me mide 3,4 volt pero no me funciona en el circuito..yo creo q ese es el problema..que opinan ustedes y como solucionarlo

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Bateria de respaldo Ds1307
« Respuesta #1 en: 02 de Marzo de 2013, 03:09:17 »
Hola amigos del foro queria preguntarles algo que me esta pasando..tengo el codigo para realizar un reloj programable bueno en si se programa todo hora minutos,mes año etc pero cuando lo apago deberia aun seguir contando los segundos pero cuando lo prendo se me pierde la hora...yo tengo conectada la bateria de resplado al pin 3 dl ds1307 y mido esa pila con um multimetro y me mide 3,4 volt pero no me funciona en el circuito..yo creo q ese es el problema..que opinan ustedes y como solucionarlo
Lee la hoja de datos , ahi te explica como se conecta la bateria de 3v

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Bateria de respaldo Ds1307
« Respuesta #2 en: 02 de Marzo de 2013, 03:56:33 »
Pero me dice lo mismo q ya hice..conectar el positivo al pin 3 del ds1307 y el negativo a tierra pero naaadaa se me pierde la hors

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Bateria de respaldo Ds1307
« Respuesta #3 en: 02 de Marzo de 2013, 06:33:08 »
Hola victorrz, te has fijado en que el datasheets te dice voltaje minimo 4.5Vcc.

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

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Bateria de respaldo Ds1307
« Respuesta #4 en: 02 de Marzo de 2013, 08:23:47 »
Hola amigos del foro queria preguntarles algo que me esta pasando..tengo el codigo para realizar un reloj programable bueno en si se programa todo hora minutos,mes año etc pero cuando lo apago deberia aun seguir contando los segundos pero cuando lo prendo se me pierde la hora...yo tengo conectada la bateria de resplado al pin 3 dl ds1307 y mido esa pila con um multimetro y me mide 3,4 volt pero no me funciona en el circuito..yo creo q ese es el problema..que opinan ustedes y como solucionarlo

en el main le asignas una hora inicial? De ser así, lo primero que debes hacer es leer la fecha y sí las horas están por debajo de 0x23 no debes de sobreescribir la hora... No sé sí me entiendes
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Bateria de respaldo Ds1307
« Respuesta #5 en: 03 de Marzo de 2013, 18:19:25 »
Sii yo le fijo la hora en el main...no no entendi lo que me dijiste...puedes explicrme mejor??

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Bateria de respaldo Ds1307
« Respuesta #6 en: 03 de Marzo de 2013, 18:59:01 »
Sii yo le fijo la hora en el main...no no entendi lo que me dijiste...puedes explicrme mejor??

cuando arranca el pic, y empieza con la funcion main hara esto....

ds1307_init(configuracion del ds1307);
ds1307_set_date_time(aqui la hora que desees guardar);

y despues continuara con el main.....

pues bien, lo que tendrias que hacer es primero iniciar el ds1307, despues leer la hora para comprobar si el ds tiene una hora ya programada.... ya que si no... cada vez que prendas el ucontrolador, este, cambiara la hora de nuevo.... asi que lo que debes de hacer es esto....

ds1307_init(configuracion del ds1307);
ds1307_get_time(horario[0],horario[1],horario[2]);
if(horario[0]>=24)ds1307_set_date_time(aqui la hora que desees);

asi si el ds tiene una hora asignada... el pic no reprogramara el ds1307.....

PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Bateria de respaldo Ds1307
« Respuesta #7 en: 03 de Marzo de 2013, 19:22:32 »
Sii yo le fijo la hora en el main...no no entendi lo que me dijiste...puedes explicrme mejor??

cuando arranca el pic, y empieza con la funcion main hara esto....

ds1307_init(configuracion del ds1307);
ds1307_set_date_time(aqui la hora que desees guardar);

y despues continuara con el main.....

pues bien, lo que tendrias que hacer es primero iniciar el ds1307, despues leer la hora para comprobar si el ds tiene una hora ya programada.... ya que si no... cada vez que prendas el ucontrolador, este, cambiara la hora de nuevo.... asi que lo que debes de hacer es esto....

ds1307_init(configuracion del ds1307);
ds1307_get_time(horario[0],horario[1],horario[2]);
if(horario[0]>=24)ds1307_set_date_time(aqui la hora que desees);

asi si el ds tiene una hora asignada... el pic no reprogramara el ds1307.....


Tenes toda la razon en lo que decis

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Bateria de respaldo Ds1307
« Respuesta #8 en: 03 de Marzo de 2013, 20:12:31 »
Naadaa mira lo q hice fue inicializar el ds1307 luego le puse una hora para que se guarde..luego apague el reloj y comente la parte dond le asigno la hora y le agregue la validdacion que tu m dijiste y reprograme al pic pero cuando lo vuelvo a encender me sale todo cero cero cero y esa no era la hora que yo le asigne...que sera el error..que no estara guardando las horas?

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Bateria de respaldo Ds1307
« Respuesta #9 en: 03 de Marzo de 2013, 20:48:06 »
Porque segun lo q entiendo con la bateria de resplado me mantiene los datos aunque no haya voltaje en el pic..o sera q cada segundo yo debo de grabar esos datos en la memoria de usuario que tiene el ds1307?

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Bateria de respaldo Ds1307
« Respuesta #10 en: 03 de Marzo de 2013, 21:11:29 »
Naadaa mira lo q hice fue inicializar el ds1307 luego le puse una hora para que se guarde..luego apague el reloj y comente la parte dond le asigno la hora y le agregue la validdacion que tu m dijiste y reprograme al pic pero cuando lo vuelvo a encender me sale todo cero cero cero y esa no era la hora que yo le asigne...que sera el error..que no estara guardando las horas?

si ves que con la lectura del ds1307 te devuelve 0.... hazlo con....

if((mes==0x00)||(mes>0x12)) ds1307_set_date_time(aqui la hora que desees);

asi lo hice yo hace tiempo en algun proyecto con el ds1307 y siempre me ha ido....

por cierto decir que el valor de comparacion debe de ser en hexadecimal... 0x12 es correcto..... 12 no....
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Bateria de respaldo Ds1307
« Respuesta #11 en: 03 de Marzo de 2013, 21:25:58 »
No osea aparte de la validacion...cuando uno setea la hora..esa hora debe guardarse en el ds1307 pero ucando yo apago el pic y le comento la linea de configuracion de hora  hago una validacion para saber si la hora que ingrese es la misma que yo obtengo del ds1307 con la funcion get_time...pero me devuelve que la hora que asigne es ceroo sea como sea...osea que no me guarda nada!!:(

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Bateria de respaldo Ds1307
« Respuesta #12 en: 03 de Marzo de 2013, 21:27:47 »
xq no creo q sea el init porque yo tengo ds1307_init(0) y estoy usando la libreria ds1307.c

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Bateria de respaldo Ds1307
« Respuesta #13 en: 03 de Marzo de 2013, 22:14:02 »
prueba con esta... ademas es de un forero... a mi me va perfecta.... a demas en el enunciado te explica como se utiliza el ds1307_init()
Código: CSS
  1. ///////////////////////////////////////////////////////////////////////////////////////
  2. ///                               DS1307.C                                           ///
  3. ///                     Driver for Real Time Clock                                   ///
  4. ///                     modified by Redpic 08/2006                                   ///
  5. ///                  http://picmania.garcia-cuervo.com                               ///
  6. ///                                                                                  ///
  7. /// void ds1307_init(val)                                                            ///
  8. ///                  - Enable oscillator without clearing the seconds register       ///
  9. ///                    used when PIC loses power and DS1307 run from 3V BAT          ///
  10. ///                  - Config Control Register with next parameters:                 ///
  11. ///                     DS1307_ALL_DISABLED          All disabled                    ///
  12. ///                     DS1307_OUT_ON_DISABLED_HIHG  Out to Hight on Disable Out     ///
  13. ///                     DS1307_OUT_ENABLED           Out Enabled                     ///
  14. ///                     DS1307_OUT_1_HZ              Freq. Out to 1 Hz               ///
  15. ///                     DS1307_OUT_4_KHZ             Freq. Out to 4.096 Khz          ///
  16. ///                     DS1307_OUT_8_KHZ             Freq. Out to 8.192 Khz          ///
  17. ///                     DS1307_OUT_32_KHZ            Freq. Out to 32.768 Khz         ///
  18. ///                                                                                  ///
  19. ///                     Example init:                                                ///
  20. ///                     ds1307_init(DS1307_ALL_DISABLED);                            ///
  21. ///                     ds1307_init(DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);           ///
  22. ///                                                                                  ///
  23. /// void ds1307_set_date_time(day,mth,year,dow,hour,min,sec) - Set the date/time     ///
  24. ///                                                                                  ///
  25. /// void ds1307_get_date(day,mth,year,dow)                   - Get the date          ///
  26. ///                                                                                  ///
  27. /// void ds1307_get_time(hr,min,sec)                         - Get the time          ///
  28. ///                                                                                  ///
  29. /// char ds1307_read_nvram_byte(char addr)                   - Read byte in address  ///
  30. ///                                                                                  ///
  31. /// void ds1307_write_nvram_byte(char addr, char value)      - Write byte in address ///
  32. ///                                                                                  ///
  33. /// void ds1307_get_day_of_week(char* ptr)                   - Get string Day Of Week///
  34. ///                                                                                  ///
  35. /// If defined USE_INTERRUPTS all functions disable Global Interrupts on starts and  ///
  36. ///                           enable Global on ends else usar can do it hiself       ///
  37. ///                                                                                  ///
  38. ///////////////////////////////////////////////////////////////////////////////////////
  39.  
  40. #ifndef RTC_SDA
  41. #define RTC_SDA  PIN_B0
  42. #define RTC_SCL  PIN_B1
  43. #endif
  44.  
  45. #use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
  46.  
  47. #define DS1307_ALL_DISABLED         0b00000000 // All disabled
  48. #define DS1307_OUT_ON_DISABLED_HIHG 0b10000000 // Out to Hight on Disable Out
  49. #define DS1307_OUT_ENABLED          0b00010000 // Out Enabled
  50. #define DS1307_OUT_1_HZ             0b00000000 // Freq. Out to 1 Hz
  51. #define DS1307_OUT_4_KHZ            0b00000001 // Freq. Out to 4.096 Khz
  52. #define DS1307_OUT_8_KHZ            0b00000010 // Freq. Out to 8.192 Khz
  53. #define DS1307_OUT_32_KHZ           0b00000011 // Freq. Out to 32.768 Khz
  54.  
  55. #define Start_user_address_nvram    0x08
  56. #define End_user_address_nvram      0x3f
  57.  
  58. char days_of_week[7][11]={"Lunes\0","Martes\0","Miércoles\0","Jueves\0","Viernes\0","Sábado\0","Domingo\0"};
  59.  
  60. byte ds1307_bin2bcd(byte binary_value);
  61. byte ds1307_bcd2bin(byte bcd_value);
  62.  
  63. void ds1307_init(int val){
  64.  
  65.    byte seconds = 0;
  66.  
  67. #ifndef USE_INTERRUPTS
  68.    disable_interrupts(global);
  69. #endif
  70.  
  71.    i2c_start();
  72.    i2c_write(0xD0);
  73.    i2c_write(0x00);
  74.    i2c_start();
  75.    i2c_write(0xD1);
  76.    seconds = ds1307_bcd2bin(i2c_read(0));
  77.    i2c_stop();
  78.    seconds &= 0x7F;
  79.  
  80.    delay_us(3);
  81.  
  82.    i2c_start();
  83.    i2c_write(0xD0);
  84.    i2c_write(0x00);
  85.    i2c_write(ds1307_bin2bcd(seconds));
  86.    i2c_start();
  87.    i2c_write(0xD0);
  88.    i2c_write(0x07);
  89.    i2c_write(val);
  90.    i2c_stop();
  91.  
  92. #ifndef USE_INTERRUPTS
  93.    enable_interrupts(global);
  94. #endif
  95.  
  96. }
  97.  
  98. void ds1307_set_date_time(byte day, byte mth, byte year, byte dow, byte hr, byte min, byte sec){
  99.  
  100. #ifndef USE_INTERRUPTS
  101.    disable_interrupts(global);
  102. #endif
  103.  
  104.   sec &= 0x7F;
  105.   hr &= 0x3F;
  106.  
  107.   i2c_start();
  108.   i2c_write(0xD0);
  109.   i2c_write(0x00);
  110.   i2c_write(ds1307_bin2bcd(sec));
  111.   i2c_write(ds1307_bin2bcd(min));
  112.   i2c_write(ds1307_bin2bcd(hr));
  113.   i2c_write(ds1307_bin2bcd(dow));
  114.   i2c_write(ds1307_bin2bcd(day));
  115.   i2c_write(ds1307_bin2bcd(mth));
  116.   i2c_write(ds1307_bin2bcd(year));
  117.   i2c_stop();
  118.  
  119. #ifndef USE_INTERRUPTS
  120.    enable_interrupts(global);
  121. #endif
  122.  
  123. }
  124.  
  125. void ds1307_get_date(byte &day, byte &mth, byte &year, byte &dow){
  126.  
  127. #ifndef USE_INTERRUPTS
  128.    disable_interrupts(global);
  129. #endif
  130.  
  131.   i2c_start();
  132.   i2c_write(0xD0);
  133.   i2c_write(0x03);
  134.   i2c_start();
  135.   i2c_write(0xD1);
  136.   dow  = ds1307_bcd2bin(i2c_read() & 0x7f);
  137.   day  = ds1307_bcd2bin(i2c_read() & 0x3f);
  138.   mth  = ds1307_bcd2bin(i2c_read() & 0x1f);
  139.   year = ds1307_bcd2bin(i2c_read(0));
  140.   i2c_stop();
  141.  
  142. #ifndef USE_INTERRUPTS
  143.    enable_interrupts(global);
  144. #endif
  145.  
  146. }
  147.  
  148. void ds1307_get_time(byte &hr, byte &min, byte &sec){
  149.  
  150. #ifndef USE_INTERRUPTS
  151.    disable_interrupts(global);
  152. #endif
  153.  
  154.   i2c_start();
  155.   i2c_write(0xD0);
  156.   i2c_write(0x00);
  157.   i2c_start();
  158.   i2c_write(0xD1);
  159.   sec = ds1307_bcd2bin(i2c_read() & 0x7f);
  160.   min = ds1307_bcd2bin(i2c_read() & 0x7f);
  161.   hr  = ds1307_bcd2bin(i2c_read(0) & 0x3f);
  162.   i2c_stop();
  163.  
  164. #ifndef USE_INTERRUPTS
  165.    enable_interrupts(global);
  166. #endif
  167.  
  168. }
  169.  
  170.  
  171. char ds1307_read_nvram_byte(char addr){
  172.  
  173.    char retval;
  174.  
  175. #ifndef USE_INTERRUPTS
  176.    disable_interrupts(global);
  177. #endif
  178.  
  179.    i2c_start();
  180.    i2c_write(0xD0);
  181.    i2c_write(addr);
  182.  
  183.    i2c_start();
  184.    i2c_write(0xD1);
  185.    retval = i2c_read(0);
  186.    i2c_stop();
  187.  
  188.    return(retval);
  189.  
  190. #ifndef USE_INTERRUPTS
  191.    enable_interrupts(global);
  192. #endif
  193.  
  194. }
  195.  
  196. void ds1307_write_nvram_byte(char addr, char value){
  197.  
  198. #ifndef USE_INTERRUPTS
  199.    disable_interrupts(global);
  200. #endif
  201.  
  202.    i2c_start();
  203.    i2c_write(0xD0);
  204.    i2c_write(addr);
  205.    i2c_write(value);
  206.    i2c_stop();
  207.  
  208. #ifndef USE_INTERRUPTS
  209.    enable_interrupts(global);
  210. #endif
  211.  
  212. }
  213.  
  214. void ds1307_get_day_of_week(char* ptr){
  215.  
  216.    byte lday;
  217.    byte lmonth;
  218.    byte lyr;
  219.    byte ldow;
  220.    ds1307_get_date(lday,lmonth,lyr,ldow);
  221.    sprintf(ptr,"%s",days_of_week[ldow]);
  222. }
  223.  
  224. ///////////////////////////////////////////////////////////////////////////////
  225.  
  226. byte ds1307_bin2bcd(byte binary_value){
  227.  
  228.   byte temp;
  229.   byte retval;
  230.  
  231.   temp = binary_value;
  232.   retval = 0;
  233.   while(1){
  234.     if(temp >= 10){
  235.       temp -= 10;
  236.       retval += 0x10;
  237.     }else{
  238.       retval += temp;
  239.       break;
  240.     }
  241.   }
  242.   return(retval);
  243. }
  244.  
  245. byte ds1307_bcd2bin(byte bcd_value){
  246.  
  247.   byte temp;
  248.  
  249.   temp = bcd_value;
  250.   temp >>= 1;
  251.   temp &= 0x78;
  252.   return(temp + (temp >> 2) + (bcd_value & 0x0f));
  253. }
  254.  
  255. //////////////////////////////////////////////////////////////////////////////
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Bateria de respaldo Ds1307
« Respuesta #14 en: 03 de Marzo de 2013, 22:54:30 »
Sii sii ese es el mismo q uso pero no entiendo por definicion que son esos parametros que se usan para la inicializacion..y de paso lei en un foro esto: 0x3f será comparada con el valor 0x20 esto quiere decir que la batería de reserva ha salvado el contenido de la RAM y todos los registros, por lo tanto, han sido inicializados. Entonces el software se salta la secuencia inicialización. Yo creo que el problema es esot...no me esta guardando un respaldo de lo q tengo en el ds1307 y no se como solucionarlo