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

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Real Time Clock o el DS1307 desatado
« Respuesta #135 en: 21 de Marzo de 2010, 18:24:35 »
Me respondo a mi mismo problema resuelto incompatibilidad del ccs con mplab  :mrgreen:

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

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Real Time Clock o el DS1307 desatado
« Respuesta #136 en: 21 de Marzo de 2010, 19:19:25 »
Eee? Porque incompatibilidad? Proba colocando "" en el include y colocando la librería en la carpeta del proyecto.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Real Time Clock o el DS1307 desatado
« Respuesta #137 en: 23 de Marzo de 2010, 05:40:03 »
Gracias Suky por tu respuesta lo probare, ya que la solucion que estaba usando era la comentada anteriormente en otro post de usar importar archivo. Igual es por eso que el reloj en la simulacion con proteus y ccs me funciona y en la vida real no. ;-)
 
 Gracias de nuevo
 
 Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Real Time Clock o el DS1307 desatado
« Respuesta #138 en: 23 de Marzo de 2010, 05:55:50 »
He estado probando lo de las " " en los includes y  librerias en la misma carpeta y tengo los mismos errores de compilacion:

 Clean: Deleting intermediary and output files.
Clean: Deleted file "D:\PROYECTOS\Proyecto_0.0\Reloj_ds1307.ESYM".
Clean: Deleted file "D:\PROYECTOS\Proyecto_0.0\Reloj_ds1307.o".
Clean: Deleted file "D:\PROYECTOS\Proyecto_0.0\_ds1307.ESYM".
Clean Warning: File "D:\PROYECTOS\Proyecto_0.0\_ds1307.o" doesn't exist.
Clean: Deleted file "D:\PROYECTOS\Proyecto_0.0\Reloj_ds1307.ERR".
Clean: Deleted file "D:\PROYECTOS\Proyecto_0.0\_ds1307.ERR".
Clean: Done.
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FM "Reloj_ds1307.c" +EXPORT #__DEBUG=true +ICD +DF +LN +T +A +M +Z +Y=9 +EA #__16F877A=TRUE
>>> Warning 202 "D:\PROYECTOS\Proyecto_0.0\Reloj_ds1307.c" Line 60(10,15): Variable never used:   leido
D:\PROYECTOS\Proyecto_0.0\Reloj_ds1307.o ===>  0 Errors,  1 Warnings.
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FM "_ds1307.c" +EXPORT #__DEBUG=true +ICD +DF +LN +T +A +M +Z +Y=9 +EA #__16F877A=TRUE
*** Error 100 "D:\PROYECTOS\Proyecto_0.0\_ds1307.c" Line 45(5,43): USE parameter value is out of range   Not a number: PIN_C4
*** Error 128 "D:\PROYECTOS\Proyecto_0.0\_ds1307.c" Line 58(1,11): A #DEVICE required before this line
D:\PROYECTOS\Proyecto_0.0\_ds1307.o ===>  2 Errors,  0 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Tue Mar 23 09:52:51 2010

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

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Real Time Clock o el DS1307 desatado
« Respuesta #139 en: 23 de Marzo de 2010, 11:53:02 »
El primer error es porque estas asignando un pin de un puerto que no tiene el PIC y el segundo creo que es debido a que estas poniendo el #include del ds1307 antes de la linea #include del PIC.

Saludos
El papel lo aguanta todo

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Real Time Clock o el DS1307 desatado
« Respuesta #140 en: 23 de Marzo de 2010, 13:32:04 »
Hola MLO referente al pin si tiene puerto C ya que estoy usando el pic 16f877a y lo que concierne al include como puedes ver mas arriba siempre empiezo el programa con el include del pic.
De todos modos gracias.

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

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Real Time Clock o el DS1307 desatado
« Respuesta #141 en: 23 de Marzo de 2010, 13:45:24 »
 :?

Pues los errores son por eso. A que tanto le cambiaste las <> por "" ? El que debe ir con <> es el #include<16F877A.h>

Saludos
El papel lo aguanta todo

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Real Time Clock o el DS1307 desatado
« Respuesta #142 en: 23 de Marzo de 2010, 14:37:14 »
Pues sinceramente esto es lo que no entiendo, ya que entiendo los errores como tu y hago las modificaciones que creo oportunas y sigue con el mismo error, pero ojo al dato solo si compilo con mplab si compilo con ccs no tengo errores.
Y tambien he probado de cambiar <> por "" en los includes.

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Real Time Clock o el DS1307 desatado
« Respuesta #143 en: 23 de Marzo de 2010, 19:53:26 »
Necesito ayuda, alguien de ustedes puede probar el programa que adjunto ya que en la simulacion de proteus me funciona y cuando lo monto en la realidad solo visualizo en el lcd numeros sin sentido.
Me seria de ayuda para poder ir descartando cosas como por ejemplo el rtc o el cristal etc..., y si no es mucho pedir al que le funcione me pase el esquema del rtc  :mrgreen: ya que yo tengo montado el de RedPic y podria montar otro para ir probando.

 
Código: CSS
  1. #include <16f877a.h>
  2. #fuses HS,NOWDT,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOLVP,PUT
  3. #use delay(clock=20000000)
  4. #use i2c (Master, sda=PIN_C4, scl=PIN_C3)
  5. #define use_portb_lcd TRUE
  6. #include <LCD.c>            
  7. #include <DS_1307.0.c>
  8.  
  9.  int hr;
  10.  int min;
  11.  int sec;
  12.  int day;
  13.  int mth;
  14.  int year;
  15.  
  16.  
  17. /******************************************************************************
  18.                               PROGRAMA PRINCIPAL
  19. ******************************************************************************/
  20.                    void main()
  21.                    {
  22.                    lcd_init();
  23.                    delay_ms(5);
  24.                    ds1307_init();
  25.                    ds1307_set_date_time(23,3,10,23,22,0);
  26.                    lcd_putc("\f");
  27.                    while(1)
  28.                      {
  29.                      ds1307_get_time(hr,min,sec);
  30.                      ds1307_get_date(day,mth,year);
  31.                      lcd_gotoxy(1,1);
  32.                      printf(lcd_putc,"%02u/%02u/%02u",hr,min,sec);
  33.                      printf(lcd_putc,"\n%02u:%02u:%02u",day,mth,year);
  34.                      }
  35.                    }

 
Código: CSS
  1. ////////////////////////////////////////////////////////////////////////////////
  2. ///                               DS1307.C                                   ///
  3. ///                     Driver for Real Time Clock                           ///
  4. ///                                                                          ///
  5. /// ds1307_init() - Enable oscillator without clearing the seconds register -///
  6. ///                 used when PIC loses power and DS1307 run from 3V BAT     ///
  7. ///               - Disable squarewave output                                ///
  8. ///                                                                          ///
  9. /// ds1307_set_date_time(day,mth,year,dow,hour,min,sec)  Set the date/time   ///
  10. ///                                                                          ///
  11. /// ds1307_get_date(day,mth,year,dow)               Get the date             ///
  12. ///                                                                          ///
  13. /// ds1307_get_time(hr,min,sec)                     Get the time             ///
  14. ///                                                                          ///
  15. ////////////////////////////////////////////////////////////////////////////////
  16.  
  17. #define RTC_SDA  PIN_C4
  18. #define RTC_SCL  PIN_C3
  19.  
  20. #use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
  21.  
  22. BYTE bin2bcd(BYTE binary_value);
  23. BYTE bcd2bin(BYTE bcd_value);
  24.  
  25. void ds1307_init(void)
  26. {
  27.    BYTE seconds = 0;
  28.  
  29.    i2c_start();
  30.    i2c_write(0xD0);      // WR to RTC
  31.    i2c_write(0x00);      // REG 0
  32.    i2c_start();
  33.    i2c_write(0xD1);      // RD from RTC
  34.    seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
  35.    i2c_stop();
  36.    seconds &= 0x7F;
  37.  
  38.    delay_us(3);
  39.  
  40.    i2c_start();
  41.    i2c_write(0xD0);      // WR to RTC
  42.    i2c_write(0x00);      // REG 0
  43.    i2c_write(bin2bcd(seconds));     // Start oscillator with current "seconds value
  44.   i2c_start();
  45.   i2c_write(0xD0);      // WR to RTC
  46.   i2c_write(0x07);      // Control Register
  47.   i2c_write(0x80);     // Disable squarewave output pin
  48.   i2c_stop();
  49.  
  50. }
  51.  
  52. void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE hr, BYTE min, BYTE sec)
  53. {
  54.  sec &= 0x7F;
  55.  hr &= 0x3F;
  56.  
  57.  i2c_start();
  58.  i2c_write(0xD0);            // I2C write address
  59.  i2c_write(0x00);            // Start at REG 0 - Seconds
  60.  i2c_write(bin2bcd(sec));      // REG 0
  61.  i2c_write(bin2bcd(min));      // REG 1
  62.  i2c_write(bin2bcd(hr));      // REG 2
  63.  //i2c_write(bin2bcd(dow));      // REG 3
  64.  i2c_write(bin2bcd(day));      // REG 4
  65.  i2c_write(bin2bcd(mth));      // REG 5
  66.  i2c_write(bin2bcd(year));      // REG 6
  67.  i2c_write(0x80);            // REG 7 - Disable squarewave output pin
  68.  i2c_stop();
  69. }
  70.  
  71. void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year)
  72. {
  73.  i2c_start();
  74.  i2c_write(0xD0);
  75.  i2c_write(0x03);            // Start at REG 3 - Day of week
  76.  i2c_start();
  77.  i2c_write(0xD1);
  78.  //dow  = bcd2bin(i2c_read() & 0x7f);   // REG 3
  79.  day  = bcd2bin(i2c_read() & 0x3f);   // REG 4
  80.  mth  = bcd2bin(i2c_read() & 0x1f);   // REG 5
  81.  year = bcd2bin(i2c_read(0));            // REG 6
  82.  i2c_stop();
  83. }
  84.  
  85. void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
  86. {
  87.  i2c_start();
  88.  i2c_write(0xD0);
  89.  i2c_write(0x00);            // Start at REG 0 - Seconds
  90.  i2c_start();
  91.  i2c_write(0xD1);
  92.  sec = bcd2bin(i2c_read() & 0x7f);
  93.  min = bcd2bin(i2c_read() & 0x7f);
  94.  hr  = bcd2bin(i2c_read(0) & 0x3f);
  95.  i2c_stop();
  96.  
  97. }
  98.  
  99. BYTE bin2bcd(BYTE binary_value)
  100. {
  101.  BYTE temp;
  102.  BYTE retval;
  103.  
  104.  temp = binary_value;
  105.  retval = 0;
  106.  
  107.  while(1)
  108.  {
  109.    // Get the tens digit by doing multiple subtraction
  110.    // of 10 from the binary value.
  111.    if(temp >= 10)
  112.    {
  113.      temp -= 10;
  114.      retval += 0x10;
  115.    }
  116.    else // Get the ones digit by adding the remainder.
  117.    {
  118.      retval += temp;
  119.      break;
  120.    }
  121.  }
  122.  
  123.  return(retval);
  124. }
  125.  
  126.  
  127. // Input range - 00 to 99.
  128. BYTE bcd2bin(BYTE bcd_value)
  129. {
  130.  BYTE temp;
  131.  
  132.  temp = bcd_value;
  133.  // Shifting upper digit right by 1 is same as multiplying by 8.
  134.  temp >>= 1;
  135.  // Isolate the bits for the upper digit.
  136.  temp &= 0x78;
  137.  
  138.  // Now return: (Tens * 8) + (Tens * 2) + Ones
  139.  
  140.  return(temp + (temp >> 2) + (bcd_value & 0x0f));
  141. }

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Real Time Clock o el DS1307 desatado
« Respuesta #144 en: 01 de Abril de 2010, 19:03:24 »
Referente al post anterior ya resolvi el problema, era el cristal que me cogia interferencias.
Problema resuelto
Saludos
Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Real Time Clock o el DS1307 desatado
« Respuesta #145 en: 11 de Julio de 2010, 04:58:08 »
Sólo reabro el hilo para comentar que la biblioteca de REDPIC también funciona correctamente con el DS3231. Tenía oído que eran compatibles al 100% pero gracias a tu biblioteca he podido comprobarlo en un "periquete".

Echaré un vistazo más detallado a los datasheets para ver si el ds3231 incluye funciones no presentes en el ds1307 que merezcan ser añadidas a la librería.

Gracias RedPIC.

Edito: Bueno, pues exactamente son iguales para configurar la fecha y la hora, pero ahí terminan las similitudes.
El ds3231 tiene los bytes de control en las direcciones 0Eh y 0Fh, por lo que la función ds1307_init no le sirve.
Otros detalles interesantes del ds3231 frente al ds1307 es que incluye dos alarmas capaces de arrancar la salida SQW, un sensor de temperatura (con una precisión de +/- 3ºC) y un Reset capaz de despertar "suavemente" al PIC en caso de que haya problemas de alimentación.

« Última modificación: 13 de Julio de 2010, 12:50:41 por jfmateos2 »

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Real Time Clock o el DS1307 desatado
« Respuesta #146 en: 14 de Julio de 2010, 07:18:25 »
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().

Desconectado afonseca

  • PIC10
  • *
  • Mensajes: 1
Re: Real Time Clock o el DS1307 desatado
« Respuesta #147 en: 29 de Julio de 2010, 20:40:58 »
tal vez sea el programa.
yo lo programe todo en asm y para el 16f877a.

nose revisare el codigo y la simulacion para ver por que no sale.
Pensé que estabas usando también la biblioteca que puso Redpic :p.

Como mencioné, ya conseguí que funcionara, modificando la función ds1307_init así:

Código: C
  1. void ds1307_init(int val){
  2.  
  3.    byte seconds = 0;
  4.  
  5. #ifndef USE_INTERRUPTS
  6.    disable_interrupts(global);
  7. #endif
  8.    i2c_start();
  9.    i2c_write(0xD0);
  10.    i2c_write(0x07);
  11.    i2c_write(val);
  12.    i2c_stop();
  13.  
  14. #ifndef USE_INTERRUPTS
  15.    enable_interrupts(global);
  16. #endif

Eso es lo que sería estrictamente necesario para configurar el DS1307, el código extra que agregó Redpic tiene que ver con lo que mencionó aquí, aunque yo no encontré ese texto en la hoja de datos. Se puede dejar el código que corrige ese detalle (aunque repito, no lo veo en la hoja de datos) si antes de enviar el comando de configuración se detiene la comunicación I2C y se abre nuevamente en lugar de solamente darle un reinicio como en el código original de Redpic, es decir, así:

Código: C
  1. void ds1307_init(int val){
  2.  
  3.    byte seconds = 0;
  4.  
  5. #ifndef USE_INTERRUPTS
  6.    disable_interrupts(global);
  7. #endif
  8.  
  9.    i2c_start();
  10.    i2c_write(0xD0);
  11.    i2c_write(0x00);
  12.    i2c_start();
  13.    i2c_write(0xD1);
  14.    seconds = ds1307_bcd2bin(i2c_read(0));
  15.    i2c_stop();
  16.    seconds &= 0x7F;
  17.  
  18.    delay_us(3);
  19.  
  20.    i2c_start();
  21.    i2c_write(0xD0);
  22.    i2c_write(0x00);
  23.    i2c_write(ds1307_bin2bcd(seconds));
  24.    i2c_stop();  // Stop condition, corrects problem with configuration byte not being applied correctly
  25.    
  26.    i2c_start();
  27.    i2c_write(0xD0);
  28.    i2c_write(0x07);
  29.    i2c_write(val);
  30.    i2c_stop();
  31.  
  32. #ifndef USE_INTERRUPTS
  33.    enable_interrupts(global);
  34. #endif
  35.  
  36. }

Con cualquiera de esas dos versiones el código simula correctamente. Como dije, lamentablemente no tengo un DS1307 a la mano para probar el circuito.

Efectivamente, probé el cambio propuesto por GeSHi y la simulación del pin Sout en Proteus 7.6 sp0 funciona bien. Gracias a la gente del foro.

Desconectado fabito

  • PIC10
  • *
  • Mensajes: 2
Re: Real Time Clock o el DS1307 desatado
« Respuesta #148 en: 05 de Agosto de 2010, 20:05:04 »
Buenas Maestro Red Pic, tengo una duda acerca de una parte del driver _ds1307.c, especificamente en la funcion ds1307_bin2bcd(byte binary_value).
perdón por la ignorancia pero al entrar en el bucle de while no quedará alli en un bucle infinito? Una vez mas perdón por la pregunta, pero la duda me mata..

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Real Time Clock o el DS1307 desatado
« Respuesta #149 en: 31 de Agosto de 2010, 22:03:45 »
Hola.

Me atrevo a postear aquí una modificación de la librería del maestro RedPic para el DS1307 en la cual uso la configuración AM/PM para la hora  :oops: .

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. /// ++ : Configuracion AM/PM by MLO                                                                                 ///
  38. ///////////////////////////////////////////////////////////////////////////////////////
  39.  
  40. #ifndef RTC_SDA
  41. #define RTC_SDA  PIN_C4
  42. #define RTC_SCL  PIN_C3
  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. byte ds1307_bin2bcd(byte binary_value, int1 hora);
  59. byte ds1307_bcd2bin(byte bcd_value, int1 hora);
  60.  
  61. void ds1307_init(int val)
  62. {
  63.         i2c_start();
  64.         i2c_write(0xD0); //Direccion del DS1307 Modo Escritura
  65.         i2c_write(0x00); //Pongo a [0] para garantizar el CH=0
  66.         i2c_stop();
  67.         i2c_start();
  68.         i2c_write(0xD0); //Direccion del DS1307 Modo Escritura
  69.         i2c_write(0x07); //Selecciono el Byte de Ctrl
  70.         i2c_write(val);  //Envio el dato segun configuracion
  71.         i2c_stop();
  72. }
  73.  
  74. void ds1307_set_date_time(byte day, byte mth, byte year, byte dow, byte hr, byte min, byte sec)
  75. {
  76.         sec &= 0x7F;
  77.         hr &= 0x7F;//0x3F
  78.  
  79.         i2c_start();
  80.         i2c_write(0xD0);
  81.         i2c_write(0x00);
  82.         i2c_write(ds1307_bin2bcd(sec,0));
  83.         i2c_write(ds1307_bin2bcd(min,0));
  84.         i2c_write(ds1307_bin2bcd(hr,1));
  85.         i2c_write(ds1307_bin2bcd(dow,0));
  86.         i2c_write(ds1307_bin2bcd(day,0));
  87.         i2c_write(ds1307_bin2bcd(mth,0));
  88.         i2c_write(ds1307_bin2bcd(year,0));
  89.         i2c_stop();
  90. }
  91.  
  92. void ds1307_get_date(byte &day, byte &mth, byte &year, byte &dow)
  93. {
  94.         i2c_start();
  95.         i2c_write(0xD0);
  96.         i2c_write(0x03);
  97.         i2c_start();
  98.         i2c_write(0xD1);
  99.         dow  = ds1307_bcd2bin(i2c_read() & 0x7f,0);
  100.         day  = ds1307_bcd2bin(i2c_read() & 0x3f,0);
  101.         mth  = ds1307_bcd2bin(i2c_read() & 0x1f,0);
  102.         year = ds1307_bcd2bin(i2c_read(0),0);
  103.         i2c_stop();
  104. }
  105.  
  106. void ds1307_get_time(byte &hr, byte &min, byte &sec)
  107. {
  108.         i2c_start();
  109.         i2c_write(0xD0);
  110.         i2c_write(0x00);
  111.         i2c_start();
  112.         i2c_write(0xD1);
  113.         sec = ds1307_bcd2bin(i2c_read() & 0x7f,0);
  114.         min = ds1307_bcd2bin(i2c_read() & 0x7f,0);
  115.         hr  = ds1307_bcd2bin(i2c_read(0) & 0x7f,1);//0x3f
  116.         i2c_stop();
  117. }
  118.  
  119. /*
  120. char ds1307_read_nvram_byte(char addr)
  121. {
  122.         char retval;
  123.        
  124.         i2c_start();
  125.         i2c_write(0xD0);
  126.         i2c_write(addr);
  127.        
  128.         i2c_start();
  129.         i2c_write(0xD1);
  130.         retval = i2c_read(0);
  131.         i2c_stop();
  132.  
  133.         return(retval);
  134. }
  135.  
  136. void ds1307_write_nvram_byte(char addr, char value)
  137. {
  138.         i2c_start();
  139.         i2c_write(0xD0);
  140.         i2c_write(addr);
  141.         i2c_write(value);
  142.         i2c_stop();
  143. }
  144. /*
  145. void ds1307_get_day_of_week(char* ptr){
  146.  
  147.    byte lday;
  148.    byte lmonth;
  149.    byte lyr;
  150.    byte ldow;
  151.    ds1307_get_date(lday,lmonth,lyr,ldow);
  152.    sprintf(ptr,"%s",days_of_week[ldow]);
  153. }
  154. */
  155. ///////////////////////////////////////////////////////////////////////////////
  156.  
  157. byte ds1307_bin2bcd(byte binary_value, int1 hora){
  158.  
  159.   byte temp;
  160.   byte retval;
  161.   int1 FlagAmPm;
  162.  
  163.   temp = binary_value;
  164.   if(hora)
  165.   {
  166.         FlagAmPm = bit_test(temp,5);
  167.         temp &=0x0f;
  168.   }
  169.   retval = 0;
  170.   while(true){
  171.     if(temp >= 10){
  172.       temp -= 10;
  173.       retval += 0x10;
  174.     }else{
  175.       retval += temp;
  176.       break;
  177.     }
  178.   }
  179.   if(hora)
  180.   {
  181.     bit_set(retval,6);          //Para configurar la hora modo AM/PM
  182.         if(FlagAmPm)
  183.                 bit_set(retval,5);
  184.   }
  185.   return(retval);
  186. }
  187.  
  188. byte ds1307_bcd2bin(byte bcd_value,int1 hora){
  189.  
  190.   byte temp;
  191.   int1 FlagAmPm;
  192.   byte Salida;
  193.  
  194.   temp = bcd_value;
  195.   if(hora)
  196.   {
  197.         FlagAmPm = bit_test(temp,5);
  198.         temp &=0x1f;
  199.   }
  200.   temp >>= 1;
  201.   temp &= 0x78;
  202.   if(Hora)
  203.   {
  204.     Salida = temp + (temp >> 2) + (bcd_value & 0x0f);
  205.         if(FlagAmPm)
  206.                 bit_set(Salida,5);
  207.         return(Salida);
  208.   }    
  209.   else
  210.         return(temp + (temp >> 2) + (bcd_value & 0x0f));
  211. }

Y aquí un videillo de una aplicación.


Saludos
« Última modificación: 01 de Septiembre de 2010, 16:57:08 por un Moderador, Razón: cambio .com por .net en el code »
El papel lo aguanta todo


 

anything