Autor Tema: Real Time Clock o el DS1307 desatado  (Leído 230314 veces)

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Real Time Clock o el DS1307 desatado
« Respuesta #150 en: 01 de Septiembre de 2010, 16:58:50 »
Atrévete, atrévete ... ja, ja, ja  :D :D :D

Me encanta que me corrijan/amplíen/complementen.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Real Time Clock o el DS1307 desatado
« Respuesta #151 en: 01 de Septiembre de 2010, 22:34:17 »
Gracias por el aporte, una pregunta, donde está el cambio?

Se podría incluir en el ds1307_init(val)?

saludos
.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Real Time Clock o el DS1307 desatado
« Respuesta #152 en: 01 de Septiembre de 2010, 22:48:31 »
Hola.

La librería se usa como la otra, con las mismas configuraciones, solo que es para configurar el reloj en modo AM/PM. Lo hice porque el "cliente" no le tenia mucho gusto por la configuración tipo militar  :D
El papel lo aguanta todo

Desconectado tinch06

  • PIC10
  • *
  • Mensajes: 1
Re: Real Time Clock o el DS1307 desatado
« Respuesta #153 en: 23 de Noviembre de 2010, 00:55:37 »
Que tal amigos picceros!

Soy nuevo en el foro. Llegue aca por esta librería que buscaba en la red.
La verdad que muy buen trabajo.
Tenía el problema de la onda cuadrada de salida en proteus pero ya lo solucione gracias a este tema.

Ahora me surge una duda. Me dijeron que esta onda de salida era adecuada para avisarle al pic cuando debe ler los datos (para no estar haciendolo constantemente) y de esta manera tener mas precisión.
La idea es usar la interrupción exterior. Mi problema es que dentro de la rutina de servicio si realizo la lectura de la hora me salta un error (el famosos disabled interrupts) y el circuito (simulado en proteus) no funciona. se les ocurre otra forma?
Uso ccs.

Otra cosa, al usar la onda cuadrada, en el modo de batería de respaldo el consumo va a ser demasiado no? osea, la batería va a durar poco?

Desde ya muchas gracias, por el aporte y por sus prontas respuestas (espero)

Saludos

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Real Time Clock o el DS1307 desatado
« Respuesta #154 en: 23 de Noviembre de 2010, 16:52:45 »
Hola.

Dentro de las rutinas de interrupcion se puede asignar un flag para que en programa principal leas el reloj y de esa manera no tener inconvenientes con las interrupciones  ;-)

Saludos
El papel lo aguanta todo

Desconectado oscar12725

  • PIC10
  • *
  • Mensajes: 4
Re: Real Time Clock o el DS1307 desatado
« Respuesta #155 en: 04 de Diciembre de 2010, 19:57:54 »
Hola Cryn, estoy utilizando la libreria del maestrisimo Redpic pero tengo el problema del paso de dia del domingo al lunes que sale un simbolo extraño y la fecha no sale bien y vi que tienes la solucion a este problema he intentado solucionarlo pero no he podido sera que me puedes ayudar con esto??si puedes postear el codigo para que todos lo podamos ver ya que veo que muchos tenemos este problema..

De antemano gracias .........

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Real Time Clock o el DS1307 desatado
« Respuesta #156 en: 04 de Diciembre de 2010, 22:25:12 »
Hola AKENAFAB, pues si, confirme lo que había dicho con la practica, y en efecto lo que dice la hoja de datos se cumple una vez más :D

yo para saber el string del dia, solamente cojo el dato de día de la semana que guarda el reloj y según el valor que tenga lo muestro de un const char [][], el valor de dia de la semana del rtc -1 de índice y visualizo todo bien, y ya no tengo problemas en la transición de domingo a lunes, va todo bien :mrgreen:

la librería devuelve el valor del día de la semana en la variable dow (al menos en la que sea direccionada en la posición de dow: void ds1307_get_date(day,mth,year,dow))

por tanto como la hoja de datos dice que el dia de la semana varia de 1-7 y las variables almacenas en el arreglo para los días varia de 0-6, lo que se hace es restar 1 al valor obtenido en dow de la funcion get_date:

por ej para ver en un lcd solo el día yo haría:

printf(lcd_putc,"%s",days_of_week[dow-1]);

el indice a mostrar es el detalle, saludos.
.

Desconectado oscar12725

  • PIC10
  • *
  • Mensajes: 4
Re: Real Time Clock o el DS1307 desatado
« Respuesta #157 en: 05 de Diciembre de 2010, 15:35:51 »
Ok Cryn muchisimas gracias por la respuesta, ya lo hice como dijiste y va a la perfeccion, ahora entiendo por que dejaste todos los dias de 3 letras, o por lo menos a mi me pasa que de domingo pasaba a lunesgo jejejje cualquier inquietud vuelvo y te molesto, de nuevo muchas gracias..... :-/

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Real Time Clock o el DS1307 desatado
« Respuesta #158 en: 06 de Diciembre de 2010, 13:47:29 »
Que bueno que lo hayas solucionado.

Yo use los nombres de los días de 3letras porque necesitaba ahorrar unas cuantas letras, para mostrar más cosas.

Si te aparece Lunesgo, seguramente es porque no borras las pantalla

saludos
.

Desconectado Gray

  • PIC10
  • *
  • Mensajes: 2
    • Worlds Alterns
Re: Real Time Clock o el DS1307 desatado
« Respuesta #159 en: 10 de Diciembre de 2010, 01:42:34 »
Saludos mis estimados amigos yo hice mi propio programa del reloj (con ayuda del foro claro) y funciona bien, marca la hora inicial que le programo y no tiene atrasos ni nada por el estilo:

#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT
#use delay(clock=4000000)
#include <lcd.c>
#include <ds1307_2.c>

void main(){
   BYTE sec, min, hrs, day, month, yr, dow;

   lcd_init();
   ds1307_init();
   //Set date for -> 09 December 2010 Thursday
   //Set time for -> 12:59:30
   ds1307_set_date_time(9,12,10,4,20,52,00);
   
   while(TRUE){
      ds1307_get_date(day,month,yr,dow);
      ds1307_get_time(hrs,min,sec);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Hora %02d:\%02d:\%02d", hrs, min, sec);
   }
}

El problema viene cuando comento la parte de ds1307_set_date_time(9,12,10,4,20,52,00) y le desconecto la alimentación dejandole la bateria de respaldo de 3V para que no pierda la hora pero al momento de volverle a conectar la alimentacion me marcan números raros y no se a que se pueda deber :5]

microcom:
No, no es necesario leer todos los datos. Puedes leer por separado la fecha y por otro la hora.

Yo en el Programa de Test rtc.c que escribí puse lo siguiente:

   // Set date for -> 5 Agosto 2006 Viernes
   // Set time for -> 02:50:00
   // printf("Set Date & Time to ...\r\n");
   // ds1307_set_date_time(5,8,6,5,2,50,00);

con coincidía con la fecha y hora en que iba a ejecutar por primera vez el programa con el ds1307 conectado y programé el PIC en ese momento justo.  :mrgreen:

Al hacerlo por primera y única vez fije la fecha y hora del ds1307 en ese momento. Después comenté estas líneas y reprogramé el PIC. A partir de ese momento ya me dediqué a leer el ds1307 y no lo reprogramo más, está en hora y no le hace falta. Cuando desconecto el PIC el ds1307 sigue con su batería funcionando y al volver a dar corriente al PIC y leer el ds1307 todo es correcto y éste sigue en hora.

El tema de ajustar la hora con pulsadores no lo he hecho pero imagino que deberia setear unas variables con lo valores a enviar de fecha y hora y enviarlos justo en el momento que desee con la función anterior de ds1307_set_date_time()

Por supuesto hablando siempre en C y con el driver que contruí.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Real Time Clock o el DS1307 desatado
« Respuesta #160 en: 10 de Diciembre de 2010, 02:06:34 »
Estoy viendo que la función de inicialización del ds1307 primero lee los segundos, luego hace una pausa, después los vuelve a escribir y por último inicializa el DS1307.

¿Por qué no lo inicializa directamente? No veo ninguna referencia a esto en la hoja de datos.

El problema es que este comportamiento introduce un pequeño pero perceptible retraso acumulativo cada vez que se llama a la función ds1307_init().

También lo note pero sigo sin intender porque  :z)

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Real Time Clock o el DS1307 desatado
« Respuesta #161 en: 04 de Enero de 2011, 14:35:15 »
Hola a todos, despues de leer todo esto que han aportado respecto al DS1307 estaria bueno que
alguien postee algo generico en CCS sobre la funcionalidad del mismo, por ejemplo algo simple que solo
prenda un led cada 24 Hs, para ver mas facil su funcionamiento.

Gracias y saludos a todos
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado oscar12725

  • PIC10
  • *
  • Mensajes: 4
Re: Real Time Clock o el DS1307 desatado
« Respuesta #162 en: 04 de Marzo de 2011, 15:59:14 »
Bueno de nuevo yo por aca jejje, bueno les cuento que he podido hacer muchas modificaciones y asi llegar al funcionamiento correcto del rtc y el micro pero me he quedado en algo, no se que tan facil o dificil sea pero no he podido.... resulta que tengo problemas con los cristales que se consiguen en mi pais y despues de tanto liar con esto se me esta atrasando u adelantando el reloj en 1seg diario (que creo que para un rtc de estas dimensiones es muuucho) asi que quiero implentar botones para que despues de ciertos meses se pueda modificar los registros que tienen que ver con la hora... veo que muchos de ustedes utilizan botones, alguno de ustedes me podria ayudar con esto?? reitero que solo quiero modificar lo concerniente al registro de las horas, hora:min:seg con 2 o 3 botones no importaria.

Maestros de antemano gracias

Desconectado oscar12725

  • PIC10
  • *
  • Mensajes: 4
Re: Real Time Clock o el DS1307 desatado
« Respuesta #163 en: 09 de Marzo de 2011, 12:35:47 »
Hola jukinch no se si recibiste los privados pero segun lo que me enviaste todo funciona ok muuuchas muuuchas gracias... te debo una

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Real Time Clock o el DS1307 desatado
« Respuesta #164 en: 09 de Marzo de 2011, 14:51:53 »
Hola Oscar12725:
                   Por si a alguien más le pueda resultar útil envío el código que te he enviado.
                   Y también informo la existencia del rtc ds1337c que tiene un cristal interno incorporado.
                    No debés nada. Cuando puedas le darás una mano a otro amigo del foro.  :-/
                        Saludos.
                               Jukinch

Código: C
  1. ///////////////////////////////////////////////////////////////////////////////
  2. //                                                                           //
  3. //   Programa:   RELOJ DIGITAL - CON rtc ds1307 y LCD 2*16                   //
  4. //   Version:   0.1                                                          //
  5. //                                                                           //
  6. //   Dispositivo: PIC 16F877A         Compilador:    CCS vs4.023             //
  7. //   Entorno IDE: ccs                                                        //
  8. //   PIC: 16f877a                                                            //
  9. ///////////////////////////////////////////////////////////////////////////////
  10.  
  11.  
  12. //    Conexión del LCD al Pic (configuración de pines)
  13. //
  14. //       PIC           LCD
  15. //
  16. //     PORTd.0          E
  17. //     PORTd.1          RS
  18. //     PORTd.2          R_W
  19. //
  20. //
  21. //     PORTd.4          D4
  22. //     PORTd.5          D5
  23. //     PORTd.6          D6
  24. //     PORTd.7          D7
  25. /////////////////////////////////////////////////////////////////////////////
  26. //      COMO ALIMENTAR EL LCD
  27.  
  28. //     pin VDD a 5v
  29. //     pin VSs a gnd
  30. //     pin VO a gnd o resistor para fijar contraste
  31.  
  32. //     COMO ENCENDER LA LUZ DEL BACKLIGHT
  33.  
  34. //     PIN 15 a 5v
  35. //     pin 16 a gnd
  36. /////////////////////////////////////////////////////////////////////////////
  37. //      COMO CONECTAR EL RTC. DS1307
  38. //
  39. //       pin 1 y 2 poner un cristal de 36768khz  
  40. //       pin 3 bateria vcc 3V
  41. //       pin 4 gnd
  42. //       pin 5 SDA al SDA del pic 16f877a (Es el pin 23)y una resistencia de 10k a VCC
  43. //       pin 6 SCL al SCL del pic 16f877a (Es el pin 18)y una resistencia de 10k a VCC
  44. //       pin 7 no conectado
  45. //       pin 8 a VCC 5V
  46. /////////////////////////////////////////////////////////////////////////////
  47. //       3 botones para modificar hora
  48. //
  49. /////////////////////////////////////////////////////////////////////////////
  50.  
  51. #include <16f877a.h>            //pic a utilizar          
  52. #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
  53. #use delay (clock=4000000)         //Fosc=4Mhz
  54.  
  55.  
  56. // lcd.c //////////////////////////////////////////////////////////////////////
  57.  
  58. // #define use_portb_lcd TRUE // para usar port D comentar esta linea
  59. #include <lcd.c> // librería del lcd
  60.  
  61. ///////////////////////////////////////////////////////////////////////////////
  62.  
  63.  
  64. // Libreria ds1307.c //////////////////////////////////////////////////////////
  65.  
  66. #define RTC_SDA PIN_C4 // configura el pin C4 como SDA
  67. #define RTC_SCL PIN_C3// configura el pin C3 como SCL
  68.  
  69. #define USE_INTERRUPTS 1
  70.  
  71. #include <libreria_rtc.c>
  72.  
  73. ///////////////////////////////////////////////////////////////////////////////
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82. ///VARIABLES GLOBALES
  83.  
  84.  
  85.  
  86.  
  87. int sec;
  88. int min;
  89. int hrs;
  90. int day;
  91. int month;
  92. int yr;
  93. int dow;
  94.  
  95.  
  96.  
  97.  
  98.  
  99. //------Programa principal--------------------------------------
  100.  
  101. void main(void)
  102. {
  103. //------Puertos y pines-----------------------------------------
  104. set_tris_a(0b11111);                 // puerto a como ENTRADAS
  105. set_tris_b(0b00000000);              // puerto b como salidas
  106.  
  107.    
  108.  
  109.  
  110.   // Inicializa DS1307
  111.  
  112. ds1307_init(DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);
  113. sec=0;
  114. min=42;
  115. hrs=9;
  116. day=14;
  117. month=6;
  118. yr=6;
  119. dow=7; //dia de la semana
  120.  
  121. // configura hora inicial DS1307
  122. // ds1307_set_date_time(day,month,yr,dow,hrs,min,sec);
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.   // escribe hora en lcd
  130.   lcd_init();         //-----Inicializo el LCD-------------------------------------
  131.     lcd_putc('\f');     //-borro la pantalla-------------------------------------
  132.     lcd_gotoxy(1,1);    //----pongo el cursor en caracter 1 de la línea 1----
  133.     printf(lcd_putc,"RELOJ ds1307");
  134. lcd_gotoxy(1,2);    //----pongo el cursor en caracter 1 de la línea 2----
  135.  
  136.  while (1)  // bucle principal
  137.  {
  138.    // lee hora DS1307
  139.             ds1307_get_time(hrs,min,sec);
  140.              printf(lcd_putc,"          "); // Borro segundo renglón del lcd
  141.                               lcd_gotoxy(1,2);    //----pongo el cursor en caracter 1 de la línea 2----
  142.                               printf(lcd_putc,"%u",hrs);
  143.                               printf(lcd_putc,":");
  144.                               printf(lcd_putc,"%u",min);
  145.                               printf(lcd_putc,":");
  146.                               printf(lcd_putc,"%u",sec);
  147.            
  148.            
  149.             if (input(PIN_A0) ) // controla el puerto A pin0 incrementa horas
  150.                      {
  151.                      output_toggle(PIN_B0);
  152.                  if (hrs>23)
  153.                          hrs=0;
  154.                      else hrs++;
  155.                           i2c_start();
  156.                           i2c_write(0xD0);
  157.                           i2c_write(0x02);
  158.                           i2c_write(ds1307_bin2bcd(hrs));
  159.                           i2c_stop();
  160.                      delay_ms(50);
  161.                      };
  162.            
  163.            if (input(PIN_A1) ) // controla el puerto A pin1 incrementa minutos
  164.                      {
  165.                      output_toggle(PIN_B0);
  166.                      if (min>58)
  167.                          min=0;
  168.                      else min++;    
  169.                      i2c_start();
  170.                      i2c_write(0xD0);
  171.                      i2c_write(0x01);
  172.                      i2c_write(ds1307_bin2bcd(min));
  173.                      i2c_stop();
  174.                      delay_ms(50);
  175.                      };
  176.            
  177.            if (input(PIN_A2) ) // controla el puerto A pin2 incrementa segundos
  178.                      {
  179.                      output_toggle(PIN_B0);
  180.                      if (sec>58)
  181.                          sec=0;
  182.                      else sec++;
  183.                      
  184.                      
  185.                           i2c_start();
  186.                           i2c_write(0xD0);
  187.                           i2c_write(0x00);
  188.                           i2c_write(ds1307_bin2bcd(sec));
  189.                           i2c_stop();
  190.                      delay_ms(50);
  191.                      };
  192.            
  193.            
  194.            
  195.            
  196.                }// final bucle principal
  197.  
  198.  
  199.        
  200. }// final de main



Y aquí va la libreria
Código: C
  1. ///////////////////////////////////////////////////////////////////////////////////////
  2. /// ds1307.c                                                                        ///
  3. /// Driver for Real Time Clock                                                      ///
  4. /// modified by Redpic 08/2006                                                      ///
  5. /// http://picmania.garcia-cuervo.net                                               ///
  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. ///////////////////////////////////////////////////////////////////////////////
[/quote]
« Última modificación: 09 de Marzo de 2011, 14:58:45 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes