TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: RedPic en 05 de Agosto de 2006, 16:40:49

Título: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 05 de Agosto de 2006, 16:40:49
Circuito auxiliar de Reloj en Tiempo Real mediante un DS1307
 
Descripción:

Nuestros PIC's no saben en qué día y hora viven. Perdidos en el no-tiempo, la realidad analógica o digital es un continuo donde las fracciones de tiempo superior a algunos milisegundos son entes abstractos e inasibles. Anclados en patrones de frecuencia decimales que no son divisibles por sus primos binarios, esclavos del redondeo, siempre les sobran o les faltan unos microsegundos para dar el Segundo Perfecto. Como Reloj en Tiempo Real un PIC abandonado a su cuarzo y a sus divisores, preescalers y postescalers, simplemente no da la talla.
 
Y ahí es donde entran los amables señores de Dallas Maxim (http://www.maxim-ic.com/) y su cucaracha octópoda clockeadora: el DS1307, intitulada por ellos mismos como un "64 x 8, Serial, I2C Real-Time Clock" O sea un corazón de reloj con alguna RAM adicional (no volátil ya que es asistida por una batería de Litio que la mantiene a flote mientras no le falte el fuelle de los voltios).
 
Este proyecto consiste esencialmente en poner en santa compaña a nuestro PIC con su Reloj colgando del BUS RRBOARD2 (http://www.todopic.com.ar/foros/index.php?topic=2300.0) (compatible), aprovechando que ambos hablan en I2C, por lo que es de esperar que no tengamos grandes problemas para llevarlo a buen puerto.
 
Para este proyecto he tirado, además de la información pertinente ofrecida por los amables señores de Dallas Maxim de las siguientes fuentes de información:

El buscador (http://www.todopic.com.ar/foros/index.php?action=search2) del Foro Todopic poniendo DS1307 en la casilla de búsqueda oportuna. (Algunos cientos de referencias pacientemente leídas y digeridas).

El artículo Another DS1307 Driver (http://www.ccsinfo.com/forum/viewtopic.php?t=23057&view=next&sid=df218e641edc860bac8f6279972dc797) publicado en el Foro oficial de CCS C, cuya paternidad corresponde a  un tal Phil, basado según dice él mismo en el trabajo de un tal Tullos.

El articulo DS1307 RTC and 24LC256 EEPROM on the same i2c bus problem (http://www.ccsinfo.com/forum/viewtopic.php?t=26942&view=next&sid=9d22ede0a603d09d023c3a0f1c318c4f) publicado en el mismo foro que el anterior pero esta vez realizado por unos tales Birumher y Highwind en un mano a mano digno de un buen par de toreros.

Y por último el artículo DS1307 routines (http://www.pic-c.com/forum/old/messages/4275.html) que para no ser menos también procede del Foro CCS C y de donde he sacado la idea de habilitar y/o deshabilitar las interrupciones.

Todo esto adobado por supuesto con San Google Bendito (http://www.google.es) donde escribiendo PIC y DS1307 aparece mas información de la que estoy dispuesto a digerir.
 
Entre esta información y mi propio jugo de cerebro, destilado en estos últimos días, tengo el gusto de presentaros completo este pequeño ejercicio de integración temporal de un PIC y sus circunstancias.
 
Implementación:
 
La implementación consiste en posibilitar la comunicación I2C entre la RRBOARD2 y el DS1307 y explicar lo fundamental de este chip, mostrándoos a continuación qué podemos hacer con él y qué no (visto desde el punto de vista de dentro de un PIC claro está, ya que es de cajón y no pienso comentar por ejemplo que tragarse un DS1307 sin quitarle las puntiagudas patillas puede ser incompatible con la vida, tal y como la conocemos).
 
No pienso repetir palabra por palabra, como un vulgar loro de bar portuario, lo que ya dice de forma meridianamente clara el Datasheet del DS1307, así que tras poneros el Diagrama de Bloques del mismo (extraído de dicho datasheet) paso a comentar algunas circunstancias interesantes a tener en cuenta.
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_block.gif)
 
1º.- El cristal de cuarzo ha de ser de 32.768 Khz Arcano designio que tiene que ver con que 2^15 = 32.768 por lo que esa frecuencia es divisible de forma exacta binariamente para generar 1000, o sea nuestro segundo perfecto.
 
2º.- La alimentación es doble. Por un lado el VCC de nuestro circuito normal, el del PIC, y por otro una Batería de Litio que va a permitir que el reloj siga su normal funcionamiento aún cuando apaguemos el PIC. (Esta batería sirve también para mantener viva la NVRAM adicional de que disponemos) El mismo DS1307 se encarga de realizar la conmutación entre una y otra por lo que no tenemos que tener en cuenta esta circunstancia y podemos olvidarnos de ella (salvo la de cambiar la pila cuando se agote)
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_output_frequency.gif)
 
3º.- El DS1307 tiene un pin de salida que debidamente habilitado nos ofrece una onda cuadrada con las frecuencias que puedes ver en la tabla superior. Esta salida es a colector abierto por lo que es necesario, si la queremos utilizar para inyectarla en cualquier otro circuito, colocarle una resistencia pull-up de unos 10 Kohm a VCC.

Ten en cuenta que si nuestro DS1307 va a pasar grandes periodos de tiempo alimentándose solo de la batería el tener esta opción de salida habilitada consume cientos de veces mas intensidad que sin ella por lo que podemos dejar la batería tiesa en muy poco tiempo. Si no es necesario es preferible deshabilitar esta opción (mas adelante veremos cómo hacerlo).
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_registers.gif)
 
4º.- En la tabla superior podéis ver la estructura de la NVRAM, donde se mezclan tanto los registros de configuración, como los de salvaguarda de la fecha y hora del dispositivo, como asimismo los bancos de RAM de libre disposición para el usuario.

En esta tabla tener en cuenta que el Bit 7 de la dirección 0x00 hay que colocarla a 0 para que todo funcione. Es el Enable general del dispositivo.
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_control_register.gif)
 
5º.- El byte alojado en la dirección 0x07 es el Control Register que nos permite configurar la función del pin de salida según los siguientes condicionantes:

El bit 4, SQWE, habilita o deshabilita la función de salida externa del pin Out.

El bit 7, OUT, establece el estado del pin de salida cuando SQWE está deshabilitado. Si OUT es 1 y SQWE es 0 entonces el pin de salida está en alto indefinidamente, si OUT es 0 y SQWE es 0 entonces el pin de salida está por el contrario en bajo indefinidamente.

Los bits 0 y 1 sirven para seleccionar la frecuencia de salida cuando SQWE está en alto según la tabla expuesta en 2º.

Esquema: 

Este el circuito propuesto por el fabricante como típico para su buen funcionamiento. Es el que vamos a implementar exactamente hasta el último detalle.
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_typical.gif)
 
Del pinout nada que añadir:

(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_pins.gif)
 
Y este es el esquema definitivo que vamos a construir, en el que podemos destacar algunos detalles:
 
1º.- La comunicación con la RRBOARD2 la realizamos mediante nuestro buen amigo el conector CON-ML10 para cable plano de 10 hilos (alimentación y un puerto completo de 8 bits)
 
2º.- JP1-PB y JP3-PC permiten seleccionar la conexión de los SDA y SCL del I2C a los pines 0..1 ó 3..4 del puerto al que estén conectados (recordad de la RRBOARD2 está diseñada para las familias 18F4550 y 16F877 y el I2C lo implementa la primera en los pines RB0 y RB1 y la segunda en los RC3 y RC4) 
 
3º.- JP2-OUT Permite conectar o desconectar el pin Out del DS1307 al pin Rx3 del puerto de la RRBOARD2 (Muy útil para usarlo con la Interrupción Externa 2 del 18F4550)
 
4º.- Dependiendo de dónde conectemos nuestro circuito en la RRBOARD2 podemos necesitar o no las resistencias Pull-Up imprescindibles para el bus I2C. Si lo conectamos al PORTB tenemos disponibles la internas del PIC, en cualquier otro caso podemos hacer uso del jumper JP3-PU para conectar dichas resistencias Pull-Up a VCC.
 
5º.- Añadimos ademas el jumper OUT para poder utilizar externamente la señal de onda cuadrada del pin Out del DS1307.
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_schema.gif) 

Circuito impreso:
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_pcb_board.gif)

Fotografías:
 
Y aquí el muchacho en plenitud de facultades:
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_foto_01_todo_el_sistema.gif) 

(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_foto_02_en_detalle.gif)

Funcionando con el software de Test:
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_dump_02_definitivo.gif) 

Recursos:
 
Descargar Datasheet (http://picmania.garcia-cuervo.net/recursos/redpicdatasheets(/rtc/ds1307.pdf) del

DS1307 (PDF 875 Kb)
 
Descargar Librería Driver (http://picmania.garcia-cuervo.net/recursos/_ds1307.c) para CCS C DS1307
 
Descargar Programa de Test rtc.c (http://picmania.garcia-cuervo.net/recursos/_rtc.c)
 
Descargar Esquema y PCB (http://picmania.garcia-cuervo.net/recursos/_rtc.zip) para Eagle

 :mrgreen:  :-/  :mrgreen:

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 05 de Agosto de 2006, 16:41:16
Software:
 
Primero y antes que nada la librería Driver CCS C para el DS1307. Como comenté mas arriba esta librería es un gazpacho entre las varias que he encontrado por esos mundos de Dios fundamentalmente las expuestas en la primera parte de este post.
 
Las cosas que yo personalmente he introducido en este driver son:
 
Parámetros pasados a ds1307_init() para configurar en el inicio la función OUT del DS1307.
 
La funcionalidad disable_interrupts(global) / enable_interrupts(global) en cada una de las funciones definidas dependiendo del #define use_interrups en el programa principal.
 
Función ds1307_get_day_of_week() que me devuelve el string con el nombre del día de la semana en la fecha actual. (totalmente nueva y que no he encontrado por ahí).
 
He añadido las funciones necesarias para escribir y leer todos los registros del DS1307 ds1307_read_nvram_byte() y ds1307_write_nvram_byte()

Código: C
  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. ///////////////////////////////////////////////////////////////////////////////

Y por último el programa de Test de todo esto.
 
Al inicio  podéis ver la inclusión y definición necesaria para el uso de la librería _ds1307.c.
 
He implementado la Interrupción Externa 2 del 18F4550 de la RRBOARD2 para que baile al son del OUT del DS1307, detectando los flancos alternativos de la onda cuadrada que me emite y encendiendo y apagando el LED conectado a PIN_RE0.
 
Antes de entrar en el bucle infinito While(true) del main() realiza un completo chequeo y muestreo de TODAS las funciones disponibles en el Driver.
 
He añadido también un mini-menú que permite activar o desactivar la monitorización de la fecha y la hora mediante el canal RS-232.
 
En el fuente siguiente hay una función inicial de puesta en hora del DS1307 que posteriormente he comentado, solo la uso una vez y después con el DS1307 perfectamente sincronizado no es necesario utilizarla más.
 
Código: C
  1. // Real Time Clock & NVRAM
  2. // Hardware DS1307 of Dallas Maxim
  3. // With interface I2C
  4.  
  5. #include <18f4550.h>
  6. #fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
  7. #use delay(clock=20000000)
  8. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  9.  
  10. // Libreria DS1307.c //////////////////////////////////////////////////////////
  11.  
  12. #define RTC_SDA  PIN_B0
  13. #define RTC_SCL  PIN_B1
  14.  
  15. #define USE_INTERRUPTS 1
  16.  
  17. #include <_ds1307.c>
  18.  
  19. ///////////////////////////////////////////////////////////////////////////////
  20.  
  21. const char Version[]="1.0.D\0";
  22.  
  23. int1 flanco=0;
  24. int1 dump,kdump;
  25. int  n,i=0x00;
  26. char c=0x00;
  27. char rec=0x00;
  28.  
  29. byte sec;
  30. byte min;
  31. byte hrs;
  32. byte day;
  33. byte month;
  34. byte yr;
  35. byte dow;
  36. char sdow[11];
  37.  
  38. // INTERRUPCION por RECEPCION SERIE -------------------------------------------
  39.  
  40. #int_rda
  41. void serial_isr() {
  42.  
  43.    rec=0x00;
  44.    if(kbhit()){
  45.      rec=getc();
  46.      if(rec=='o'){ dump=1; }
  47.      if(rec=='f'){ dump=0; }
  48.      rec=0x00;
  49.    }
  50. }
  51.  
  52. // INTERRUPCION por EXT2 Clock Out --------------------------------------------
  53.  
  54. #int_ext2
  55. ext2_handler() {
  56.  
  57.    if(flanco==1){
  58.       ext_int_edge(2,H_TO_L);
  59.       output_high(PIN_E0);
  60.    }else{
  61.       ext_int_edge(2,L_TO_H);
  62.       output_low(PIN_E0);
  63.    }
  64.    ++flanco;
  65. }
  66.  
  67. //-----------------------------------------------------------------------------
  68.  
  69. void flash_porte(void){
  70.  
  71.    for(i=0;i<3;i++){
  72.       output_e(0x07);
  73.       delay_ms(75);
  74.       output_e(0x00);
  75.       delay_ms(75);
  76.    }
  77. }
  78.  
  79. void lee_y_transmite_date_and_time(void){
  80.  
  81.    ds1307_get_day_of_week((char*) sdow);
  82.    ds1307_get_date(day,month,yr,dow);
  83.    ds1307_get_time(hrs,min,sec);
  84.    printf("\f\%s \%02d/\%02d/\%02d ",sdow,day,month,yr);
  85.    printf("\%02d:\%02d:\%02d\r\n", hrs,min,sec);
  86. }
  87.  
  88. void main() {
  89.  
  90.    disable_interrupts(global);
  91.    disable_interrupts(int_timer1);
  92.    disable_interrupts(int_rda);
  93.    disable_interrupts(int_ext);
  94.    disable_interrupts(int_ext1);
  95.    disable_interrupts(int_ext2);
  96.    setup_adc_ports(NO_ANALOGS);
  97.    setup_adc(ADC_OFF);
  98.    setup_spi(FALSE);
  99.    setup_psp(PSP_DISABLED);
  100.    setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  101.    setup_timer_0(RTCC_OFF);
  102.    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  103.    setup_timer_2(T2_DISABLED,0,1);
  104.    setup_timer_3(T3_DISABLED);
  105.    setup_comparator(NC_NC_NC_NC);
  106.    setup_vref(FALSE);
  107.    port_b_pullups(FALSE);
  108.    set_tris_b(0b00000111);
  109.    set_tris_e(0b00010000);
  110.    output_e(0x00);
  111.    set_tris_c(0b10000000);
  112.  
  113.    delay_ms(500);
  114.    printf("\r\n");
  115.    printf("[RRBOARD2] Real Time Clock version %s\r\n",version);
  116.    printf("based on DS1307 Dallas Maxim Hardware\r\n\n");
  117.    printf("Available RS232 commands:\r\n");
  118.    printf("  [o] Dump Date & Time ON\r\n");
  119.    printf("  [f] Dump Date & Time OFF\r\n\n");
  120.    flash_porte();
  121.  
  122.    ext_int_edge(2,H_TO_L);
  123.    flanco=0;
  124.  
  125.    enable_interrupts(int_ext2);
  126.    enable_interrupts(int_rda);
  127.    enable_interrupts(global);
  128.  
  129.    // Inicializa DS1307
  130.    printf("Inicializando DS1307 ...\r\n\n");
  131.    ds1307_init(DS1307_OUT_ON_DISABLED_HIHG | DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);
  132.  
  133.    // Set date for -> 5 Agosto 2006 Viernes
  134.    // Set time for -> 02:50:00
  135.    // printf("Set Date & Time to ...\r\n");
  136.    // ds1307_set_date_time(5,8,6,5,2,50,00);
  137.  
  138.    // Lee Fecha y Hora actual y transmite
  139.  
  140.    printf("Fecha y Hora actual en el DS1307\r\n\n");
  141.    lee_y_transmite_date_and_time();
  142.    printf("\r\n\n");
  143.  
  144.    // Test de RAM -> primero Write, segundo Read
  145.    printf("Test de la NVRAM interna (Write and read) ...\r\n\n");
  146.    for(i=Start_user_address_nvram;i<end_user_address_nvram+1;i++){
  147.       ds1307_write_nvram_byte(i,i);
  148.    }
  149.    n=0;
  150.    for(i=Start_user_address_nvram;i<end_user_address_nvram+1;i++){
  151.       c=ds1307_read_nvram_byte(i);
  152.       printf("%X ",c);
  153.       if(++n==0x0f){
  154.          n=0;
  155.          printf("\r\n");
  156.       }
  157.    }
  158.    printf("\r\n");
  159.  
  160.    dump = 0;
  161.    kdump= 1;
  162.  
  163.    do{
  164.  
  165.       if(dump==1){
  166.          if((dump!=kdump)&&dump==1){
  167.             printf("Set Dump ON\r\n\n");
  168.             kdump=dump;
  169.          }
  170.          delay_ms(1000);
  171.          lee_y_transmite_date_and_time();
  172.       }else{
  173.          if((dump!=kdump)&&dump==0){
  174.             printf("\r\nSet Dump OFF\r\n\n");
  175.             kdump=dump;
  176.          }
  177.       }
  178.    } while (TRUE);
  179. }

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: BrunoF en 05 de Agosto de 2006, 16:51:51
Hola Diego. ¡Excelente trabajo!
Justamente ahora me iba a poner a darles una aplicacion a 2 HT1380 que tengo tirados. Veo que son muy similaresm, aunque los HT1380 no tienen ni para conectarles bateria de respaldo ni interrupciones.
Pero bueno...quise barato...y eso es lo que me dieron.
Voy a ver si tus rutinas sirven para el HT1380 ya que me vendrian bien, tengo ganas de hacer mi segundo programa en C.
Saludos.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jfh900 en 05 de Agosto de 2006, 17:17:14
Diego una curiosidad, con que haces la rotulación de las fotos que te queda tan bien.

Un saludo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 05 de Agosto de 2006, 17:28:14
Jesús:

Edito con una herramienta al alcance de todos: El MS Paint del Güindous

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jfh900 en 05 de Agosto de 2006, 18:21:00
Joer Diego, no dejas de sorprenderme  :D

Un saludo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Nocturno en 06 de Agosto de 2006, 03:25:15
Te habrás quedado agusto después de semejante parto, eh.
Enhorabuena Diego. Adoptaré alguna cosilla para la Wiki-PIC  (http://wiki-pic.elrebujito.es) con tu permiso  :P
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: LordLafebre en 06 de Agosto de 2006, 03:32:45
Impecable, como siempre...  :-/ :-/ :-/
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: BrunoF en 06 de Agosto de 2006, 14:58:47
Redpic:
Estoy haciendo un proyecto con un HT1380. Sus registros son bastantes parecidos(excepto el registro CONTROL).
¿Tenes idea de cómo hacer para modificar el selector de 12/24 horas sin modificar la hora? Por lo que leí en el datasheet es imposible, ya que al escribir el bit 7, hay que escribir los otros bits restantes, lo que afectaría la hora.
Por lo tanto, ¿la única opción que queda es leer la hora del STK, guardarla y volver a escribir la hora actual seteando el bit 12/24 a gusto recien ahí?

Saludos y gracias.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 06 de Agosto de 2006, 15:17:41
Exacto Bruno.

Si te fijas al DS1307 le pasa lo mismo. El bit de control 12/24 horas está en el registro 02H que es el que guarda también la hora actual.

Asi que para cambiar el modo 12/24 habría que leer el registro completo, cambiar el bit y volver a escribir el byte del registro.

Como es el de la Hora completa no debe haber ningún problema salvo una única situación:

que el cambio se produzca algunos microsegundos antes de un cambio de hora, ya que entonces podría perder una hora completa. Leída la anterior, incrementada en el DS1307 al seguir computado el tiempo real, que se perdería al volver a poner la anterior por el cambio que hemos realizado entretanto.

Si colocamos a nuestro programa una salvaguarda para cambiar de modo como podría ser que esperase a que el segundo estuviese entre 0 y 58 para realizar el cambio sin interferir en ningún cambio de hora no habría ningún tipo de problema.

Un saludo.

 
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 06 de Agosto de 2006, 15:24:15
Te habrás quedado agusto después de semejante parto, eh.
Enhorabuena Diego. Adoptaré alguna cosilla para la Wiki-PIC  (http://wiki-pic.elrebujito.es) con tu permiso  :P

La verdad, Manolo, es que sí. Intento ponerlo todo tan claro, tan explicado, con tantos detalles, tan tan tan ... que termino exhausto y con ganas de terminar como sea, empiezo la novela con ganas, energía e ilusión y la completo totalmente derrotado y preguntandome si sirve para algo y no estoy simplemente haciendo el idiota ...  :mrgreen:

(mi esposa lo tiene muy claro y me lo dice expresamente)

P.D. Adopta y adapta lo que te de la gana. Lo mio es tuyo.
 
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: BrunoF en 06 de Agosto de 2006, 15:46:31
Ok Diego. ¡Gracias!
Es una lastima tener que incluir en el programa que contemple cuándo no y cuándo si cambiar el modo...
Pero no queda otra...la excepción que comentaste era mi mayor temor.
Entonces lo mismo pasará con el bendito CH...aunque en caso de ocurrir la excepción, no sería tan grave.
Saludos y gracias.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Marioguillote en 07 de Agosto de 2006, 00:51:21

 ........    y la completo totalmente derrotado y preguntandome si sirve para algo y no estoy simplemente haciendo el
idiota ... 


Ojalá muchos más tuviéramos la décima parte del don de "saber", "saber dar" y "saber dar sin mirar a quién".
Celebro ese "don" que tenés, amigo RedPic.

Gracias y Saludos a todos.

Mario
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RaDoN en 07 de Agosto de 2006, 14:24:04
Que tio jeje!! Y toma... y dale !! No para, muy buen ... no se como llamerle (clase, articulo), ¡¡eres una máquina didactica!! ;)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Y@el en 08 de Agosto de 2006, 12:11:26
Yo creo que clase seria mejor...

Y claro con semejante maestro.

Gracias por la paciencia para comentar cada dibujo....


Yoel
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: pikman en 08 de Agosto de 2006, 14:47:53
Diego, vayan mis felicitaciones por tu trabajo, mas que didactico lo tuyo, impecable, hace años que utilizo el ds1307 es una exelente opcion, nunca CCS creo libreria para este chip, aunque si para el ds1302, bueno que mas puedo decir...........esta todo dicho.

saludos
ARIEL
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Mario en 09 de Agosto de 2006, 16:43:51
Muy buen trabajo, bien estructurado y explicado.

Para mí que apenas está aprendiendo C, esto me va a ayudar bastante.

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Kedutpic en 15 de Agosto de 2006, 12:43:51
man ta chevre el tutorial pero sera posible que lo puedas hacer en .asm porque nu se nada de C para que lo pueda probar ok . gracias Y que viva el foro de microcontroladores  :D
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: tithanae en 31 de Octubre de 2006, 13:56:45

 Estimados jovenes antes que nada paso a reconocer el trabamo hecho por cada uno de ustedes en lo que significa este RTC (DS1307) en especial a Redpic por su valioso aporte, y tambien a RaDoN por no haberse hecho vencer con el DS1307 y lo hizo funcionar..... 

despues de estas lineas de reconocimiento que nunca estan demas paso a contarles lo que me sucede

la libreria que nos brindo Redpic ya la utilize y creo que bien ya que pudeo escribir y leer bien en la RAM de este chip en cuanto a la hora la coloco y la leo PEROOO.... ahi biene el pero  cuenta leeennto  a razon de un segundo por cada 15 o 10 minutos de ahi dedusco que es el cristal que ocupo ustedes que piensan ....

ya cambie varios (3) cristales y lo mismo parece que en la unica tienda que encontre estos cristales me tomaron el pelo y me dieron de otro valor...................yo digo que es el cristal ya que cuando le puse un frecuencimetro para ver si el cristal me daba los 32.768  y comenzo a contar mas rapido osea que  debe ser el cristal que dicen ustedes .....leyendo por ahi esto le paso a otro colega nuestro y tambien le dijeron que era el cristal lamentablemente el amigo no comenta que solucion encontro les agradeceria mucho sus consejos ya que no quiero comprar cristales ya que como no hay aca en mi pais (bolivia) lo tendre que hacer en españa o argentina y esto me tomaria mucho y mi duda es si no es los cristales mucho tiempo perdido.....

 
un dato  los ds1307 los compre en españa y tarde mucho ya que mi hermana los compro y como no sabe nada de electronica le costo mucho y lamentablemente no tenian los cristales....

por si acaso ya he leido todos los post que pillo el buscador del foro al ingresar ds1307 en total son 4 paginas de resultados

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jucemoar en 06 de Noviembre de 2006, 23:55:31
solo una pregunta  sera  que se  puede  hacerlo pero  con display de  7 seg.  como yo lo  quiero no  con lcd  gracias  julio  ....  jucemoar@hotmail.com  respondanme  please
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: tithanae en 19 de Noviembre de 2006, 09:56:56
amigo redpic estoy aprendiendo de lo que has compartido con nosotros y quisiera hacerte una pregunta en que parte de la funcion de inicializacion  del ds1307 colocas el CH a uno

Citar
En esta tabla tener en cuenta que el Bit 7 de la dirección 0x00 hay que colocarla a 1 para que todo funcione. Es el Enable general del dispositivo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 19 de Noviembre de 2006, 11:09:18
Asi me gusta, que me encuentren los bugs. Ja, ja, ja  :D :D :D

Y tu has dado directo en el blanco. Donde digo 1 debo decir 0:

Directamente desde el Datasheet ...

Please note that the initial power-on state of all registers is not defined. Therefore, it is important to
enable the oscillator (CH bit = 0) during initial configuration.


Asi que la frase que escribí debería decir: En esta tabla tener en cuenta que el Bit 7 de la dirección 0x00 hay que colocarla a 0 para que todo funcione.

Esto se hace en ds1307_init(int val) con el truco de leer los segundos, hacer un &= (AND) 0x7F para asegurarnos que el bit 7 está a 0 y reescribir el registro 0x00.

(Ya está corregido en el Post original)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: tithanae en 20 de Noviembre de 2006, 19:13:29
y  yo que pensaba que era un bruto que no podia pillar ese uno en esa rutina.

una pregunta mas redpic si todo me funciona pero el reloj cuenta lento tiene que ser problema de crista no??

gracias
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 21 de Noviembre de 2006, 03:05:16
Si, es el único elemento que creo que interviene activamente en la velocidad del reloj.

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: togarha en 23 de Enero de 2007, 09:05:13
Buenas,

no tendreis lo mismo para dspic/pic24 y c30 verdad?

un saludo,
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 23 de Enero de 2007, 11:07:30
No.




(Ja ja ja  :D :D :D Es broma, no se si algun amigo tendrá algo para los hermanos mayores.  :mrgreen:)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 23 de Enero de 2007, 16:43:39
saludos redpic y amigos del foro.



el ds1307 se estan actualizando los datos constantemente, es necesario mandar a leer los meses tambien junto can las horas,seg,min ;

¿al quitarle la alimentacion (VCC) al pic estando el ds1307 con vcc  este sigue contando pero como el micro se ha resetado entonces empesara desde cero y mandará los datos iniciales al ds1307.
esto se puede solucionar, leyendo los minutos antes de iniciar el ds1307 y haci no escribir sino leer el ds1307.?

para el momento de acomodar la min,hor,seg,hor,año se deben tener mas o menos dos pulsadores que segun he leido tienen que manejarse con interrupciones para no parar eel programa preguntando por entardas.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 23 de Enero de 2007, 19:05:34
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 (http://picmania.garcia-cuervo.com/recursos/_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í.


Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 24 de Enero de 2007, 19:00:26
saludos 7y gracias por contestar
aqui viene otra pregunta que no se si este resuelta en C puesto que manejo esambler

s osea que al momento de grabar el pic debo ajustar mas o menos la hora y fecha en iniciar_ds1307 aqui debo cargar el eje: 23 enero 07   16: 58: 00
para que empieze a funcionar el ds1307 y asi no tener que grabar de nuvo en ds1307 y solamente me limitaria a _leer el ds1307.

ya te entiendo amigo.

estoy trabajando con el pic 16f877 y ademas........

la interrupcion sout va al rbo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 24 de Enero de 2007, 19:56:53
puesto que la pila demora mas o menos 10 años?
despues se tendria que grabar denuevo el pic.

entonces probare sin pulsadores.

rbo iria a señal de reloj del ds1307? y manejar por interrupcion.
y asi actualizar los datos?


saludos y gracias


Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 25 de Enero de 2007, 02:17:15
La interrupción que genera el ds1307 no es imprescindible. Solo sirve si necesitas una pauta de tiempos, por ejemplo una interrupción cada segundo.

Cuando tu quieras le preguntas al ds1307 y él te da la hora en ese momento.

Al ds1307 solo hay que ponerlo en hora una vez en diez años.

El 16F877 tiene la interrupción externa por RB0 asi que si deseas detectar la interrupción generada por el ds1307 debes conectarla al sout de éste. Y o activas las pull-ups internas del PORTB o le colocas una pull-up externa a esa línea.

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: KALLITOS en 25 de Enero de 2007, 15:07:58
Hola muchach@s

Uso el DS1307 y funciona de maravillas y comento mas o menos lo que hice:

Al momento de grabar el programa en el pic se designa una posicion de la eeprom del pic la cual inicialmente se encuentra en cero, luego funciona el programa por primera vez y entonces pregunto si la posicion eeprom esta a cero si es verdad pongo a la hora el RTC y pongo en uno la posicion eeprom designada, luego si se reinicia el programa, como la posicion eeprom se encuentra a uno entonces ya no vuelve a grabar la hora en el RTC ( ademas que los valores inicialmente designados ya no concordaran con los reales )

Ahora actualizar los valores por medio de teclado o via rs232 es otro cantar un poco mas complejo  :D :D

Ademas el pulso generado por el RTC tambien puede ser utilizado tanto en display de 7 segmentos como LCD para hacer parpadear los dos puntos que separan las horas de los minutos. Inclusive utilizando la entrada de interrupcion como tal y como indicador de encendido y apagado de los puntos mencionados.

Salu2
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 25 de Enero de 2007, 16:08:04
bueno me llevare esta informacion para la casa yla estudiare mas deetenidamente

saludos y gracias

pero el sout que es de 1hz no es para que se visualice el relos cada segundo?

saludos y gracias
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: alvaro e en 27 de Enero de 2007, 17:26:41
Odio el lenguaje C...

Alguien tendra este firmware en ASM???

alguien me lo podra mandar por mail??

ocara100(a)hotmail.com

Gracias..
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 27 de Enero de 2007, 18:16:09
Yo antes odiaba a los que odiaban al Lenguaje C, después me di cuenta de que lo que realmente odiaba era odiar a los que odian al Lenguaje C. Como la lista concatenada de los distintos odios iba haciéndose demasiado larga decidí solo odiar el odio.

Pero entonces recordé las clases que recibí de estructura lógica de los silogismos cuando tuve que sufrir mi paso por la Universidad, y me di cuenta de que odiar el odio es una pseudo-tautología así que procedí a eliminar la premisa mayor por igualdad, similitud y/o homotecia con la premisa menor, debido a ello eliminando el odiar y el odio me quedé sin nada.

Conclusion u moraleja: Ya no odio. Soy mas feliz y me cabreo mucho menos. Mi esposa, mis amigos y mi estómago me lo agradecen mucho.

Por contraposición y suponiendo que tu petición sobre este firmware en ASM indique una estructura mental como ocurría con la anti-cristiana herejía Maniquea del siglo III d.c. en la que sus seguidores  dividian la creación entre Buenos y Malos, que veían el Universo en blanco y negro, signifique, digo, que tu odio por el Lenguaje C implica indefectiblemente tu amor, devoción, cariño y/o adoración por el Lenguaje ASM me pregunto si no deberías intentar al menos hacerlo tú mismo. Es solo una suposición (un poné que diría cierto amigo mío)

Qué mejor manera de mostrar y demostrar a todo y a todos el amor por una entelequia, como podemos catalogar a un idioma de programación de microprocesadores, que trabajando, sudando y sufriendo con él y en él, conociéndolo hasta sus mas íntimos detalles, manejándolo como puedes manejar tu dedo cuando lo introduces en la nariz para hurgar en ella, con conocimiento, con habilidad, con solvencia, con prestancia, con autoridad: Auctoritas, que decía Arístoteles.

Y además, por si fuera poco, por si no estuviese suficientemente claro, por si acaso no fuera o fuese capáz de explicarme correctamente debo decirte, debo confesarme ante tí, debo desnudar mi alma para proclamar a los cuatro vientos, a los hijos de Eolo: a Bóreas y a Céfiro, que no tengo ni pajolera idea de ASM y que a mi lo que me gusta de verdad es escribir tonterias como esta que acabo de escribir.

Un saludote y a disfrutar, que la vida son dos días.  :mrgreen:



Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Modulay en 27 de Enero de 2007, 19:05:01
Alvaro,sólo tienes que mandar un sms al 5555 con la palabra "hazmeuntrabajito" y lo recibirás al momento.
Coste del mensaje 0.9€
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Marioguillote en 27 de Enero de 2007, 20:24:50
Alvaro una consulta :

Vós no escribís tu mail 

ocara100@hotmail.com 

por el tema de los robots, de las arañas, de los spames ... por eso no ?
Por eso lo escribís con (a) ?

Que astuto, no ? .....
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Nocturno en 28 de Enero de 2007, 03:16:07
Jajaja, genial y brillante la respuesta de Diego, muy aguda la de Modulay, ... pero me quedo con la de Marioguillote. Jajjaaja
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: aitopes en 28 de Enero de 2007, 09:25:50
Mario!!!!
! Sos un capo, mira que preguntarle por ocara100@hotmail.com !

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: J1M en 28 de Enero de 2007, 09:32:15
Bravo!!! :D:D:D
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: dogflu66 en 28 de Enero de 2007, 19:19:21
Recien estuve leyendo los post de este hilo, y quedo magnifico... :shock: :lol:

Lastima que mi tiempo sea tan limitado que apenas puedo seguir los proyectos de los amigos... :8}
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 05 de Febrero de 2007, 14:00:00
saludos
se esta solamenete en simulacion proteus
bueno caballeros para mostrar los resulatdos H;M;SEG
miremos tengo la onda cuadrada a 1hz o sea que cada segundo se estara produciendo una interrupcion por RBO, en este servicio de interrupcion cada segundo
es donde esta la rutina de visualizacion en los displays; estuve dando unos retardos de visualizacion los displays se prenden todos 00 00 01 y se vuenven a apagar  se prenden nuevamente 00 00 02   y asi sucesivamente .

para ver si ustedes me dan instrucciones o recomendacione de como resolver este detalle.

saludos y gracias
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 06 de Febrero de 2007, 12:56:06
saludos y gracias

.Estuve haciendo varias modificaciones para con display pero no se porque el conteo no es igual al lcd.
cuenta ratardado o sea cada 30seg o mas aumenta en 1seg y los diplays se queda con ese valor hasta rato . teniedo en cuenta que yo siempre estoy llamando la rutina leer ds1307 y por que no me estan actualizando los display?. por que no demoran cada seg?
sabiendo que no importado cuando llame a la rutina leer_ds1307 el me debe dar sus valores actualizados o sea si yo llamo a visualizar cada 10seg el debe mostrarme el valor que van cada 10seg.


saludos y gracias
[/quote]
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: aitopes en 06 de Febrero de 2007, 16:08:16
Hola Microcom!

¿Estas usando un simulador? ¿O un circuito de verdad? Si es el primer caso, es bastante logico que no se actualice a "tiempo real".... :mrgreen:

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 06 de Febrero de 2007, 16:56:19
caballero muchas gracias por contestar la verdad estaba esperando alguna sugerencia o detalle al grespecto
le agradesco la claboracion
si es una simulacion porque en lcd si funciona bien?

ADJUNTO EL CIRCUITO
gracias
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: aitopes en 06 de Febrero de 2007, 16:59:30
Seguramente por que al simulador le lleva mas "tiempo de CPU" el calculo cuando hay varios displays LEDs (con multiplexado, etc) que manejar un LCD....

Repito, son solo suposiciones, por que yo no uso simuladores. Solo trato de imaginarme como funcionan. :mrgreen:

Saludos!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: xrom en 07 de Febrero de 2007, 08:12:21
Para los apasionados del ASM.

En el libro Microcontrolador PIC16F84 (http://www.pic16f84a.com/) hay un capitulo dedicado al DS1307.

Espero que les sea de utilidad y felicidades per el foro.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 07 de Febrero de 2007, 10:22:10
boy a tener que a hacer la pruevas fisicamente para ver los resultados.

claro  xrom ese libro fue unos de mis testos guias para aprender sobre el ds1307 y ahi lo estoy repasando para aprender mas.

saludos y gracias
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Maverick_u552 en 25 de Abril de 2007, 16:44:01
Hola a todos, excelente post-clase.  :-/

para los que tienen problemas en conseguir componentes como ds1307 y/o el cristal 32.768 khz
los pueden adquirir en futurlec.com, a buenos precios, doy fe que realizan envios a latinoamerica sin problemas  :-)

PD. o pueden pedir una muestra gratis del chip a maxim-ic.com (via triangulacion USA en mi caso)  :mrgreen:

salu2

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jeremylf en 28 de Octubre de 2007, 16:32:13
Gracias RedPic por dar a conocer lo que sabes y hacerlo tan bien!!!! =D!

Me surge una pregunta y esque me han dicho que es mejor soldar el crsital del DS1307, la parte metalica, a tierra. Y esque tu no lo haces y te funciona de maravilla mientras que el mio se retrasa mucho; lei tb q puede ser la calidad del cristal  :?

...Es necesario soldarlo a tierra? q tanto? puedo provocar algo al hacer esto q malogre al cristal no es asi? Y la salida del PIN7 (SQW/OUT) en el driver original (ds1307.c) - pubicado en el foro de CCS (el q uso) - viene por defecto esa opcion deshabilitada si no me equivoco, entonces ese pin lo pongo a tierra o a 5v? con resistencia ?  :? Yo ahora lo tengo al aire libre, eso afecta algo en el problema de mi retraso del tiempo ?

Disculpa tantas preguntas  :lol:
Gracias nuevamente.

salu2 8)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 28 de Octubre de 2007, 16:38:32
Este experimento es de hace mas de un año, y desde entonces acá he aprendido algo.  :mrgreen:

Ahora siempre va la carcasa tirada a GND. Pero lo mas importante es seguir al pie de la letra las recomendaciones del Datasheet.

(http://publi.garcia-cuervo.net/ds1307_Xtal.GIF)

Fíjate cómo le pone los planos de masa al cristal y a los dos pines donde éste va conectado.

Nota: En el montaje del principio de este hilo, que no estaba el cristal conectado a GND, cuando le ponía el dedo al cristal se paraba el reloj.  :shock:
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jeremylf en 28 de Octubre de 2007, 17:42:23
Fíjate cómo le pone los planos de masa al cristal y a los dos pines donde éste va conectado.
Esto no entiendo  :? Yo solo sueldo una pequeña parte del cristal a un puente q se conecta con GND desde la otra cara del PCB. Ocea tengo q soldar CASItodo la parte metalica del cristal a GND? pero las pistas d mi PCB no es de doble cara por eso uso un puente  :? :?


Gracias, salu2 8)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 28 de Octubre de 2007, 18:05:32
Son dos cosas distintas.

Una cosa es soldar la carcasa del cristal a GND, ahora estoy utilizando cristales SMD que traen patas para eso, y otra es el plano de masa de la propia PCB que "aisla" señales del oscilador del resto de señales presentes en la PCB, como tu puente que rodea al cristal y que debe ir conectado a GND.

Te decía además que el Datasheet aconseja ampliar ese plano de masa rodeando las dos conexiones del cristal al DS1307 y mantener un área, la rayada debajo del chip, libre de cualquier otra señal. Fíjate cómo según el datasheet los dos terminales X1 y X2 del cristal son como dos islas rodeados de GND por todos lados y muy cerca de los pines del DS1307.

Esa es la idea.  :mrgreen:

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jeremylf en 28 de Octubre de 2007, 20:08:52
Ah! ocea que la pista, donde va soldada mi puente soldado al metal del cristal, tiene que cubrir el cristal sin chocar con sus pines y tb con el chip hasta su GND verdad ?? Entonces NO esque tenga que soldar toda la parte que choca el cristal con el PCB a tierra, sino que basta con un pedazo cojido por el puente y luego ampliarlo en la cara de las pistas de mi PCB. ¿Es asi?

Porfavor dime si lo q tengo ahora esta bien (imagenes):
Atras:
(http://img519.imageshack.us/img519/8897/suprcrsjb5.th.jpg) (http://img519.imageshack.us/my.php?image=suprcrsjb5.jpg)(http://img519.imageshack.us/img519/7392/crisgm0.jpg)

Adelante:
(http://img519.imageshack.us/img519/1834/cristaltc8.jpg)


Gracias, salu2  :lol: 8)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 29 de Octubre de 2007, 03:37:18
No veo las imágenes, pero esa es la idea.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jeremylf en 30 de Octubre de 2007, 00:18:37
Aya! si pero aun a asi se retrasa =S!!  Es tanto la calidad del cristal? cmo conseguir uno de "buena calidada" u.u'

Gracais RedPic! ers una gran persona.
  :P

salu2 8)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 13 de Febrero de 2008, 22:35:22
para ver quien me podra dar una mano con este problema que se esta ejecutando en este enlace

http://www.todopic.com.ar/foros/index.php?topic=20475.0

el asm es muy largo y si me piden posteralo la harè.

saludos y gracias
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 30 de Mayo de 2008, 12:06:40
alguien ha simulado en proteus el ds1307? va bien o mal, porque yo lo intente y no da resultado

creen q si lo coloco en protoboard funcione?

gracias un saludo.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 30 de Mayo de 2008, 19:42:40
tenia un error de programa, o mejor dicho de librería, tenia una librería lcd2.c, que no inicializaba mi LCD, ni en simu ni en circuito, y ahora si, cuando cambie la librería a lcd_flex.c dio muuy bien, asi q la libreria de 8 bits, la lcd2 no me dio, nose porque :( alguien no tiene una libreria de 8 bits en la q no se trabaje con RW, porq creo q modifique algunas cosas para q este inhabilitado el rw, y talvez ahi se me fue unos hilos y borre algo q no deberia :mrgreen:

la librería del ds1307 y el mismo integrado son una belleza, eso funciona de lujo :-/

gracias maestro Redpic por la libreria mejorada :-/

ahora no sabrá alguien de una libreria q haga funcionar al lcd a 8 bits y se pueda suprimir utilizar el rw??

muchas gracias, un saludo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 03 de Junio de 2008, 17:23:41
compadre yo simule bien el ds1307 con lcd a 4bits y a 8 bits
saludos
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 03 de Junio de 2008, 17:40:32
mira esta
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 03 de Junio de 2008, 18:00:17
se me olvido responderme jajaja

si simula mbien, pasa q lo estaba probando en una pc q tiene windows 2000 y siempre va saliendo un mensaje de que no encuentra una libreria especifica, epro despues de aceptar si simula mbien la fecha y hora, y al probarlo en mi pc con win xp dio sin problemas

lo unico q si no funciona en ninguno de los 2 windows es la salida SOUT que la configuré a 1Hz, ya q en circuito real si se recibe los pulsos, pero en la simu no :(

gracias por responder
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 15 de Julio de 2008, 12:54:39
saludos acá nuevamente con el tema del rtc, pasa que en la libreria q adjunto el maestro Redpic para leer la hora hay una función, para leer la fecha hay otra, funciones independientes, pero para fijar la fecha y hora solo existe una función para ambos, quisiera fijarlos independientemente, entonces se veria obligado a modificar la funcion o crear dos independientes, ahora nose si mi idea sera correcta, entonces haria lo siguiente:

Código: [Seleccionar]
//esta es la funcion tal y como esta
void ds1307_set_date_time(byte day, byte mth, byte year, byte dow, byte hr, byte min, byte sec){

#ifndef USE_INTERRUPTS
   disable_interrupts(global);
#endif

  sec &= 0x7F;
  hr &= 0x3F;

  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x00);
  i2c_write(ds1307_bin2bcd(sec));
  i2c_write(ds1307_bin2bcd(min));
  i2c_write(ds1307_bin2bcd(hr));
  i2c_write(ds1307_bin2bcd(dow));
  i2c_write(ds1307_bin2bcd(day));
  i2c_write(ds1307_bin2bcd(mth));
  i2c_write(ds1307_bin2bcd(year));
  i2c_stop();

#ifndef USE_INTERRUPTS
   enable_interrupts(global);
#endif

}

para por ejemplo solo cambiar la fecha haria esto:
Código: [Seleccionar]
void ds1307_set_date(byte day, byte mth, byte year, byte dow){

#ifndef USE_INTERRUPTS
   disable_interrupts(global);
#endif

  i2c_start();
//  i2c_write(0xD0);     // estas seguirian en su lugar? o reemplazo la direccion de la fecha directamente en reemplazo de 0x00?
//  i2c_write(0x03);
  i2c_write(ds1307_bin2bcd(dow));
  i2c_write(ds1307_bin2bcd(day));
  i2c_write(ds1307_bin2bcd(mth));
  i2c_write(ds1307_bin2bcd(year));
  i2c_stop();

#ifndef USE_INTERRUPTS
   enable_interrupts(global);
#endif

}

Quedo bien asi??, y para la hora seria algo similar:
Código: [Seleccionar]
void ds1307_set_time(byte hr, byte min, byte sec){

#ifndef USE_INTERRUPTS
   disable_interrupts(global);
#endif

  sec &= 0x7F;
  hr &= 0x3F;

  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x00);
  i2c_write(ds1307_bin2bcd(sec));
  i2c_write(ds1307_bin2bcd(min));
  i2c_write(ds1307_bin2bcd(hr));
  i2c_stop();

#ifndef USE_INTERRUPTS
   enable_interrupts(global);
#endif

}

Haber que opinan maestros? enseguida lo compilo y veo si da resultado, sino os volveré a molestar

Y una pregunta mas, la NVRAM tiene espacio para grabar algunos datos? puedo grabar en ella datos extra de poderse, para sucesos especiales? da alguna señal? o en q más se utiliza la NVRAM?

muchas gracais un saludo a todos
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 17 de Julio de 2008, 14:48:16
saludos, acá respondiéndome otra vez... tarde, jajaja, se me olvido otra vez :D
y pues si hasta ahora el codigo que supuse ha compilado bien y en simulación cambia solamente la fecha y la hora según se use uno o el otro.

lo de la duda de la NVRAM sigue en pies, pero haber, seguiré leyendo y os cuento.

un saludo para todos
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 19 de Julio de 2008, 20:37:02
lo he probado en circuito real y tb dan sin problemas las funciones que plantié :mrgreen:

espero le sirva a alguien, un saludo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: microcom en 21 de Julio de 2008, 17:56:39
compa te felicito por la superacion de esto.lastima no haberte colaborado.
saludos
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 21 de Julio de 2008, 18:57:49
no te preocupes, asi se aprende, jeje, y pues he aprendido bastante, muchas gracais por la intención ahora, un saludo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 17 de Septiembre de 2008, 18:05:38
aunque ya es un tema viejo en cuanto a las pruebas que hiciste maestro Diego, quiero notar un pequeño detalle que en mi caso puede ser muy peligroso, segun la hoja de datos dice:

(http://img139.imageshack.us/img139/9805/ds1307hj7.jpg)

que el dia de la semana es un registro que varia de 1 a 7 y se podría hacer la correspondencia de Lun - Dom ya por software, pero veo que en tu codigo de ejmplo que pusiste en uno de los primeros posts, configuras el dia de la semana en Viernes, y en el SIOW se ve como Sabado :shock:

entonces se puede decir que el registro esta variando del 0 al 6??
o hay un pequeño detalle que considerar en la función que agregaste maestro rojo, en la funcion ds1307_get_day_of_week(char* ptr)

pues he tenido a la vez un pequeño problema con el reloj funcionando asi, que en la transición de Domingo a Lunes, dado que lo estoy visualizando en un LCD, pasa que no me muestra nada, o a veces basura cuando debería mostrar Lunes, nose cual será mi error.

bueno gracias un saludo.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: PalitroqueZ en 08 de Noviembre de 2008, 15:27:27
Hola

Me tocó el turno de aprender a usar el DS1307 y... Definitivamente una maravilla, es increible que una pastillita de 8 pines pueda hacer tanto. Me he montado un pequeño reloj - calendario y con un mes en funcionamiento no he visto retrasos en la hora.

esquema del módulo ds1307:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=13282.0;attach=8016)

mi board:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=13282.0;attach=8018)


(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=13282.0;attach=8020)


una demostración virtual de lo que hace el circuito en el protoboard:


solamente enciendo el circuito para ver la hora, después lo apago.

El agradecimiento al maestro Diego por la libreria.   :)




Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jeremylf en 08 de Noviembre de 2008, 21:38:08
Felicitaciones palitroques, preguntas:

El cristal esta soldado a tierra no?

Ese cristal es de 12.5pf? porque con lo que e leido la elecion del cristal debe de ser de esta capcitancia, porque hay otro de 6pf, 12 y asi. Esto pued retrasar o adelantar el clock, como lo has pedido?


Salu2.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: PalitroqueZ en 10 de Noviembre de 2008, 12:47:48
Si está soldado a tierra (me costó porque el cristal se daña con el calor).

no conozco su capacitancia, el cristal lo saqué de un reloj despertador de esos que venden en tiendas de chinos.

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: AKENAFAB en 11 de Noviembre de 2008, 09:18:59
Si está soldado a tierra (me costó porque el cristal se daña con el calor).

no conozco su capacitancia, el cristal lo saqué de un reloj despertador de esos que venden en tiendas de chinos.




Same trick  xD LoL  :D

Hice lo mismo y que ocsas que un despertador de esos chinos sale en menos de 1 dolar xD lo que venden -+ aca los cristales .

OJoj

He probado este relojito una maravillita  :mrgreen:


aunque ya es un tema viejo en cuanto a las pruebas que hiciste maestro Diego, quiero notar un pequeño detalle que en mi caso puede ser muy peligroso, segun la hoja de datos dice:

(http://img139.imageshack.us/img139/9805/ds1307hj7.jpg)

que el dia de la semana es un registro que varia de 1 a 7 y se podría hacer la correspondencia de Lun - Dom ya por software, pero veo que en tu codigo de ejmplo que pusiste en uno de los primeros posts, configuras el dia de la semana en Viernes, y en el SIOW se ve como Sabado :shock:

entonces se puede decir que el registro esta variando del 0 al 6??
o hay un pequeño detalle que considerar en la función que agregaste maestro rojo, en la funcion ds1307_get_day_of_week(char* ptr)

pues he tenido a la vez un pequeño problema con el reloj funcionando asi, que en la transición de Domingo a Lunes, dado que lo estoy visualizando en un LCD, pasa que no me muestra nada, o a veces basura cuando debería mostrar Lunes, nose cual será mi error.

bueno gracias un saludo.


Lo he notado tambiém amigo CRyn.

Quiero revisar bien el código a ver si encunetro como va el asunto pero como soy noob , esto va para largo.

Un saludo!

Por cierto tengo unos de esos rtcs xD con alarma

Que tal si se hace una tengularma. :D (en proximas y cantando villancicos)

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 11 de Noviembre de 2008, 18:47:45
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:
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: AKENAFAB en 11 de Noviembre de 2008, 20:59:13
Que bien qu elo resolviste Cryn , ahora que este libre  xD

Veo que onda con este relojito.

Saludos!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 12 de Noviembre de 2008, 04:56:11
Muy bueno, Cryn. Me gusta tu solución.  :mrgreen:
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: pajaro en 31 de Marzo de 2009, 10:36:52
Hola amigo RedPic

ya se que este post tuyo es un poco viejo, como el vino, viejo.... pero bueno, en el post numero 1 no logro bajar los enlaces y no veo las fotos, solo se ve el aspa.

Me puedes mirar eso, me quede con las ganas.

Un saludo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 31 de Marzo de 2009, 17:26:28
Bueno, pájaro, después de un para de "Bad Gateay" he logrado actualizar el post inicial. Dale un vistazo y dime si me he dejado algo por el camino.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: pajaro en 31 de Marzo de 2009, 22:19:10
hola Amigo REdPic
los enlaces de las fotos se ven muy bien, pero el del RRBoard1 sufre del mismo pie, te cambiaste de ftp u algo..

por cierto en la web hay algun manual visual (con fotos y eso) de como se procede con el ccs c.

me mire este enlace http://www.aquihayapuntes.com/progranacion-pic-en-c.html
 pero ...no hay más..


un saludo..
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 07 de Abril de 2009, 17:54:45
Pajaro:

El Dow es Day of Week, día de la semana, y puede valer 0:Lunes ... 6:Domingo

Yo lo uso con ...

Código: C#
  1. char days_of_week[7][11]={"Lunes\0","Martes\0","Miércoles\0","Jueves\0","Viernes\0","Sábado.\0","Domingo\0"};
  2.  
  3.  
  4. void ds1307_get_day_of_week(char* ptr){
  5.  
  6.   byte lday;
  7.   byte lmonth;
  8.   byte lyr;
  9.   byte ldow;
  10.  
  11.   ds1307_get_date(lday,lmonth,lyr,ldow);
  12.  
  13.   sprintf(ptr,"%s",days_of_week[ldow]);
  14. }


Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: pajaro en 08 de Abril de 2009, 11:01:49
hola amigo REdpic

En primer lugar, gracias por la explicación, no cai en la forma escrita, que podia ser en ingles, en mi libro estaba en castellano por más vueltas que le di no le veia de esa forma.

otra pregunta.

La definicion del tipo de datos de --> char days_of_week[7][11]={",..." } ;
es una matriz de 7x 11 o es un vector de 7 elementos, cuyos elemetos son vectores.

delante del "igual" parece la deficion de una matriz , pero detras del "igual" parece la definicion de un vector de cadenas, o de vectores.
el dato es de tipo char asi que  apunta a ser vertores, además terminan con el caracter terminador de un vector "\0"

Puedes sacarme de dudas.

Un Saludo.


Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: nutriax en 08 de Abril de 2009, 14:40:54
hola!!! les comento que yo tambien estoy intentando con un ds1307, y como no podia ser, con la libreria del amigo diego! con el ds1307 va todo de pelos, pero con el lcd voy mal y no se porque!
posteo este mensaje aca porque el proyecto que quiero hacer es mas o menos como el de palitroquez, paso a describir el problema.
cuando pongo que me ponga el formato %02u (para que me complete con 0 si es menor a 10) y el numero a mostrar es mayor a 10 me muestra el primer numero y el segundo no! y no se porque, al igual le puse que muestre un simple string apenas inicia el lcd "El LCD funciona..." y no me muestra la l de El, aclaro que esto es en proteus, tambien no me anda el \n ya que no me imprime en el segundo renglon como deberia y eso que tengo la libreria original del ccs y con la direccion 0x40 de la segunda linea, por ultimo probe otro programita que tenia andando con el LCD y anda bien, por lo que no me queda mas que sospechar del codigo.
espero que me puedan echar una mano con esta duda, aca dejo el archivo del codigo fuente y el del proteus para que me puedan ayudar (porque la verdad me parece muy ilogico el error).
les dejo las imagenes.
PD.: le puse tambien 2 lcd porque queria probar con el de 2x16 y el de 2x20 (porque no sabia que mas probar).  :lol:
(http://www.mundoimg.com/imagenes/otros/165765_mundoimg_lcd1.jpg)
(http://www.mundoimg.com/imagenes/otros/165767_mundoimg_lcd2.jpg)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: nutriax en 09 de Abril de 2009, 21:26:07
Buneo, llevo mucho como 1 dia tratando de solucionar este problema, y lo he logrado!!!!   :lol: :-/ :-/
el problema lo hace (eso si no se si proteus en la simulacion o en realidad tambien ocurre lo mismo, ya despues probare y les contare) debido a que tengo un clock de 20mhz y si le bajo el valor del cristal, por logico en el soft como en la configuracion del micro de proteus! anda de marabillas!!!. felizes pascuas!!!!   :-/ :-/ 8)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 10 de Abril de 2009, 12:17:01
que bueno que lo hayas solucionado.

y tu micro debería funcionar a 20 MHz, el problema que pasa a esa frecuencia es la estabilidad de la fuente, debes colocar condensadores entre VDD y VSS de 100nf y de 10uF y tu circuito tiene que funcionar a 20MHz.

un saludo, igualmente feliz pascua!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: turcio1708 en 02 de Mayo de 2009, 11:57:33
Hola amigos, soy nuevo en el foro, y les tengo que decir la verdad, me he registrado porque estoy al horno!!!!
Necesitaría si me pueden ayudar a juntar u 16f877 con un ds1307 y una 24lc256.
El proyecto consiste en tomar valores analógicos por el A/D del pic, y guardarlos en la eeprom con la fecha que me da el ds1307.
Desde ya muchas gracias por su tiempo.
Turcio
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: AKENAFAB en 02 de Mayo de 2009, 23:44:19

Vaya oana , de menos decir que tienes armado , ya probaste cada dispositivo por su cuenta??

ya los controlas bien?

...mmm

Mas especifico , juntar en el esquema?
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: AKENAFAB en 02 de Mayo de 2009, 23:48:22

Una consulta compas.

He realizado pruebas con el ds1307 , con la libreria del pana Redpic. de 10 y sin problemas.


Ahora hago mis pruebas pero me doy cuenta que al dar un reset al pic  esto me setea los segundos a 00.

Si mantengo presionado el boton reset me mantiene los segundos, como si se pausara , pero la salida sigue parpadeando a 1 Hz.

Las horas y minutos las respeta, solo cambia los segundos a 00


A alguien mas le sucede esto??


Por cierto , no me había dado cuenta hasta el otro dia que le preste mas atención.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: turcio1708 en 04 de Mayo de 2009, 09:05:22
Hola, yo de nuevo, como bien me hizo notar Akenafab, no di mayores datos de mi proyecto.
Tengo armada una plataforma la cual posee un 16f877, un ds1307 y una 24lc256.
Por separado no me funcionan mis programas desarrollados en el ccs,  comienzo a tener errores como por ejemplo:
Cuando compilo el siguiente programa:

#define usopic16F877

#include <16F877.h>
#device ADC=10
#FUSES XT,NOWDT

#use delay(clock=4000000)

//#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,bits=8,parity=N)

//#USE fast_IO (A)
//#USE fast_IO (B)
//#USE standard_IO (C)


#include <ds1307_inta.h>

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

  ds1307_init();

  // Set date for -> 15 June 2005 Tuesday
  // Set time for -> 15:20:55
  ds1307_set_date_time(15,6,5,2,15,20,55);

  while(1)
  {
    delay_ms(1000);

    ds1307_get_date(day,month,yr,dow);
    ds1307_get_time(hrs,min,sec);

    printf("\f\%02d/\%02d/\%02d\r\n",day,month,yr);
    printf("\%02d:\%02d:\%02d", hrs,min,sec);
  }
}

Me lleva al header 16f877.h y me dice: Can not change device type this far into the code
No tengo ni idea que es lo que me quiere indicar, por lo que estoy extraviado.
Les agradecería si me pueden tirar una soga con esto.
Desde ya muchas gracias.
Turcio
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: turcio1708 en 04 de Mayo de 2009, 15:22:15
Ahi solucioné el inconveniente antes mencionado.
Ahora mi duda es:
Como hago para setear la fecha y hora inicial en el código del 1307 del maestro redpic??
No se si tengo que directamente poner los numeros en la funcion
ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec)
Es asi??
o sea tendria que poner directamente:
ds1307_set_date_time(4, 5, 2009, lunes, 15, 21, 0)
Espero su respuesta.
Gracias por su tiempo!!!
Turcio
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: pajaro en 18 de Mayo de 2009, 07:20:55
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:


Hola amigo

puedes poner el cachito de codigo donde haces lo del dia de la semana.
Estoy teniendo problemas,  no me cambia de dia de la semana, ni del mes del año.

Un saludo y mil gracias.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 18 de Mayo de 2009, 11:53:29
Hola pájaro

mmm ok, primeramente decirte que tengo una función, que ejecuta la función de la librería:

void get_fecha(void){
   ds1307_get_date(fecha.dia,fecha.mes,fecha.anio,fecha.dia_s);
}

como puedes ver la fecha la estoy guardando en una estructura llamada fecha, donde sus variables corresponden al día, mes, año y día de la semana que se leerán del RTC.

Entonces en fecha.dia_s se guarda el día de la semana en números del 1 al 7 como dice la hoja de datos, donde el 1 corresponde al lunes, entonces, tengo el char definido con los nombres en la librería:

const char days_of_week[7][5]={"Lun\0","Mar\0","Mie\0","Jue\0","Vie\0","Sab\0","Dom\0"};
Los edite y coloque su nombre a solo 3 letras, porque solo necesitaba ello.

y por ejemplo para mostrarlo en un lcd hago:

ind_dow=fecha.dia_s-1;  // porque el RTC varia de 1 a 7 y el arreglo varia de 0 a 6
printf(lcd_putc,"%s %02u/%02u/%02u",days_of_week[ind_dow],fecha.dia,fecha.mes,fecha.anio);

y eso es lo que hice :mrgreen:

espero sirva, un saludo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: pajaro en 24 de Mayo de 2009, 13:14:22
hola amigo Crym

no se que le sucede pero llevo unos dias dandole vueltas, y no se porque no me coincide el dia de la semana "lunes", y el mes del año, "mayo".
con la fecha 04/05/2009
Se que los vectores, su primera posición es la 0, pero teóricamente deberia de funcionar.

-------------------------
solucionado era problema del sacar pantalla y del seteo de dow.

Es posible evitar setear dow?, que te lo coja o lo deduzca de la fecha?.

un saludo

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 24 de Mayo de 2009, 14:29:25
Es posible evitar setear dow?, que te lo coja o lo deduzca de la fecha?.

un saludo
mm me parece que no, en ds1307 no es capaz de eso. pero si deben existir algunos relojes que hagan eso, creo que son los RTCC (Real Time Clock Calendar) si no me equivoco hay algunos en nxp.com la familia de los PCFxx
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: pajaro en 24 de Mayo de 2009, 17:10:06
Hola Crym

y si lo imprementara por la cuenta la "vieja", si el dia DD/MM/YY es DOW=1 para dia DD/MM/YY dow sera X
 que te parece la idea, es por ni ir mirando en que dia de la semana cae.

Un saludo. 
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 24 de Mayo de 2009, 18:48:27
 :shock: no te entendí la idea
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: MLO__ en 24 de Mayo de 2009, 21:39:06
Regla de 3?  :shock:

Creo que lo mas sencillo seria implementar el contador de año bisciesto, normalmente para averiguar un dia de los años posteriores hay que ir corriendo uno o dos dias en funcion del año no?
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Tigretony en 14 de Octubre de 2009, 12:01:35
Hola, RedPic.

Yo estoy empezando a utilizar el PIC24F... y bueno necesito agregarle un RTC adicional con bateria para no perder la hora cuando se desenergize el PIC. Y revisando tus aportes me encontre con una libreria para usar un DDS1307 con un pic 18F. Bueno yo estoy empezando a usar el explorer 16 poro que no tengo mucho conocimieto, se que posee un rtcc y hasta con el cristal de 2^15 que se necesita para hacer un segundo completo, pero el problema es si se pierde la energia del PIC.

Mi pregunta: esa libreria se podria utilizar para el PIC24F (claro con sus modificaciones) o si sabes si es posible agregarle una bateria al PIC para que de alguna forma se pueda utilizar el RTC interno?

Muchas gracias




Circuito auxiliar de Reloj en Tiempo Real mediante un DS1307
...  
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Tigretony en 14 de Octubre de 2009, 23:24:15
Hola, RedPic.

Yo estoy empezando a utilizar el PIC24F... y bueno necesito agregarle un RTC adicional con bateria para no perder la hora cuando se desenergize el PIC. Y revisando tus aportes me encontre con una libreria para usar un DDS1307 con un pic 18F. Bueno yo estoy empezando a usar el explorer 16 poro que no tengo mucho conocimieto, se que posee un rtcc y hasta con el cristal de 2^15 que se necesita para hacer un segundo completo, pero el problema es si se pierde la energia del PIC.

Mi pregunta: esa libreria se podria utilizar para el PIC24F (claro con sus modificaciones) o si sabes si es posible agregarle una bateria al PIC para que de alguna forma se pueda utilizar el RTC interno?

Muchas gracias



Circuito auxiliar de Reloj en Tiempo Real mediante un DS1307
 
Descripción:

Nuestros PIC's no saben en qué día y hora viven. Perdidos en el no-tiempo, la realidad analógica o digital es un continuo donde las fracciones de tiempo superior a algunos milisegundos son entes abstractos e inasibles. Anclados en patrones de frecuencia decimales que no son divisibles por sus primos binarios, esclavos del redondeo, siempre les sobran o les faltan unos microsegundos para dar el Segundo Perfecto. Como Reloj en Tiempo Real un PIC abandonado a su cuarzo y a sus divisores, preescalers y postescalers, simplemente no da la talla.
 
Y ahí es donde entran los amables señores de Dallas Maxim (http://www.maxim-ic.com/) y su cucaracha octópoda clockeadora: el DS1307, intitulada por ellos mismos como un "64 x 8, Serial, I2C Real-Time Clock" O sea un corazón de reloj con alguna RAM adicional (no volátil ya que es asistida por una batería de Litio que la mantiene a flote mientras no le falte el fuelle de los voltios).
 
Este proyecto consiste esencialmente en poner en santa compaña a nuestro PIC con su Reloj colgando del BUS RRBOARD2 (http://www.todopic.com.ar/foros/index.php?topic=2300.0) (compatible), aprovechando que ambos hablan en I2C, por lo que es de esperar que no tengamos grandes problemas para llevarlo a buen puerto.
 
Para este proyecto he tirado, además de la información pertinente ofrecida por los amables señores de Dallas Maxim de las siguientes fuentes de información:

El buscador (http://www.todopic.com.ar/foros/index.php?action=search2) del Foro Todopic poniendo DS1307 en la casilla de búsqueda oportuna. (Algunos cientos de referencias pacientemente leídas y digeridas).

El artículo Another DS1307 Driver (http://www.ccsinfo.com/forum/viewtopic.php?t=23057&view=next&sid=df218e641edc860bac8f6279972dc797) publicado en el Foro oficial de CCS C, cuya paternidad corresponde a  un tal Phil, basado según dice él mismo en el trabajo de un tal Tullos.

El articulo DS1307 RTC and 24LC256 EEPROM on the same i2c bus problem (http://www.ccsinfo.com/forum/viewtopic.php?t=26942&view=next&sid=9d22ede0a603d09d023c3a0f1c318c4f) publicado en el mismo foro que el anterior pero esta vez realizado por unos tales Birumher y Highwind en un mano a mano digno de un buen par de toreros.

Y por último el artículo DS1307 routines (http://www.pic-c.com/forum/old/messages/4275.html) que para no ser menos también procede del Foro CCS C y de donde he sacado la idea de habilitar y/o deshabilitar las interrupciones.

Todo esto adobado por supuesto con San Google Bendito (http://www.google.es) donde escribiendo PIC y DS1307 aparece mas información de la que estoy dispuesto a digerir.
 
Entre esta información y mi propio jugo de cerebro, destilado en estos últimos días, tengo el gusto de presentaros completo este pequeño ejercicio de integración temporal de un PIC y sus circunstancias.
 
Implementación:
 
La implementación consiste en posibilitar la comunicación I2C entre la RRBOARD2 y el DS1307 y explicar lo fundamental de este chip, mostrándoos a continuación qué podemos hacer con él y qué no (visto desde el punto de vista de dentro de un PIC claro está, ya que es de cajón y no pienso comentar por ejemplo que tragarse un DS1307 sin quitarle las puntiagudas patillas puede ser incompatible con la vida, tal y como la conocemos).
 
No pienso repetir palabra por palabra, como un vulgar loro de bar portuario, lo que ya dice de forma meridianamente clara el Datasheet del DS1307, así que tras poneros el Diagrama de Bloques del mismo (extraído de dicho datasheet) paso a comentar algunas circunstancias interesantes a tener en cuenta.
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_block.gif)
 
1º.- El cristal de cuarzo ha de ser de 32.768 Khz Arcano designio que tiene que ver con que 2^15 = 32.768 por lo que esa frecuencia es divisible de forma exacta binariamente para generar 1000, o sea nuestro segundo perfecto.
 
2º.- La alimentación es doble. Por un lado el VCC de nuestro circuito normal, el del PIC, y por otro una Batería de Litio que va a permitir que el reloj siga su normal funcionamiento aún cuando apaguemos el PIC. (Esta batería sirve también para mantener viva la NVRAM adicional de que disponemos) El mismo DS1307 se encarga de realizar la conmutación entre una y otra por lo que no tenemos que tener en cuenta esta circunstancia y podemos olvidarnos de ella (salvo la de cambiar la pila cuando se agote)
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_output_frequency.gif)
 
3º.- El DS1307 tiene un pin de salida que debidamente habilitado nos ofrece una onda cuadrada con las frecuencias que puedes ver en la tabla superior. Esta salida es a colector abierto por lo que es necesario, si la queremos utilizar para inyectarla en cualquier otro circuito, colocarle una resistencia pull-up de unos 10 Kohm a VCC.

Ten en cuenta que si nuestro DS1307 va a pasar grandes periodos de tiempo alimentándose solo de la batería el tener esta opción de salida habilitada consume cientos de veces mas intensidad que sin ella por lo que podemos dejar la batería tiesa en muy poco tiempo. Si no es necesario es preferible deshabilitar esta opción (mas adelante veremos cómo hacerlo).
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_registers.gif)
 
4º.- En la tabla superior podéis ver la estructura de la NVRAM, donde se mezclan tanto los registros de configuración, como los de salvaguarda de la fecha y hora del dispositivo, como asimismo los bancos de RAM de libre disposición para el usuario.

En esta tabla tener en cuenta que el Bit 7 de la dirección 0x00 hay que colocarla a 0 para que todo funcione. Es el Enable general del dispositivo.
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_control_register.gif)
 
5º.- El byte alojado en la dirección 0x07 es el Control Register que nos permite configurar la función del pin de salida según los siguientes condicionantes:

El bit 4, SQWE, habilita o deshabilita la función de salida externa del pin Out.

El bit 7, OUT, establece el estado del pin de salida cuando SQWE está deshabilitado. Si OUT es 1 y SQWE es 0 entonces el pin de salida está en alto indefinidamente, si OUT es 0 y SQWE es 0 entonces el pin de salida está por el contrario en bajo indefinidamente.

Los bits 0 y 1 sirven para seleccionar la frecuencia de salida cuando SQWE está en alto según la tabla expuesta en 2º.

Esquema: 

Este el circuito propuesto por el fabricante como típico para su buen funcionamiento. Es el que vamos a implementar exactamente hasta el último detalle.
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_typical.gif)
 
Del pinout nada que añadir:

(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_ds1307_pins.gif)
 
Y este es el esquema definitivo que vamos a construir, en el que podemos destacar algunos detalles:
 
1º.- La comunicación con la RRBOARD2 la realizamos mediante nuestro buen amigo el conector CON-ML10 para cable plano de 10 hilos (alimentación y un puerto completo de 8 bits)
 
2º.- JP1-PB y JP3-PC permiten seleccionar la conexión de los SDA y SCL del I2C a los pines 0..1 ó 3..4 del puerto al que estén conectados (recordad de la RRBOARD2 está diseñada para las familias 18F4550 y 16F877 y el I2C lo implementa la primera en los pines RB0 y RB1 y la segunda en los RC3 y RC4) 
 
3º.- JP2-OUT Permite conectar o desconectar el pin Out del DS1307 al pin Rx3 del puerto de la RRBOARD2 (Muy útil para usarlo con la Interrupción Externa 2 del 18F4550)
 
4º.- Dependiendo de dónde conectemos nuestro circuito en la RRBOARD2 podemos necesitar o no las resistencias Pull-Up imprescindibles para el bus I2C. Si lo conectamos al PORTB tenemos disponibles la internas del PIC, en cualquier otro caso podemos hacer uso del jumper JP3-PU para conectar dichas resistencias Pull-Up a VCC.
 
5º.- Añadimos ademas el jumper OUT para poder utilizar externamente la señal de onda cuadrada del pin Out del DS1307.
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_schema.gif) 

Circuito impreso:
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_pcb_board.gif)

Fotografías:
 
Y aquí el muchacho en plenitud de facultades:
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_foto_01_todo_el_sistema.gif) 

(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_foto_02_en_detalle.gif)

Funcionando con el software de Test:
 
(http://picmania.garcia-cuervo.net/images/prj_aux_rtc_dump_02_definitivo.gif) 

Recursos:
 
Descargar Datasheet (http://picmania.garcia-cuervo.net/recursos/redpicdatasheets(/rtc/ds1307.pdf) del

DS1307 (PDF 875 Kb)
 
Descargar Librería Driver (http://picmania.garcia-cuervo.net/recursos/_ds1307.c) para CCS C DS1307
 
Descargar Programa de Test rtc.c (http://picmania.garcia-cuervo.net/recursos/_rtc.c)
 
Descargar Esquema y PCB (http://picmania.garcia-cuervo.net/recursos/_rtc.zip) para Eagle

 :mrgreen:  :-/  :mrgreen:


Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: PICPOWER en 16 de Noviembre de 2009, 16:42:01
Saludos PICmaniacos. Antes que nada, agradecer el posteo de esta librería. Luego, comentarles que tengo problemas con la misma. No la he modificado y he seguido el diagrama de conexión. Todo perfecto en apariencia, PROTEUS muestra que no hay ningún problema en el circuito, como lo de todos ustedes la simulación perfecta. Pero ya en la realidad, tengo problemas al reiniciar el sistema. Pues resulta que cuando configuro por primera vez, todo es perfecto, la fecha va como debe de ir. Pero al momento de apagar el micro, para quitarle la línea de programar al RTC, cuando lee la fecha, marca 00/11/09, es decir, el día del mes no lo muestra correctamente. Cuando lo prendí por primera vez, mostraba la fecha correctemente y es la que sacaba del DS1307, un instante después de haberla configurado, pues deduzco que el circuito pierde la fecha cuando lo apago o bien, que ésta es mal leída después de reiniciar el circuito.

El circuito lo tiene mi cliente, le comenté que el problema era que el DS1307 se había quemado y que por eso no le iba a mostrar la fecha de momento, pero siendo franco, dudo que se haya quemado. ¿A alguien le ha pasado este problema? El DS1307 funciona con su pila de respaldo, nunca pierde la hora ni la fecha (salvo el día que les comento). Uso un cristal de 20 MHz (he estado pensando que éste podría ser mi problema, o bien cambiar la velocidad del I2c a fast=10000). De ahí en fuera, la librería es tal cual está posteada y uso las funciones tal cual son descritas, para mostrar cada dato en el LCD uso %02u.

Agradecería cualquier ayuda o comentario al respecto, especialmente si es acerca de la velocidad, que no la veo declarada en la librería posteada. En cuanto tenga el circuito en mi mano, mi primer idea es probar con fast=10000, es decir, manejar una velocidad de bus I2c lenta.

Bytes...
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 17 de Noviembre de 2009, 15:29:52
No, Picpower, no he tenido ese problema.

Hemos montado 600 placas con él y hasta ahora solo he tenido problemas dos o tres veces en que me ha costado ponerlo en hora la primera vez, he necesitado mandarle la fecha dos o tres veces seguidas hasta que la pilla, pero a partir de ahí siempre han funcionado correctamente.

No se qué puede pasarle al tuyo. Lo siento.  :shock:
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: MLO__ en 19 de Noviembre de 2009, 00:04:07
 :shock: :shock:

2 o 3 veces?  :? a mi no me ha dado lio alguno ... si que esta raro  :shock:

Y por que no pruebas asignar la funcion de configuracion del reloj con un pulsador?

Código: [Seleccionar]
if(state(PULSADOR))
// configuro el reloj
else
// no pasa nada

De esa manera no tienes que estar sacando el PIC para volver a programar etc.

Saludos
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Drod en 20 de Noviembre de 2009, 14:23:51
Hola foreros!

Este es el codigo em PICBASIC PRO, no es necesário drivers, etc
Para quien tiene dificultad con el C, el PIC BASIC PRO es una buena solución, porque é MUY, pero MUUUUY facil   :lol:

Código: [Seleccionar]
' Programa PICBASIC PRO Relógio LCD usando Dallas DS1307 I2C RTC 
' Define LOADER_USED para usar Boot Loader

Define LOADER_USED 1   
INCLUDE  "modedefs.bas"



trisc = %00000000
Define OSC 20      

Define  LCD_DREG        PORTB   'Define conexões LCD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTB
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTB
Define  LCD_EBIT        1

'Pinos:
'SDA Var PORTC.4
'SCL Var PORTC.3

' Define Variáveis
RTCYear Var Byte
RTCMonth Var Byte
RTCDate Var Byte
RTCDay Var Byte
RTCHour Var Byte
RTCMin Var Byte
RTCSec Var Byte
RTCCtrl Var Byte

DIA var WORD


Pause 100

'Aqui configura-se os dados iniciais, por exemplo: 20/11/09   14:27:00   

        RTCYear = $09
RTCMonth = $11
RTCDate = $20
RTCDay = $05
RTCHour = $14
RTCMin = $27
RTCSec = 0
RTCCtrl = 0

Gosub settime ' Set the time
   
    goto loop ' Skip over subroutines


' Subrotina para escrever dados no RTC
settime:

    I2CWrite PORTC.4, PORTC.3, $D0, $00, [RTCSec, RTCMin, RTCHour, RTCDay, RTCDate, RTCMonth, RTCYear, RTCCtrl]
Return

' Subrotina para escrever ler dados do RTC
gettime:

    I2CRead  PORTC.4, PORTC.3, $D0, $00, [RTCSec, RTCMin, RTCHour, RTCDay, RTCDate, RTCMonth, RTCYear, RTCCtrl]
Return

' Loop Principal
loop:

    Gosub gettime ' Lê os dados do RTC

    ' Mostra no LCD       
                                 
    select case RTCDay
   
    case $01     
       
Lcdout $fe, 1, hex2 RTCDate, "/", hex2 RTCMonth, "/" , hex2 RTCYear, " ", " Lunes"

case $02

lcdout $fe, 1, hex2 RTCDate, "/", hex2 RTCMonth, "/" , hex2 RTCYear, " ", " Martes"

case $03

lcdout $fe, 1, hex2 RTCDate, "/", hex2 RTCMonth, "/" , hex2 RTCYear, " ", "Miercoles"

case $04

Lcdout $fe, 1, hex2 RTCDate, "/", hex2 RTCMonth, "/" , hex2 RTCYear, " ", "Jueves"

case $05

Lcdout $fe, 1, hex2 RTCDate, "/", hex2 RTCMonth, "/" , hex2 RTCYear, " ", "Viernes"

case $06

Lcdout $fe, 1, hex2 RTCDate, "/", hex2 RTCMonth, "/" , hex2 RTCYear, " ", "Sabado"

case $07

Lcdout $fe, 1, hex2 RTCDate, "/", hex2 RTCMonth, "/" , hex2 RTCYear, " ", " Domingo"

End select

        LCDOUT $FE,$C0,hex2 RTCHour, ":", hex2 RTCMin, ":", hex2 RTCSec

Pause 500 ' O faz 2 vezes por segundo

Goto loop ' Loop Infinito

        End

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jdem en 28 de Noviembre de 2009, 14:48:23
Soy nuevo en el foro, recién me registré así que les pido disculpas si cometo alguna imprudencia. Escribo porque quieisera saber si hay alguna manera de comparar las fechas y horas obtenidas del RTC, es decir si hago un get_time hoy y otro get_time mañana poder distinguir cuál de los dos es menor, e incluso saber el tiempo transcurrido entre uno y otro. Gracias.

PD: Trabajo con PIC C
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 28 de Noviembre de 2009, 15:06:07
claro que hay forma, tendrás que programar esas funciones que te den esos esos datos que necesitas
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: JOJOJORGE5 en 06 de Diciembre de 2009, 12:25:32
Hola

Hoy acabo de matar mi primer RTC. Al parecer se movió un cable del protoboard y fue a parar donde no debía :5] y creo que el que me compre era el ultimo.
Ahora falta saber si se quemaron las patas del PIC o el RTC.
Pero antes de morir funciono de maravilla.

Yo lo programe en ASM para el 16f877a basándome en rutinas dejadas en este mismo foro.
así que a tener cuidado con los cables sobre todo con los de clk ysda.


salu2:)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 06 de Diciembre de 2009, 13:22:02
uuf que mala noticia JOJOJORGE5, esperemos que no le haya pasado nada al RTC que son un poco difíciles de conseguir, al menos por acá
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: JOJOJORGE5 en 06 de Diciembre de 2009, 17:59:06
Hola

Pues si definitivamente esta muerto el RTC. mañana me pasare por la tienda por si consigo otro, aunque lo dudo.

salu2:)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Drod en 09 de Diciembre de 2009, 13:20:21
Hola, no queriendo ser pesado, pero me han preguntado y no supe responder... Hay alguna adaptación para saber exactamente los milisegundos?  :oops:
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Nocturno en 09 de Diciembre de 2009, 13:35:27
Con el DS1307 no se puede, la mínima resolución es a nivel de segundo.
Lo que sí podrías hacer si te interesa es configurar el pin SQW/OUT para que envíe una señal de 4KHz y lo puedes capturar por el timer del PIC. Así, cada 4 ticks recibidos sabrás que ha pasado un milisegundo.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: venerable13 en 29 de Diciembre de 2009, 14:49:54
Ir al tema pricipal de proyectos x favor, hago referencia al ds1307
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Nocturno en 17 de Febrero de 2010, 20:02:20
Estoy teniendo problemas con un DS1307.
El tío funciona de perlas mientras el circuito esté alimentado, pero en cuanto quito la corriente el reloj se para, se congela, se atasca, se detiene y no avanza.

Cuando restablezco la alimentación de nuevo empieza a contar segundos como si fuera el conde Draco (http://maurisoft.homelinux.com/public/recre/avatares/El%20conde%20draco%209%2038%2023%20draco.jpg), y continúa por la hora que se había quedado congelada.

Sí, sé lo que estáis pensando, pero no es eso: la batería es nuevecita y mantiene sus 3 y pico voltios conectados al pin 3 del DS1307.

¿Alguna pista?
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jeremylf en 17 de Febrero de 2010, 20:18:24
Si habilitas el pin SQW/OUT para ver si cuando quitas la fuente, la bateria se encarga de mantener activo todo? Es como si el bit CH se deshabilitara al quitar la fuente. Condensador en su pin vcc de 104 esta?
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Nocturno en 18 de Febrero de 2010, 02:20:15
No le puse el SQW/OUT para evitar que consuma por la pullup, pero lo pondré para investigar lo que ocurre.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: MGLSOFT en 19 de Febrero de 2010, 10:37:01
A mi me paso lo mismo... :shock:
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: MLO__ en 19 de Febrero de 2010, 11:49:05
A mi me paso una vez, cambie el chip por otro nuevo y funcionó bien ....

Saludos
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Nocturno en 19 de Febrero de 2010, 13:19:18
Ahora va bien, pero no hice nada nuevo con él. Sólo seguí trabajando en el programa del PIC, en otras partes del programa. No entiendo qué ha pasado para que ahora funcione y antes no.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: dogflu66 en 19 de Febrero de 2010, 14:12:21
Sin animo de crear polémica ni de desviar el tema  :mrgreen:, hace unos días tuve un problema con un código, el cual sin saber porque desapareció dicho problema al tocar allí y acá. En mi caso era problema de variables, no había error en compilación pero sin embargo el software dejo de hacer lo que debía. Al final pude verificar que fue un fallo del compilador, un fallo muy particular y que posiblemente no se vuelva a producir y, coincidía con el número de variables y tipos y el banco de memoria en el que se ubicaron y orden de declaración. De echo fue tan raro que no pare hasta reproducirlo, simplemente al declarar una variable más o de menos o agrandar o disminuir en un byte un array el problema desaparecía. Con esto no quiero decir que fuera tu problema.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Nocturno en 19 de Febrero de 2010, 14:19:07
La verdad es que puede ser cualquier cosa, pero me extrañaría que fuera culpa del microcontrolador. Yo le echo la culpa al DS1307, pero vamos, que no tengo ni idea.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Geo en 04 de Marzo de 2010, 06:16:55
Estoy haciendo unas simulaciones en Proteus (7.6) con un DS1307 y la biblioteca que Redpic colocó en este hilo, pero tengo el problema de no poder activar la salida SOUT, por más que muevo configuraciones el pin de salida se queda en gris y no consigo obtener el pulso de salida. ¿Alguien ha tenido un problema similar?
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Nocturno en 04 de Marzo de 2010, 06:22:05
No te olvides que ese pin necesita una pullup para funcionar porque es de colector abierto.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Geo en 04 de Marzo de 2010, 06:45:18
En un principio la había olvidado y pensé que ese podía ser el problema, pero no (aún cuando no colocara la resistencia de pull-up, en Proteus el cuadro que indica el nivel lógico en el pin debería cambiar su estado ¿o me equivoco?).

Ahora acabo de probar con el código que Redpic publicó en el primer post y ocurre lo mismo, estoy pensando que el problema sea el simulador, tendré que armar el circuito para estar seguro :?.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 04 de Marzo de 2010, 13:50:57
Tuve el mismo problema, al parecer el proteus no simula la salida SOUT, ya que hice la configuración que se debe en le programa pero en simulación no da, y en circuito real si daba.

Y como a veces me gusta simular lo que hice fue colocar un reloj al pin donde iría SOUT a la frecuencia que configuré este.

saludos
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: AKENAFAB en 04 de Marzo de 2010, 14:14:51
No se fíen de PROTEUS le va a hacer una pasada o pueden perder mucho mucho tiempo xD y su programa estara bien realizado. xD
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Geo en 04 de Marzo de 2010, 17:51:37
Chequé con el archivo del libro de desarrollo de proyectos con PIC16F84, por lo que noté, el componente no es igual al de las versiones recientes, y si funciona :S.

Tuve el mismo problema, al parecer el proteus no simula la salida SOUT, ya que hice la configuración que se debe en le programa pero en simulación no da, y en circuito real si daba.

Y como a veces me gusta simular lo que hice fue colocar un reloj al pin donde iría SOUT a la frecuencia que configuré este.
Precisamente, para simular le metí el generador de señales :). Me tranquiliza saber que no soy el único al que no le funciona ;).
No se fíen de PROTEUS le va a hacer una pasada o pueden perder mucho mucho tiempo xD y su programa estara bien realizado. xD
No me fio, aunque si me gustaría que funcionara porque no tengo el CI a la mano y quería adelantar :P.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: JOJOJORGE5 en 04 de Marzo de 2010, 20:42:08
Tuve el mismo problema, al parecer el proteus no simula la salida SOUT, ya que hice la configuración que se debe en le programa pero en simulación no da, y en circuito real si daba.

Y como a veces me gusta simular lo que hice fue colocar un reloj al pin donde iría SOUT a la frecuencia que configuré este.

saludos

que raro, ami me funciono perfectamente la simulacion, y esa señal era parte fundamental de mi diseño. lo probe en el circuito armado con el integrado que Cryn muy amablemente me presto, y funciono tambien.

aunque yo no le puse pull up, y mi proteus es el 7.2 SP6.

salu2:)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Geo en 05 de Marzo de 2010, 05:18:10
Probé con la versión 7.2 pensando que eso pudiera ser el problema, pero sucedió lo mismo, ninguna salida y el pin en gris (desconectado), al colocar la resistencia de pull-up se fue a un 1 lógico y ya no se movió de ahí.

Hay una parte que no entiendo muy bien:el código de la función ds1307_init. En un mensaje anterior Redpic menciona esto:

Directamente desde el Datasheet ...

Please note that the initial power-on state of all registers is not defined. Therefore, it is important to
enable the oscillator (CH bit = 0) during initial configuration.


Asi que la frase que escribí debería decir: En esta tabla tener en cuenta que el Bit 7 de la dirección 0x00 hay que colocarla a 0 para que todo funcione.

Aunque yo no pude encontrar el texto en la hoja de datos (¿será que ya cambió?). Modifiqué el código de dicha función, probé y esta vez funcionó la simulación. El problema es que no tengo un DS1307 a la mano para armar y probar.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn en 05 de Marzo de 2010, 12:10:31
que raro, ami me funciono perfectamente la simulacion, y esa señal era parte fundamental de mi diseño. lo probe en el circuito armado con el integrado que Cryn muy amablemente me presto, y funciono tambien.

aunque yo no le puse pull up, y mi proteus es el 7.2 SP6.

salu2:)
raro raro, yo recuerdo que hace tiempo lo usé en proteus y no me funcionó, lo malo es que no recuerdo que versión de proteus era, y ahora que lo volví a probar con la versión 7.6sp4 tampoco dio ni con pull-up ni sin ella.

Geo, Salvo que tengas que cambiar la frecuencia de salida de Sout en la ejecución del programa, no veo porque quitar el clock de reemplazo, ya que te aseguro que usando esta librería de redpic el RTC va a configurarse como debe ser. y tu simulación irá muy bien con este clock.

saludos.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: JOJOJORGE5 en 05 de Marzo de 2010, 15:06:41
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.

salu2:)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Geo en 05 de Marzo de 2010, 18:04:41
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í (http://www.todopic.com.ar/foros/index.php?topic=13282.msg91382#msg91382), 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.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: JOJOJORGE5 en 05 de Marzo de 2010, 23:16:41
No Geo normalmente trato de hacer mis propias librerias. no tenia idea de como funcionaba el puerto i2c y al final probe hacer todo desde cero, ya que por el mismo puerto i2c puse algunas otras cosas mas, al final aprendi mucho.

probe el mismo archivo de simulacion que me funcionaba en el proteus 7.2 sp6 en el proteus 7.6 sp0 y no funciona ni atras ni adelante :5]
que raro me aparece el mismo problema que comentaron antes, no funciona con pullup o sin pull up.
sera un bug?

salu2:)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Geo en 06 de Marzo de 2010, 23:57:13
No Geo normalmente trato de hacer mis propias librerias. no tenia idea de como funcionaba el puerto i2c y al final probe hacer todo desde cero, ya que por el mismo puerto i2c puse algunas otras cosas mas, al final aprendi mucho.
Lo decía porque estuviéramos verificando el funcionamiento del mismo código :p.

probe el mismo archivo de simulacion que me funcionaba en el proteus 7.2 sp6 en el proteus 7.6 sp0 y no funciona ni atras ni adelante :5]
que raro me aparece el mismo problema que comentaron antes, no funciona con pullup o sin pull up.
sera un bug?
Con las correcciones que comenté, ya funciona en ambas versiones: 7.2 y 7.6.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 07 de Marzo de 2010, 05:28:11
Lo del CH Bit=0 viene en el Datasheet que tengo del DS1307 (http://picmania.garcia-cuervo.net/recursos/redpicdatasheets/rtc/ds1307.pdf) Página 8, en el centro de la misma bien remarcado en negrita.

Por otro lado deciros que la librería del DS1307 que hay publicada es la que yo utilizo siempre, tengo fabricadas unas 500 placas con el 18F4550 y el DS1307, en el mismo bus I2C hay otras cosas colgadas,  y todas la utilizan, hasta ahora no he detectado fallo alguno en ninguna de ellas.

Yo nunca utilizo Proteus, ni ningún otro simulador, por lo que siempre pruebo las cosas en circuitos reales, esto me impide poder deciros nada acerca del funcionamiento en ellos de esta o aquella librería. Me temo que cuando retocamos cualquier programa para que corra bien en un simulador no sabemos si estamos corrigiendo algo de nuestro programa o "adaptandolo" al modo de funcionar del simulador.

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Geo en 07 de Marzo de 2010, 21:26:57
Lo del CH Bit=0 viene en el Datasheet que tengo del DS1307 (http://picmania.garcia-cuervo.net/recursos/redpicdatasheets/rtc/ds1307.pdf) Página 8, en el centro de la misma bien remarcado en negrita.
Ya vi, la diferencia es la versión de la hoja de datos que tenemos :P.

Por otro lado deciros que la librería del DS1307 que hay publicada es la que yo utilizo siempre, tengo fabricadas unas 500 placas con el 18F4550 y el DS1307, en el mismo bus I2C hay otras cosas colgadas,  y todas la utilizan, hasta ahora no he detectado fallo alguno en ninguna de ellas.
Mi duda era solo con la configuración de la salida de pulsos del DS1307.

Yo nunca utilizo Proteus, ni ningún otro simulador, por lo que siempre pruebo las cosas en circuitos reales, esto me impide poder deciros nada acerca del funcionamiento en ellos de esta o aquella librería. Me temo que cuando retocamos cualquier programa para que corra bien en un simulador no sabemos si estamos corrigiendo algo de nuestro programa o "adaptandolo" al modo de funcionar del simulador.
Más que nada, la información era para salir de la duda si el problema es el simulador, por si alguien más se encontraba con algo similar. Por lo mismo, he aclarado que solo he probado con Proteus :p.

Y por cierto, aprovecho para agradecerte por el trabajo de crear esta biblioteca, muchas, muchas gracias por compartir :).
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 08 de Marzo de 2010, 04:39:09
Ya vi, la diferencia es la versión de la hoja de datos que tenemos :P.

La tuya ¿es mas moderna o mas antigua que la que yo tengo?
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Geo en 09 de Marzo de 2010, 00:59:38
Perdón por no comentarlo antes. Según el número de revisión (100208) es más reciente.

No se encuentra el texto tal cual que en la versión que tienes, pero es prácticamente lo mismo, hay que poner el bit CH en 0 para poder habilitar el oscilador, la única diferencia es que la versión más reciente indica que el estado inicial es 1 y no que no está definido :P.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Miquel_S en 20 de Marzo de 2010, 22:22:10
Hola compañeros tengo un problema compilando un pequeño programa con el ds1307.
Me explico estos son los errores:
 
Clean: Deleting intermediary and output files.
Clean: Deleted file "lcd.ESYM".
Clean: Deleted file "D:\PROYECTOS\LCD\lcd.o".
Clean: Deleted file "C:\Archivos de programa\PICC\Drivers\DS_1307.ESYM".
Clean Warning: File "C:\Archivos de programa\PICC\Drivers\DS_1307.o" doesn't exist.
Clean: Deleted file "lcd.ERR".
Clean: Deleted file "C:\Archivos de programa\PICC\Drivers\DS_1307.ERR".
Clean: Deleted file "D:\PROYECTOS\LCD\Prueba_lcd.mcs".
Clean: Done.
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FM "lcd.c" +EXPORT +DF +LN +T +A +M +Z +Y=9 +EA
>>> Warning 203 "C:\ARCHIV~1\PICC\drivers\DS_1307.c" Line 110(1,1): Condition always TRUE
D:\PROYECTOS\LCD\lcd.o ===>  0 Errors,  1 Warnings.
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FM "C:\Archivos de programa\PICC\Drivers\DS_1307.c" +EXPORT +DF +LN +T +A +M +Z +Y=9 +EA
*** Error 100 "DS_1307.c" Line 22(5,44): USE parameter value is out of range   Not a number: PIN_C4
*** Error 128 "DS_1307.c" Line 24(1,40): A #DEVICE required before this line
*** "DS_1307.c" Line 24: Error #48: Expecting a (
C:\Archivos de programa\PICC\Drivers\DS_1307.o ===>  3 Errors,  0 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Sun Mar 21 02:05:03 2010
 
 codigo del programa:

Código: CSS
  1. #include <16f877a.h>
  2. #fuses XT,NOWDT,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOLVP,PUT
  3. #use delay(clock=4000000)
  4.  
  5. #define use_portb_lcd TRUE
  6. #include <LCD.c>
  7. #include <DS_1307.c>
  8. #use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
  9.  
  10. byte hr,min,sec;
  11.  
  12. void main(){
  13. lcd_init();
  14.         printf(lcd_putc"Reloj ds1307");
  15.         printf(lcd_putc"\nMiquel_S 2010");
  16.         delay_ms(1500);
  17.         lcd_putc("\f");
  18.        
  19. ds1307_init();
  20.         ds1307_set_date_time(11,2,10,3,14,30,0);
  21.         ds1307_get_time(hr,min,sec);
  22.         printf(lcd_putc,"\n%02u:%02u:%02u",hr,min,sec);
  23. }

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

Estoy usando el entorno de mplab ya que uso el pickit 3

 Saludos
 
 Miquel_S

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Miquel_S en 21 de Marzo de 2010, 18:24:35
Me respondo a mi mismo problema resuelto incompatibilidad del ccs con mplab  :mrgreen:

 Miquel_S
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Suky 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!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Miquel_S 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Miquel_S 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: MLO__ 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Miquel_S 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: MLO__ 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Miquel_S 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Miquel_S 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Miquel_S 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jfmateos2 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.

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jfmateos2 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().
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: afonseca 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í (http://www.todopic.com.ar/foros/index.php?topic=13282.msg91382#msg91382), 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.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: fabito 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..
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: MLO__ 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic 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:
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: MLO__ 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: tinch06 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: MLO__ 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: oscar12725 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 .........
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn 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.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: oscar12725 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..... :-/
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Cryn 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Gray 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 (http://picmania.garcia-cuervo.com/recursos/_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í.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: AKENAFAB 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)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Simon21 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: oscar12725 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: oscar12725 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
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jukinch 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]
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: ZAZA en 02 de Mayo de 2011, 00:55:43
Hola soy nuevo en esto de los foros pero acudo con ustedes por que necesito su ayuda, estoy tratando de hacer la comunicacion I2C entre un pic 18f4550 y un ds1307 e hice este codigo

#include <p18f4550.h>
#include <i2c.h>
#define RTC_SDA  PIN_B0
#define RTC_SCL  PIN_B1

#pragma config PLLDIV = 1         // No prescale (4 MHz oscillator input drives PLL directly)
#pragma config CPUDIV = OSC1_PLL2   // [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
#pragma config USBDIV = 1         // USB clock source comes directly from the primary oscillator block with no postscale
#pragma config FOSC = XT_XT         // HS oscillator, HS used by USB
#pragma config FCMEN = OFF         // Fail-Safe Clock Monitor disabled
#pragma config IESO = OFF         // Oscillator Switchover mode disabled
#pragma config PWRT = OFF         // PWRT disabled
#pragma config BOR = OFF         // Brown-out Reset disabled in hardware and software
#pragma config VREGEN = OFF         // USB voltage regulator disabled
#pragma config WDT = OFF         // HW Disabled - SW Controlled
#pragma config MCLRE = ON         // MCLR pin enabled; RE3 input pin disabled
#pragma config LPT1OSC = OFF      // Timer1 configured for higher power operation
#pragma config PBADEN = OFF         // PORTB<4:0> pins are configured as digital I/O on Reset
#pragma config CCP2MX = ON         // CCP2 input/output is multiplexed with RC1
#pragma config STVREN = ON         // Stack full/underflow will cause Reset
#pragma config LVP = OFF         // Single-Supply ICSP disabled
#pragma config ICPRT = OFF         // ICPORT disabled
#pragma config XINST = OFF         // Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
#pragma config DEBUG = OFF         // Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
   // Data and code memory without protection

unsigned char SEG,MIN,HRS,DAY,DIA,MES,ANO,SEGUNDOS;
int BAN=1;


void main(void)
{
   //CONFIGURAR SSPCON1
   SSPCON1 = 0X00;
   SSPCON1bits.SSPEN = 1;
   
   
   // CONFIGURAR BRG A velocidad de 100 KHZ con un cristal de 4MHZ
    SPBRG = 0x027;

   //CONFIGURACION ADCON1 TODOS SALIDAS DIGITALES
   ADCON1=0x0f;
   
   //CONFIGURACION TRISB
   TRISB= 0x03;
    TRISD=0x00;
    PORTD=0B00000000;
   SEG=0b00000000;
   
      StartI2C();
      WriteI2C(0B11010000);// DIRECCION DEL DS1307 EN ESCLAVO
      AckI2C();
      WriteI2C(0B00000000);//INDICA QUE POSICION SE VERA CAMBIADA, EN ESTE CASO LOS SEGUNDOS
      AckI2C();
      WriteI2C(SEG);// iNDICA EL SEG. ACTUAL
      AckI2C();
      StopI2C();//DEJA DE MANDAR INSTRUCCIONES
       
      //pROCESO DE lECTURA
       StartI2C();
      WriteI2C(0B11010001);// LEE DEL DS1307
      AckI2C();
      SEGUNDOS = ReadI2C();
      NotAckI2C();
      StopI2C();

      
    do
    {
      //pROCESO DE lECTURA
       StartI2C();
      WriteI2C(0B11010001);// LEE DEL DS1307
      AckI2C();
      SEGUNDOS = ReadI2C();
      NotAckI2C();
      StopI2C();
    }while(BAN==0);
   

y pues no funciona, me base en la hoja de datos y en el manual del pic para hacerlo, espero que me puedan ayudar, de antemano gracias
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jukinch en 02 de Mayo de 2011, 01:48:35
Hola ZAZA: Que es lo que no funciona. Que síntoma te hace?
                 Saludos.
                    Juknich
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: ZAZA en 02 de Mayo de 2011, 10:33:58
Hola ZAZA: Que es lo que no funciona. Que síntoma te hace?
                 Saludos.
                    Juknich
Hola ZAZA: Que es lo que no funciona. Que síntoma te hace?
                 Saludos.
                    Juknich

Hola gracias por responder! pues basicamente no hace nada! y pues ya he probado el pic pensando que era el pic el que no funcionaba pero si funciona! espero me puedan ayudar, saludos!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Suky en 02 de Mayo de 2011, 10:45:15
Te contenté en el otro mensaje que creaste...  :? No había visto que publicaste la misma pregunta aquí  :x
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: ZAZA en 02 de Mayo de 2011, 11:30:17
Hola te pido una disculpa! pero no queria responderte sin antes investigar un poco acerca del IdleI2C() que mencionas! gracias! :oops:
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jukinch en 02 de Mayo de 2011, 11:43:16
ZAZA:
        Te transcribo a continuación una librería de inicialización de un rtc similar para que veas lo de idlei2c. El ds1337c. No está del todo lista, ya que falta optimizarla. Pero al menos logré que funcione.
        La hice con ayuda del tutorial de suky y su librería del rtcds1307, info de la página de Redpic  y lo que fui recolectando del foro, más un tutorial sobre i2c de microchip.
        Prestale mucha atención al datasheet del 1307 a la rutina de comunicación via i2c. Sobre todo a las ¨preguntas¨ y ¨respuestas¨ que se hacen entre dispositivos maestro y esclavo.
        En el hilo del cursillo de c18 está la librería que hizo Suky.
            Saludos.
                    Jukinch
               



Código: C
  1. // libreria para uso de rtc
  2.  
  3.  
  4.  
  5.  
  6. unsigned short int bcd2bin(unsigned short int PackedBCDbyte);
  7. unsigned short int bcd2ascii(unsigned short int cadenabcd);
  8. unsigned short int bin2bcd(unsigned short int binaryByte);
  9. unsigned short int bcd2int(unsigned short int PackedBCDbyte);
  10.  
  11. void initRtcDs1337(unsigned int hour,
  12.                                    unsigned int min,
  13.                                    unsigned int sec,
  14.                                    unsigned int dayOfWeek,
  15.                                    unsigned int date,
  16.                                    unsigned int month,
  17.                                    unsigned int year);
  18.  
  19. void setSecRtcDs1337(unsigned int setSec);
  20. void setMinRtcDs1337(unsigned int setMin);
  21. void setHourRtcDs1337(unsigned int setHour);
  22.  
  23. void setDayOfWeekRtcDs1337(unsigned int setDayOfWeek);
  24. void setDateRtcDs1337(unsigned int setDate);
  25. void setMonthRtcDs1337(unsigned int setMonth);
  26. void setYearRtcDs1337(unsigned int setYear);
  27.  
  28. void setAlarm1RtcDs1337(unsigned int setHour,
  29.                                             unsigned int setMin,
  30.                                                 unsigned int setSec,
  31.                                                 unsigned int setDate);
  32.  
  33.  
  34. void resetAlarm1RtcDs1337(void);
  35. void resetAlarm2RtcDs1337(void);
  36.  
  37.  
  38.  
  39. void setAlarm2RtcDs1337(unsigned int setHour,
  40.                                             unsigned int setMin,
  41.                                                 unsigned int setDate);
  42.  
  43. void setSquareWaveRtcDs1337(unsigned int setEnable,
  44.                                                 unsigned int setRate);
  45.  
  46.  
  47.  
  48. void readRtcDs1337(void);
  49.  
  50.  
  51.  
  52. /*declaración de variables*/
  53.  
  54.        struct{
  55.                          // variables para hora
  56.                          unsigned short int unidadesSec;
  57.                          unsigned short int decenasSec;
  58.                          unsigned short int unidadesMin;
  59.                          unsigned short int decenasMin;
  60.                          unsigned short int unidadesHour;
  61.                          unsigned short int decenasHour;
  62.                          unsigned formatoAmPm:1;
  63.                          unsigned formato12_24:1;
  64.                          // variables para fecha
  65.                          unsigned short int dayWeek;
  66.                          unsigned short int unidadesDate;
  67.                          unsigned short int decenasDate;
  68.                          unsigned short int unidadesMonth;
  69.                          unsigned short int decenasMonth;
  70.                          unsigned centuryOverflow:1;
  71.                          unsigned short int unidadesYear;
  72.                          unsigned short int decenasYear;
  73.  
  74.                          // variables para alarma1
  75.                          unsigned short int unidadesSecAlarm1;
  76.                          unsigned short int decenasSecAlarm1;
  77.                          unsigned short int unidadesMinAlarm1;
  78.                          unsigned short int decenasMinAlarm1;
  79.                          unsigned short int unidadesHourAlarm1;
  80.                          unsigned short int decenasHourAlarm1;
  81.                          unsigned formatoAmPmAlarm1:1;
  82.                          unsigned formato12_24Alarm1:1;
  83.                          unsigned short int unidadesDayAlarm1;
  84.                          unsigned short int unidadesDateAlarm1;
  85.                          unsigned short int decenasDateAlarm1;
  86.                          unsigned DayOrDateSelectAlarm1:1;
  87.                          unsigned alarm1Mask1:1;
  88.              unsigned alarm1Mask2:1;
  89.                          unsigned alarm1Mask3:1;
  90.                          unsigned alarm1Mask4:1;
  91.                          // variables para alarma2
  92.                          unsigned short int unidadesMinAlarm2;
  93.                          unsigned short int decenasMinAlarm2;
  94.                          unsigned short int unidadesHourAlarm2;
  95.                          unsigned short int decenasHourAlarm2;
  96.                          unsigned formatoAmPmAlarm2:1;
  97.                          unsigned formato12_24Alarm2:1;
  98.                          unsigned short int unidadesDayAlarm2;
  99.                          unsigned short int unidadesDateAlarm2;
  100.                          unsigned short int decenasDateAlarm2;
  101.                          unsigned DayOrDateSelectAlarm2:1;
  102.                          unsigned alarm2Mask1:1;
  103.              unsigned alarm2Mask2:1;
  104.                          unsigned alarm2Mask3:1;
  105.                          unsigned alarm2Mask4:1;
  106.                  }RTC;
  107.  
  108.  
  109. unsigned short int sec;
  110. unsigned short int min;
  111. unsigned short int hour;
  112. unsigned short int dayWeek;
  113. unsigned short int date;
  114. unsigned short int month;
  115. unsigned short int year;
  116.  
  117. unsigned short int alarm1sec;
  118. unsigned short int alarm1min;
  119. unsigned short int alarm1hour;
  120. unsigned short int alarm1date;
  121. unsigned short int alarm2min;
  122. unsigned short int alarm2hour;
  123. unsigned short int alarm2date;
  124.  
  125.  
  126.  
  127. /***** rutina de inicialización de rtc ***************************************/
  128. void initRtcDs1337(unsigned int hour,
  129.                                    unsigned int min,
  130.                                    unsigned int sec,
  131.                                    unsigned int dayOfWeek,
  132.                                    unsigned int date,
  133.                                    unsigned int month,
  134.                                    unsigned int year)
  135. {
  136. OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  137.  
  138. SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  139.                 /* When the MSSP is configured in Master mode, the lower seven
  140.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  141.  
  142.                                                 /*ejemplo usando cristal de 20mhz
  143.                                                 ((Fosc/4) / BiteRate )-1
  144.                                                 (Fosc/4) =20mhz/4 =5mhz
  145.                                                 Entonces nos da:
  146.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  147.                                                 SSPADD = ( 50 ) - 1
  148.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  149.                                                 */
  150.  
  151.  
  152. IdleI2C();
  153. StartI2C(); // Envia condición de start al bus i2c
  154. IdleI2C();
  155.  
  156.  
  157. WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  158.                       //  y le dice que se va a escribir con el bit0 en 0
  159. IdleI2C();
  160. /*
  161. (Write Mode):
  162. The slave address byte is the first byte received after the master generates the START condition.
  163. The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  164. which, for a write, is 0.
  165. */
  166.  
  167.  
  168. WriteI2C(0b00000000); //        pone el puntero del rtc en dirección 00h enviando la dirección del registro 0
  169. IdleI2C();
  170. /*
  171. After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  172. to the DS1337. This sets the register pointer on the DS1337.
  173. The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  174. The address pointer will increment after each data byte is transferred.
  175.  The master generates a STOP condition to terminate the data write.
  176. */
  177.  
  178. WriteI2C (bin2bcd(sec));                                //      (0b00000000); //        'REGISTER 0 =00H - SECONDS              0
  179. IdleI2C();
  180. WriteI2C(bin2bcd(min));                                 //      (0b01000011); //        'REGISTER 1 =01H - MINUTES      43
  181. IdleI2C();
  182. WriteI2C(bin2bcd(hour));                                //      (0b00100000); //        'REGISTER 2 =02H - HOURS        20
  183. IdleI2C();
  184. WriteI2C(bin2bcd(dayOfWeek));                   //      (0b00000000); //        'REGISTER 3 =03H - DAY          0
  185. IdleI2C();
  186. WriteI2C(bin2bcd(date));                                //      (0b00011001); //        'REGISTER 4 =04H - DATE         19
  187. IdleI2C();
  188. WriteI2C(bin2bcd(month));                               //      (0b00000010); //        'REGISTER 5 =05H - MONTH                02
  189. IdleI2C();
  190. WriteI2C(bin2bcd(year));                                //      (0b00010001); //        'REGISTER 6 =06H - YEAR         11
  191. IdleI2C();
  192. WriteI2C(bin2bcd(0));                                   // (0b00000000); //     'REGISTER 7 =07H -ALARM1   SECONDS                              0
  193. IdleI2C();
  194. WriteI2C(bin2bcd(0));                                   // (0b00000000); //     'REGISTER 8 =08H -ALARM1   MINUTES                              0
  195. IdleI2C();
  196. WriteI2C(bin2bcd(0));                                   // (0b00000000); //     'REGISTER 9 =09H -ALARM1   HOURS                                0
  197. IdleI2C();
  198. WriteI2C(bin2bcd(1));// (0b00000001); //        'REGISTER 10 =0AH - ALARM1 DAY=NO/DATE=SI       DATE    1
  199. IdleI2C();
  200. WriteI2C(bin2bcd(0));// (0b00000010); //        'REGISTER 11 =0BH -ALARM2  MIUNUTES                             2
  201. IdleI2C();
  202. WriteI2C(bin2bcd(0));// (0b00000000); //        'REGISTER 12 =0CH -ALARMA2 HOURS                                0
  203. IdleI2C();
  204. WriteI2C(bin2bcd(0));// (0b00011001); //        'REGISTER 13 =0DH -ALARMA2 DAY/DATE                             19
  205. IdleI2C();
  206. WriteI2C(bin2bcd(0b00000111));// (0b00000000); //       'REGISTER 14 =0EH -CONTROL                      bit7=0 Enable Oscilator
  207.                                           //                                                                            bit4=0 Rate select 2
  208.                                           //                                                                            bit3=0 Rate select 1
  209.                                       //                                                                                bit2=0 interrupt control
  210.                                           //                                                                            bit1=0 alarm 2 interrupt
  211.                                       //                                                                                bit0=0 alarm 1 interrupt                           
  212. IdleI2C();
  213. WriteI2C(0b00000000); //        'REGISTER 15 =0FH - STATUS                      bit7=0 pone a cero el oscilator stop flag
  214.                                           //                                                                            bit1=0 pone a cero el flag de alarm 2
  215.                                           //                                                                            bit0=0 pone a cero el flag de alarm 1
  216. IdleI2C();
  217. StopI2C();
  218. }
  219. /***** fin de rutina de inicialización de rtc ***************************************/
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228. /***** rutina de seteo de segundos del rtc ***************************************/
  229. void setSecRtcDs1337(unsigned int setSec)
  230. {
  231.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  232.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  233.                 /* When the MSSP is configured in Master mode, the lower seven
  234.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  235.  
  236.                                                 /*ejemplo usando cristal de 20mhz
  237.                                                 ((Fosc/4) / BiteRate )-1
  238.                                                 (Fosc/4) =20mhz/4 =5mhz
  239.                                                 Entonces nos da:
  240.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  241.                                                 SSPADD = ( 50 ) - 1
  242.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  243.                                                 */
  244.         IdleI2C();
  245.         StartI2C(); // Envia condición de start al bus i2c
  246.         IdleI2C();
  247.         /*
  248.         (Write Mode):
  249.         The slave address byte is the first byte received after the master generates the START condition.
  250.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  251.         which, for a write, is 0.
  252.         */
  253.  
  254.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  255.                           //  y le dice que se va a escribir con el bit0 en 0
  256.         IdleI2C();
  257.  
  258.         WriteI2C(0b00000000); //        pone el puntero del rtc en la dirección 00h correspondiente a los segundos
  259.         IdleI2C();
  260.         /*
  261.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  262.         to the DS1337. This sets the register pointer on the DS1337.
  263.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  264.         The address pointer will increment after each data byte is transferred.
  265.          The master generates a STOP condition to terminate the data write.
  266.         */
  267.         WriteI2C (bin2bcd(setSec));
  268.         IdleI2C();
  269.         StopI2C();
  270. }
  271. /***** fin de rutina de seteo de segundos del rtc ***************************************/
  272.  
  273.  
  274. /***** rutina de seteo de minutos del rtc ***************************************/
  275. void setMinRtcDs1337(unsigned int setMin)
  276. {
  277.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  278.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  279.                 /* When the MSSP is configured in Master mode, the lower seven
  280.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  281.  
  282.                                                 /*ejemplo usando cristal de 20mhz
  283.                                                 ((Fosc/4) / BiteRate )-1
  284.                                                 (Fosc/4) =20mhz/4 =5mhz
  285.                                                 Entonces nos da:
  286.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  287.                                                 SSPADD = ( 50 ) - 1
  288.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  289.                                                 */
  290.         IdleI2C();
  291.         StartI2C(); // Envia condición de start al bus i2c
  292.         IdleI2C();
  293.         /*
  294.         (Write Mode):
  295.         The slave address byte is the first byte received after the master generates the START condition.
  296.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  297.         which, for a write, is 0.
  298.         */
  299.  
  300.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  301.                           //  y le dice que se va a escribir con el bit0 en 0
  302.         IdleI2C();
  303.  
  304.         WriteI2C(0b00000001); //        pone el puntero del rtc en la dirección 01h correspondiente a los minutos
  305.         IdleI2C();
  306.         /*
  307.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  308.         to the DS1337. This sets the register pointer on the DS1337.
  309.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  310.         The address pointer will increment after each data byte is transferred.
  311.          The master generates a STOP condition to terminate the data write.
  312.         */
  313.         WriteI2C (bin2bcd(setMin));
  314.         IdleI2C();
  315.         StopI2C();
  316. }
  317. /***** fin de rutina de seteo de minutos del rtc ***************************************/
  318.  
  319.  
  320. /***** rutina de seteo de hora del rtc ***************************************/
  321. void setHourRtcDs1337(unsigned int setHour)
  322. {
  323.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  324.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  325.                 /* When the MSSP is configured in Master mode, the lower seven
  326.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  327.  
  328.                                                 /*ejemplo usando cristal de 20mhz
  329.                                                 ((Fosc/4) / BiteRate )-1
  330.                                                 (Fosc/4) =20mhz/4 =5mhz
  331.                                                 Entonces nos da:
  332.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  333.                                                 SSPADD = ( 50 ) - 1
  334.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  335.                                                 */
  336.         IdleI2C();
  337.         StartI2C(); // Envia condición de start al bus i2c
  338.         IdleI2C();
  339.         /*
  340.         (Write Mode):
  341.         The slave address byte is the first byte received after the master generates the START condition.
  342.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  343.         which, for a write, is 0.
  344.         */
  345.  
  346.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  347.                           //  y le dice que se va a escribir con el bit0 en 0
  348.         IdleI2C();
  349.  
  350.         WriteI2C(0b00000010); //        pone el puntero del rtc en la dirección 02h correspondiente a la hora
  351.         IdleI2C();
  352.         /*
  353.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  354.         to the DS1337. This sets the register pointer on the DS1337.
  355.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  356.         The address pointer will increment after each data byte is transferred.
  357.          The master generates a STOP condition to terminate the data write.
  358.         */
  359.         WriteI2C (bin2bcd(setHour));
  360.         IdleI2C();
  361.         StopI2C();
  362. }
  363. /***** fin de rutina de seteo de hora del rtc ***************************************/
  364.  
  365.  
  366.  
  367.  
  368.  
  369. /***** rutina de seteo de dia de la semana del rtc ***************************************/
  370.  
  371. void setDayOfWeekRtcDs1337(unsigned int setDayOfWeek)
  372. {
  373.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  374.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  375.                 /* When the MSSP is configured in Master mode, the lower seven
  376.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  377.  
  378.                                                 /*ejemplo usando cristal de 20mhz
  379.                                                 ((Fosc/4) / BiteRate )-1
  380.                                                 (Fosc/4) =20mhz/4 =5mhz
  381.                                                 Entonces nos da:
  382.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  383.                                                 SSPADD = ( 50 ) - 1
  384.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  385.                                                 */
  386.         IdleI2C();
  387.         StartI2C(); // Envia condición de start al bus i2c
  388.         IdleI2C();
  389.         /*
  390.         (Write Mode):
  391.         The slave address byte is the first byte received after the master generates the START condition.
  392.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  393.         which, for a write, is 0.
  394.         */
  395.  
  396.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  397.                           //  y le dice que se va a escribir con el bit0 en 0
  398.         IdleI2C();
  399.  
  400.         WriteI2C(0b00000011); //        pone el puntero del rtc en la dirección 03h correspondiente a DayOfWeek
  401.         IdleI2C();
  402.         /*
  403.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  404.         to the DS1337. This sets the register pointer on the DS1337.
  405.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  406.         The address pointer will increment after each data byte is transferred.
  407.          The master generates a STOP condition to terminate the data write.
  408.         */
  409.         WriteI2C (bin2bcd(setDayOfWeek));
  410.         IdleI2C();
  411.         StopI2C();
  412. }
  413. /***** fin de rutina de seteo de dia de la semana del rtc ***************************************/
  414.  
  415.  
  416. /***** rutina de seteo de dia del mes del rtc ***************************************/
  417. void setDateRtcDs1337(unsigned int setDate)
  418. {
  419.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  420.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  421.                 /* When the MSSP is configured in Master mode, the lower seven
  422.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  423.  
  424.                                                 /*ejemplo usando cristal de 20mhz
  425.                                                 ((Fosc/4) / BiteRate )-1
  426.                                                 (Fosc/4) =20mhz/4 =5mhz
  427.                                                 Entonces nos da:
  428.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  429.                                                 SSPADD = ( 50 ) - 1
  430.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  431.                                                 */
  432.         IdleI2C();
  433.         StartI2C(); // Envia condición de start al bus i2c
  434.         IdleI2C();
  435.         /*
  436.         (Write Mode):
  437.         The slave address byte is the first byte received after the master generates the START condition.
  438.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  439.         which, for a write, is 0.
  440.         */
  441.  
  442.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  443.                           //  y le dice que se va a escribir con el bit0 en 0
  444.         IdleI2C();
  445.  
  446.         WriteI2C(0b00000100); //        pone el puntero del rtc en la dirección 04h correspondiente a día de la semana
  447.         IdleI2C();
  448.         /*
  449.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  450.         to the DS1337. This sets the register pointer on the DS1337.
  451.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  452.         The address pointer will increment after each data byte is transferred.
  453.          The master generates a STOP condition to terminate the data write.
  454.         */
  455.         WriteI2C (bin2bcd(setDate));
  456.         IdleI2C();
  457.         StopI2C();
  458. }
  459. /***** fin de rutina de seteo de dia del mes del rtc ***************************************/
  460.  
  461.  
  462. /***** rutina de seteo del mes del rtc ***************************************/
  463. void setMonthRtcDs1337(unsigned int setMonth)
  464. {
  465.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  466.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  467.                 /* When the MSSP is configured in Master mode, the lower seven
  468.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  469.  
  470.                                                 /*ejemplo usando cristal de 20mhz
  471.                                                 ((Fosc/4) / BiteRate )-1
  472.                                                 (Fosc/4) =20mhz/4 =5mhz
  473.                                                 Entonces nos da:
  474.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  475.                                                 SSPADD = ( 50 ) - 1
  476.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  477.                                                 */
  478.         IdleI2C();
  479.         StartI2C(); // Envia condición de start al bus i2c
  480.         IdleI2C();
  481.         /*
  482.         (Write Mode):
  483.         The slave address byte is the first byte received after the master generates the START condition.
  484.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  485.         which, for a write, is 0.
  486.         */
  487.  
  488.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  489.                           //  y le dice que se va a escribir con el bit0 en 0
  490.         IdleI2C();
  491.  
  492.         WriteI2C(0b00000101); //        pone el puntero del rtc en la dirección 05h correspondiente al mes
  493.         IdleI2C();
  494.         /*
  495.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  496.         to the DS1337. This sets the register pointer on the DS1337.
  497.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  498.         The address pointer will increment after each data byte is transferred.
  499.          The master generates a STOP condition to terminate the data write.
  500.         */
  501.         WriteI2C (bin2bcd(setMonth));
  502.         IdleI2C();
  503.         StopI2C();
  504. }
  505. /***** fin de rutina de seteo del mes del rtc ***************************************/
  506.  
  507.  
  508. // ***** rutina de seteo del año del rtc **************************************
  509. void setYearRtcDs1337(unsigned int setYear)
  510. {
  511.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  512.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  513.         IdleI2C();
  514.         StartI2C(); // Envia condición de start al bus i2c
  515.         IdleI2C();
  516.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  517.                           //  y le dice que se va a escribir con el bit0 en 0
  518.         IdleI2C();
  519.  
  520.         WriteI2C(0b00000110); //        pone el puntero del rtc en la dirección 06h correspondiente al año
  521.         IdleI2C();
  522.         WriteI2C (bin2bcd(setYear));
  523.         IdleI2C();
  524.         StopI2C();
  525. }
  526. // ***** fin de rutina de seteo del año del rtc ***************************************
  527.  
  528.  
  529.  
  530. // ***** rutina de seteo de alarma1 del rtc ***************************************
  531. // NOTA: falta implementar la máscara de los registros 07h a 0ah de los bit7 para setear el alarm Rate.
  532. // La función setea la alarma con la opción por defecto todos los bits 7 en cero. (se activa la alarma
  533. // cuando se igualan los segundos, minutos, horas, y dia del mes.
  534.  
  535. void setAlarm1RtcDs1337(unsigned int setHour,
  536.                                                 unsigned int setMin,
  537.                                                 unsigned int setSec,
  538.                                                 unsigned int setDate)
  539. {
  540.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  541.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  542.         IdleI2C();
  543.         StartI2C(); // Envia condición de start al bus i2c
  544.         IdleI2C();
  545.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  546.                           //  y le dice que se va a escribir con el bit0 en 0
  547.         IdleI2C();
  548.         WriteI2C(0b00000111); //        pone el puntero del rtc en la dirección 07h correspondiente a los segundos alarma1
  549.         IdleI2C();
  550.  
  551.         WriteI2C (bin2bcd(setSec));                            
  552.         IdleI2C();
  553.         WriteI2C(bin2bcd(setMin));                                     
  554.         IdleI2C();
  555.         WriteI2C(bin2bcd(setHour));                            
  556.         IdleI2C();
  557.         WriteI2C(bin2bcd(setDate));                    
  558.         IdleI2C();
  559.         StopI2C();
  560. }
  561. /***** fin de rutina de seteo de alarma1 del rtc ********************************/
  562.  
  563. // ****** rutina de seteo de alarma2 del rtc ***************************************
  564. // NOTA: falta implementar la máscara de los registros 0bh a 0dh de los bit7 para setear el alarm Rate.
  565. // La función setea la alarma con la opción por defecto todos los bits 7 en cero. (se activa la alarma
  566. // cuando se igualan los minutos, horas, y dia del mes.
  567. void setAlarm2RtcDs1337(unsigned int setHour,
  568.                                             unsigned int setMin,
  569.                                                 unsigned int setDate)
  570. {
  571.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  572.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  573.                                        
  574.         IdleI2C();
  575.         StartI2C(); // Envia condición de start al bus i2c
  576.         IdleI2C();
  577.  
  578.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  579.                           //  y le dice que se va a escribir con el bit0 en 0
  580.         IdleI2C();
  581.  
  582.         WriteI2C(0b00001011); //        pone el puntero del rtc en la dirección 0bh correspondiente a los minutos alarma2
  583.         IdleI2C();
  584.         WriteI2C(bin2bcd(setMin));                                     
  585.         IdleI2C();
  586.         WriteI2C(bin2bcd(setHour));                            
  587.         IdleI2C();
  588.         WriteI2C(bin2bcd(setDate));                    
  589.         IdleI2C();
  590.         StopI2C();
  591. }
  592. // ***** fin de rutina de seteo de alarma2 del rtc ********************************
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612. // ****** rutina de reseteo de alarma1 del rtc ***************************************
  613.  
  614.  
  615. void resetAlarm1RtcDs1337(void)
  616. {
  617.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  618.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  619.                                        
  620.         IdleI2C();
  621.         StartI2C(); // Envia condición de start al bus i2c
  622.         IdleI2C();
  623.  
  624.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  625.                           //  y le dice que se va a escribir con el bit0 en 0
  626.         IdleI2C();
  627.  
  628.         WriteI2C(0b00001111); //        pone el puntero del rtc en la dirección 0fh correspondiente a los flags de alarmas
  629.         IdleI2C();
  630.         WriteI2C(0b00000010);                                  
  631.         IdleI2C();
  632.         StopI2C();
  633.  
  634. }
  635. // ****** final de rutina de reseteo de alarma1 del rtc ***************************************
  636.  
  637.  
  638.  
  639.  
  640.  
  641. // ****** rutina de reseteo de alarma2 del rtc ***************************************
  642.  
  643. void resetAlarm2RtcDs1337(void)
  644. {
  645.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  646.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  647.                                        
  648.         IdleI2C();
  649.         StartI2C(); // Envia condición de start al bus i2c
  650.         IdleI2C();
  651.  
  652.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  653.                           //  y le dice que se va a escribir con el bit0 en 0
  654.         IdleI2C();
  655.  
  656.         WriteI2C(0b00001111); //        pone el puntero del rtc en la dirección 0fh correspondiente a los flags de alarmas
  657.         IdleI2C();
  658.         WriteI2C(0b00000001);                                  
  659.         IdleI2C();
  660.         StopI2C();
  661.  
  662. }
  663.  
  664. // ****** final de rutina de reseteo de alarma2 del rtc ***************************************
  665.  
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682. /***** rutina de seteo de salida de onda cuadrada del rtc ***************************************/
  683. void setSquareWaveRtcDs1337(unsigned int setEnable,
  684.                                                 unsigned int setRate)
  685. {
  686.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  687.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  688.         IdleI2C();
  689.         StartI2C(); // Envia condición de start al bus i2c
  690.         IdleI2C();
  691.  
  692.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  693.                           //  y le dice que se va a escribir con el bit0 en 0
  694.         IdleI2C();
  695.  
  696.         WriteI2C(0b00001110); //        pone el puntero del rtc en la dirección 0eh correspondiente al registro de control
  697.         IdleI2C();
  698.         if (setEnable == 1)
  699.                 {
  700.       // ACA FALTA IMPLEMENTAR UN SWITCH CASE para seleccionar los diferentes rates
  701.                                         WriteI2C(0b00000000);                                  
  702.                                         IdleI2C();
  703.                                         StopI2C();
  704.         }  
  705.         else
  706.                 {
  707.                 WriteI2C(0b00000100);                                  
  708.                 IdleI2C();
  709.                 StopI2C();
  710.         }  
  711. }
  712. /***** fin de rutina de seteo de salida de onda cuadrada del rtc ********************************/
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753. /***** rutina de lectura de datos de rtc ***************************************/
  754.  
  755.  
  756. void readRtcDs1337(void)
  757. {
  758. /* Para leer los datos del rtc primero debemos enviar la posición del puntero de registro
  759.  Para ello se siguen los siguientes pasos:
  760.  
  761. * verificar que el bus i2c esté desocupado con idleI2C()
  762. * se envía una condición de start con StartI2C()
  763. * verificar que el bus i2c esté desocupado con idleI2C()
  764. * se envía la dirección del rtc (1101000) más el bit 0 para informar que vamos a escribir =0b11010000
  765. * se escribe la dirección del puntero de registro a la que queremos apuntar. pej al registro 0=0b00000000
  766. * luego enviamos nuevamente la condición de start
  767. * se envía la dirección del rtc (1101000) más el bit 1 para informar que vamos a leer =0b11010001
  768.  
  769. * se lee el registro apuntado con ReadI2C()
  770. * se le dice al slave AckI2C() para informar que se leyó el valor
  771. * verificar que el bus i2c esté desocupado con idleI2C()
  772. * para leer el registro siguiente lo hacemos nuevamente con ReadI2C()
  773. * se le dice al slave AckI2C() para informar que se leyó el valor
  774. * verificar que el bus i2c esté desocupado con idleI2C()
  775. * una vez que no querémos seguir leyendo más registros debemos informar al slave tal circunstancia
  776. terminando la lectura con NotAckI2C()
  777. * verificar que el bus i2c esté desocupado con idleI2C()
  778. * Dejampos libre el bus i2c con StopI2C()
  779. */
  780.  
  781. // prepara lo necesario para hacer la lectura
  782.         IdleI2C();
  783.         StartI2C(); // Envia condición de start al bus i2c
  784.         IdleI2C();
  785.        
  786.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  787.                               //  y le dice que se va a escribir con el bit0 en 0
  788.         IdleI2C();
  789.        
  790.         WriteI2C(0b00000000); // pone el puntero del rtc en dirección 00h enviando la dirección del registro 0
  791.         IdleI2C();
  792.        
  793.         RestartI2C(); // Envia condición de restart al bus i2c
  794.         IdleI2C();
  795.         WriteI2C(0b11010001); // escribe la dirección del rtc (0b1101000) y último bit en 1  = hex D1=0b11010001)
  796.                               //  con este último bit0 en 1 se le dice al rtc que se va a leer
  797.         IdleI2C();
  798.        
  799. // COMIENZA LECTURA
  800.  
  801. // lee registro 00H **** LECTURA DE SEGUNDOS ****************************************
  802.         sec = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  803.         AckI2C();
  804.         IdleI2C();
  805.        
  806.         RTC.unidadesSec = sec &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  807.        
  808.         RTC.decenasSec =( sec  &0b01110000);// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  809.         RTC.decenasSec = RTC.decenasSec >>4;
  810.  
  811.  
  812. // lee registro 01H **** LECTURA DE MINUTOS ****************************************
  813.         min = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  814.         AckI2C();
  815.         IdleI2C();
  816.        
  817.         RTC.unidadesMin = min &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  818.        
  819.         RTC.decenasMin = min  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  820.         RTC.decenasMin = RTC.decenasMin >>4;
  821.        
  822.        
  823. // lee registro 02H **** LECTURA DE HORAS ******************************************
  824.         hour = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  825.         AckI2C();
  826.         IdleI2C();
  827.        
  828.         RTC.unidadesHour = hour &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  829.         RTC.decenasHour = hour  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  830.         RTC.decenasHour = RTC.decenasHour >>4;
  831.  
  832. // lee registro 03H **** LECTURA DEL DIA DE LA SEMANA ******************************************
  833.         dayWeek = ReadI2C()& 0b00000111; // enmascara el nibble alto.
  834.         AckI2C();
  835.         IdleI2C();
  836.        
  837.         RTC.dayWeek = dayWeek; // copio el valor leido
  838.        
  839. // lee registro 04H **** LECTURA DE DIA DEL MES ******************************************
  840.         date = ReadI2C()& 0b00111111; // enmascara el octavo y séptimo bit que no se usan.
  841.         AckI2C();
  842.         IdleI2C();
  843.        
  844.         RTC.unidadesDate = date &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  845.         RTC.decenasDate = date  &0b00110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  846.         RTC.decenasDate = RTC.decenasDate >>4;
  847.        
  848. // lee registro 05H **** LECTURA DE MES ******************************************
  849.         month = ReadI2C()& 0b00011111; // enmascara el octavo, séptimo, y sexto bit que no se usan.
  850.         AckI2C();
  851.         IdleI2C();
  852.        
  853.         RTC.unidadesMonth = month &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  854.        
  855.         RTC.decenasMonth = month &0b00010000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  856.         RTC.decenasMonth = RTC.decenasMonth >>4;
  857.        
  858. // lee registro 06H **** LECTURA DE AÑO ******************************************
  859.         year = ReadI2C();
  860. // Como es la última lectura que en este caso se le pide al bus i2c se finaliza con NotAckI2C() y StopI2C()      
  861.         NotAckI2C();
  862.         IdleI2C();
  863.         StopI2C();
  864.  
  865.         RTC.unidadesYear = year &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  866.         RTC.decenasYear = year &0b11110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  867.         RTC.decenasYear = RTC.decenasYear >>4;
  868.  
  869. // *********** Convierte los balores leidos en formato bcd a formato binario ********************
  870.         sec=bcd2bin(sec);
  871.         min=bcd2bin(min);
  872.         hour=bcd2bin(hour);
  873.         date=bcd2bin(date);
  874.         month=bcd2bin(month);
  875.         year=bcd2bin(year);
  876. }
  877. /***** final de rutina de lectura de datos de rtc ***************************************/
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893. /***** rutina de lectura de datos de las alarmas del rtc ***************************************/
  894.  
  895. void readAlarmsRtcDs1337(void)
  896. {
  897. // prepara lo necesario para hacer la lectura
  898.         IdleI2C();
  899.         StartI2C(); // Envia condición de start al bus i2c
  900.         IdleI2C();
  901.        
  902.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  903.                               //  y le dice que se va a escribir con el bit0 en 0
  904.         IdleI2C();
  905.        
  906.         WriteI2C(0b00000111); // pone el puntero del rtc en dirección 07H enviando la dirección del registro 7
  907.         IdleI2C();
  908.        
  909.         RestartI2C(); // Envia condición de restart al bus i2c
  910.         IdleI2C();
  911.         WriteI2C(0b11010001); // escribe la dirección del rtc (0b1101000) y último bit en 1  = hex D1=0b11010001)
  912.                               //  con este último bit0 en 1 se le dice al rtc que se va a leer
  913.         IdleI2C();
  914.        
  915. // COMIENZA LECTURA
  916.  
  917. // lee registro 07H **** LECTURA DE SEGUNDOS alarm1 ****************************************
  918.         alarm1sec = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  919.         AckI2C();
  920.         IdleI2C();
  921.        
  922.         RTC.unidadesSecAlarm1 = alarm1sec &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  923.        
  924.         RTC.decenasSecAlarm1 =( alarm1sec  &0b01110000);// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  925.         RTC.decenasSecAlarm1 = RTC.decenasSecAlarm1 >>4;
  926.  
  927.  
  928. // lee registro 08H **** LECTURA DE MINUTOS alarm1 ****************************************
  929.         alarm1min = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  930.         AckI2C();
  931.         IdleI2C();
  932.        
  933.         RTC.unidadesMinAlarm1 = alarm1min &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  934.        
  935.         RTC.decenasMinAlarm1 = alarm1min  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  936.         RTC.decenasMinAlarm1 = RTC.decenasMinAlarm1 >>4;
  937.        
  938.        
  939. // lee registro 09H **** LECTURA DE HORAS alarm1 ******************************************
  940.         alarm1hour = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  941.         AckI2C();
  942.         IdleI2C();
  943.        
  944.         RTC.unidadesHourAlarm1 = alarm1hour &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  945.         RTC.decenasHourAlarm1 = alarm1hour  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  946.         RTC.decenasHourAlarm1 = RTC.decenasHourAlarm1 >>4;
  947.  
  948.  
  949.  
  950. // lee registro 10H **** LECTURA DEL DIA DEL MES alarm1 ******************************************
  951.         alarm1date = ReadI2C()& 0b00111111; // enmascara el octavo y séptimo bit que no se usan.
  952.         AckI2C();
  953.         IdleI2C();
  954.        
  955.         RTC.unidadesDateAlarm1 = alarm1date &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  956.         RTC.decenasDateAlarm1 = alarm1date  &0b00110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  957.         RTC.decenasDateAlarm1 = RTC.decenasDateAlarm1 >>4;
  958.        
  959.  
  960. // lee registro 11H **** LECTURA DE MINUTOS alarm2 ****************************************
  961.         alarm2min = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  962.         AckI2C();
  963.         IdleI2C();
  964.        
  965.         RTC.unidadesMinAlarm2 = alarm2min &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  966.        
  967.         RTC.decenasMinAlarm2 = alarm2min  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  968.         RTC.decenasMinAlarm2 = RTC.decenasMinAlarm2 >>4;
  969.        
  970.        
  971. // lee registro 12H **** LECTURA DE HORAS alarm 2 ******************************************
  972.         alarm2hour = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  973.         AckI2C();
  974.         IdleI2C();
  975.        
  976.         RTC.unidadesHourAlarm2 = alarm2hour &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  977.         RTC.decenasHourAlarm2 = alarm2hour  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  978.         RTC.decenasHourAlarm2 = RTC.decenasHourAlarm2 >>4;
  979.  
  980.  
  981.  
  982. // lee registro 13H **** LECTURA UNIDADES DE DIA DEL MES ALARM2 ******************************************
  983.         alarm2date = ReadI2C()& 0b00111111; // enmascara el octavo y séptimo bit que no se usan.
  984.  
  985. // Como es la última lectura que en este caso se le pide al bus i2c se finaliza con NotAckI2C() y StopI2C()      
  986.         NotAckI2C();
  987.         IdleI2C();
  988.         StopI2C();
  989.        
  990.         RTC.unidadesDateAlarm2 = alarm2date &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  991.         RTC.decenasDateAlarm2 = alarm2date  &0b00110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  992.         RTC.decenasDateAlarm2 = RTC.decenasDateAlarm2 >>4;
  993.        
  994.        
  995.  
  996. // *********** Convierte los balores leidos en formato bcd a formato binario ********************
  997.         alarm1sec=bcd2bin(alarm1sec);
  998.         alarm1min=bcd2bin(alarm1min);
  999.         alarm1hour=bcd2bin(alarm1hour);
  1000.         alarm1date=bcd2bin(alarm1date);
  1001.         alarm2min=bcd2bin(alarm2min);
  1002.         alarm2hour=bcd2bin(alarm2hour);
  1003.         alarm2date=bcd2bin(alarm2date);
  1004.  
  1005. }
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018. /***** fin de rutina de lectura de datos de las alarmas del rtc ***************************************/
  1019.  
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039. /****************** función para convertir digito binario a bcd *********************************************/
  1040. /* primero compruebo si el número binario es mayor o igual que el número 10.
  1041. Si es menor que el 10 directamente asigno a l_digit el valor del número pasado como parámetro --->    l_digit=valor;
  1042.  
  1043. Si el número pasado como parámetro es mayor o igual que 10 le voy restando 10 unidades hasta que dicho valor
  1044. sea menor que 10 y en cada iteración voy incrementando en una unidad a h_digit.
  1045. Una vez que el valor es menor que 10 asigno el valor a l_digit
  1046. */
  1047.  
  1048. unsigned short int bin2bcd(unsigned short int binaryByte)
  1049. {
  1050.           unsigned short int temp=0;
  1051.           unsigned short int l_digit, h_digit;
  1052.           h_digit=0;
  1053.           l_digit=0;
  1054.           temp=binaryByte;
  1055.           if (temp>=10){
  1056.             do{
  1057.               temp-=10;
  1058.               h_digit++;
  1059.             }while (temp>=10);
  1060.           }
  1061.           l_digit=temp;
  1062.      h_digit = h_digit <<4; // muevo las decenas al nible alto
  1063.      
  1064.         return (h_digit | l_digit); // combina nibblealto y nibblebajo  para hacer packed bcd
  1065. }
  1066. /****************** final función para convertir digito binario a bcd ***************************************/
  1067.  
  1068.  
  1069.  
  1070. // ******función para pasar de bcd a valor entero ***************************************************
  1071.  
  1072. unsigned short int bcd2bin(unsigned short int PackedBCDbyte)
  1073. {
  1074.         unsigned short int temp;
  1075.         temp = PackedBCDbyte;
  1076.         temp >>= 1; // saco el bit 8 que no se usa
  1077.         temp &= 0x78; // hago una máscara con 0b01111000 para dejar pasar sólo los bits 7 a 3
  1078.      
  1079.         return(temp + //    sumo las centenas // 40decimal
  1080.                   (temp >> 2) + // sumo  las decenas      // 10 decimal
  1081.                   (PackedBCDbyte & 0x0f));// paso las unidades // 9decimal
  1082. }
  1083.  
  1084. /*
  1085.  ejemplo  de uso:
  1086.  
  1087.            dato pasado como parámetro a la función: 0b01011001  
  1088.  
  1089.             0101=5 1001=9 BCD = decimal 89 = binario 01011001
  1090.  
  1091.        temp=0b01011001
  1092.  >>1   temp=0b00101100
  1093.  &=0x78     0b01111000 aplica máscara desde el bit7 a bit3
  1094.        temp=0b00101000  = 40decimal
  1095.  
  1096.  >>2   temp=0b00001010  = 10 decimal
  1097.  
  1098.  PackedBCDbyte 0b01011001  
  1099.                   & 0x0f 0b00001111
  1100.             ------------------
  1101.               =0b00001001 = 9 decimal
  1102.  return (40decimal +(10decimal) + 9decimal = 59 decimal = 0x3b = 0011 1011
  1103.  
  1104. */
  1105.  
  1106. // ******final función para pasar de bcd a valor entero ***************************************************
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: ZAZA en 02 de Mayo de 2011, 12:42:54
Código: [Seleccionar]
#include <p18f4550.h>
#include <i2c.h>
#define RTC_SDA  PIN_B0
#define RTC_SCL  PIN_B1

#pragma config PLLDIV = 1 // No prescale (4 MHz oscillator input drives PLL directly)
#pragma config CPUDIV = OSC1_PLL2 // [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
#pragma config USBDIV = 1 // USB clock source comes directly from the primary oscillator block with no postscale
#pragma config FOSC = XT_XT // HS oscillator, HS used by USB
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor disabled
#pragma config IESO = OFF // Oscillator Switchover mode disabled
#pragma config PWRT = OFF // PWRT disabled
#pragma config BOR = OFF // Brown-out Reset disabled in hardware and software
#pragma config VREGEN = OFF // USB voltage regulator disabled
#pragma config WDT = OFF // HW Disabled - SW Controlled
#pragma config MCLRE = ON // MCLR pin enabled; RE3 input pin disabled
#pragma config LPT1OSC = OFF // Timer1 configured for higher power operation
#pragma config PBADEN = OFF // PORTB<4:0> pins are configured as digital I/O on Reset
#pragma config CCP2MX = ON // CCP2 input/output is multiplexed with RC1
#pragma config STVREN = ON // Stack full/underflow will cause Reset
#pragma config LVP = OFF // Single-Supply ICSP disabled
#pragma config ICPRT = OFF // ICPORT disabled
#pragma config XINST = OFF // Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
#pragma config DEBUG = OFF // Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
// Data and code memory without protection

unsigned char SEG,MIN,HRS,DAY,DIA,MES,ANO,SEGUNDOS;
int BAN=1;


void main(void)
{
//CONFIGURAR SSPCON1
SSPCON1 = 0X00;
SSPCON1bits.SSPEN = 1;


// CONFIGURAR BRG A velocidad de 100 KHZ con un cristal de 4MHZ
    SPBRG = 0x027;

//CONFIGURACION ADCON1 TODOS SALIDAS DIGITALES
ADCON1=0x0f;

//CONFIGURACION TRISB
TRISB= 0x03;
    TRISD=0x00;
    PORTD=0B00000000;
SEG=0b00000000;

IdleI2C();
StartI2C();
IdleI2C();
WriteI2C(0B11010000);// DIRECCION DEL DS1307 EN ESCLAVO
IdleI2C();
WriteI2C(0B00000000);//INDICA QUE POSICION SE VERA CAMBIADA, EN ESTE CASO LOS SEGUNDOS
IdleI2C();
WriteI2C(SEG);// iNDICA EL SEG. ACTUAL
IdleI2C();
StopI2C();//DEJA DE MANDAR INSTRUCCIONES



do
{

//pROCESO DE lECTURA
IdleI2C();
StartI2C();
IdleI2C();
WriteI2C(0b11010000); // INDICA LA DIRECCION DEL ESCLAVO CON EL BIT 0=0 PARA ESCRIBIR EL APUNTADOR
IdleI2C();
WriteI2C(0b00000000); // PONE EL PUNTERO EN EL REGISTRO 0(SEGUNDOS)
IdleI2C();
RestartI2C(); // REINICIA I2C
IdleI2C();
WriteI2C(0b11010001); // SE COLOCA LA DIRECCION DEL ESCLAVO CON EL BIT 0=1 PARA INDICAR LECTURA
IdleI2C();

SEGUNDOS = ReadI2C(); // GUARDA LA LECTURA DE LOS SEGUNDOS
AckI2C();
IdleI2C();
NotAckI2C();
IdleI2C();
StopI2C();

PORTD=SEGUNDOS;//SE MANDA LA VARIABLE DE SEGUNDOS AL PUERTO D

}while(BAN==0);
   

}

este es el programa con la adaptacion del idleI2C(); basandome en el codigo de jukinch y pues sigo sin ver el cambio en los leds que coloque en el puerto D, que mas puedo estar haciendo mal?! GRACIAS! :)
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jukinch en 02 de Mayo de 2011, 15:32:45
Pusiste las resistencias de pullups para el i2c?
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: ZAZA en 02 de Mayo de 2011, 15:47:23
Hola jukinch!
si, las resistencias que puse son de 47kohms y van a las lineas de comunicacion scl y sda...verdad?! o son otras?! :S
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jukinch en 03 de Mayo de 2011, 10:52:32
yo uso resistencias de 4k7 no de 47k.
Y como vos decís, las pongo de la línea de scl y sda a 5v.
         
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jukinch en 03 de Mayo de 2011, 11:45:05
Podrías mostrar un esquemático de como has conectado el ds1307?
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Wirry85 en 26 de Septiembre de 2011, 16:00:09
Hola chicos,

Os explico mi problema estoy haciendo un reloj nixie con el DS1307 y el PIC16F1518 (es bastante nuevo).

No se programar mucho con I2C me gustaría que me ayudaran con mi problema.

El problema es el siguiente:

No se como comunicar el DS1307 con el PIC por I2C, como se explica en el primer post hay que poner a 0 ó 1 unos bits para que te de un pulso de 1 seg y poder leer los datos de la memoria del DS1307 pero no lo consigo. No se como funciona.

Me podría hacer alguien una breve explicación de la programación con I2C.

El código:

Código: [Seleccionar]
#include <16F1518.h>
#fuses XT,NOWDT,NOPROTECT
#use delay (clock=8000000)
#use i2c (Master, sda=PIN_C4, scl=PIN_C3)
#use standard_io(C)
#BYTE TRISC = 0x87
#BYTE PORTC = 0x07
//#USE fast_io (A)
//#USE fast_io (B)
                 
                   
int ano,mes,dia,dia_set,hor,hor_2,min,min_2,sec,sec_2;
                 
/******************************************************************************
                              DS1307
******************************************************************************/


void tiempo (byte &ano, byte &mes, byte &dia, byte &dia_set, byte &hor, byte &hor_2, byte &min, byte &min_2, byte &sec, byte &sec_2)
{
   i2c_start();                //Escritura
   i2c_write(0xD0);            //Código de escritura
   i2c_write(0x00);            //Puntero a la primera dirección
   i2c_start();                //Lectura
   i2c_write(0xD1);            //Código de lectura
   
   sec = (i2c_read()&0x7f);     //Lectura de los 4 bits de los segundos
   sec_2 = sec>>4;
   min = (i2c_read()&0x7f);    //Lectura de los 7 bits de los minutos
   min_2 = min>>4;
   hor = (i2c_read()&0x3f);    //Lectura de los 6 bits de los horas
   hor_2 = hor>>4;
   dia_set=(i2c_read()&0x7);   //Lectura de los 3 bits de los dias de la setmana
   dia = (i2c_read()&0x7f);    //Lectura de los 6 bits de los dias
   mes = (i2c_read()&0x1f);    //Lectura de los 5 bits de los meses
   ano = (i2c_read(0)&0xff);   //Lectura de los 8 bits de los años
   i2c_stop();
}
/******************************************************************************
                              PROGRAMA PRINCIPAL
******************************************************************************/
   void main()
   {
                   
    while(1)
    {
      tiempo(ano,mes,dia,dia_set,hor,hor_2,min,min_2,sec,sec_2);     //Lee tiempo del DS1307
     
      output_A(hor_2);
      output_B(hor); 
      output_high(PIN_C0);
      output_high(PIN_C1);
      delay_ms(400);
      output_low(PIN_C0);
      output_low(PIN_C1);   

      output_A(min_2);
      output_B(min);
      output_high(PIN_C2);
      output_high(PIN_C5);
      delay_ms(400);
      output_low(PIN_C2);
      output_low(PIN_C5);

      output_A(sec_2);
      output_B(sec);
      output_high(PIN_C6);
      output_high(PIN_C7);
      delay_ms(400);
      output_low(PIN_C6);
      output_low(PIN_C7);

     }
    }

Muchas gracias.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Suky en 26 de Septiembre de 2011, 16:02:23
Probaste en usar la librería de Red_pic ? Si quieres re-inventar la rueda, por lo menos úsala como base  ;-)


Saludos!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Wirry85 en 26 de Septiembre de 2011, 16:10:06
Probaste en usar la librería de Red_pic ? Si quieres re-inventar la rueda, por lo menos úsala como base  ;-)


Saludos!

Me gustaría pero claro si no se programar en I2C no puedo hacerlo,

Me podéis dar unas nociones básicas por favor.

Gracias.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Suky en 26 de Septiembre de 2011, 16:21:26
Para sacar adelante un proyecto del estilo te recomiendo las siguientes fuentes de información:

Comunicación: Bus I2C (http://robots-argentina.com.ar/Comunicacion_busI2C.htm)

Datasheet del PIC16F1518 (http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en549052)

Datasheet ds1307 (http://www.google.com.ar/url?sa=t&source=web&cd=1&ved=0CDEQFjAA&url=http%3A%2F%2Fwww.sparkfun.com%2Fdatasheets%2FComponents%2FDS1307.pdf&ei=ENCATubOIufl0QGt5pXpDw&usg=AFQjCNEXUeVDh1xzoJg6-eZfb2Ga4Xmjhw)

+ Help del compilador que estés utilizando, como para entender como utilizar las funciones que trabajan con el módulo MSSP del microcontrolador.


En la libreria de Red_PIC revisa en detalle la función DS1307Init que configura el registro para obtener el pulso que mencionas.


Saludos!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Wirry85 en 26 de Septiembre de 2011, 17:09:59
Muchas gracias, le echare un vistazo utilizo el CCS.

Saludos.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: gera en 08 de Octubre de 2011, 00:20:10
Hola!! Una preguntita, puedo utilizar esta libreria en un PIC que no tenga i2c? En CCS con la directiva #use i2c estaria implementando el protocolo por software, cierto?
Gracias!!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Nocturno en 08 de Octubre de 2011, 00:58:38
Efectivamente, la emulación I2C por software que implementa CCS funciona perfectamente, con excepción de la interrupción de dato recibido. Si no usas esta interrupción en la librería, te funcionará bien.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: gera en 08 de Octubre de 2011, 01:46:16
Muchas gracias Manolo!! Lo necesito para el llaverito giratorio ;) pienso ponerle reloj jeje.
Saludos!!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Guevu en 14 de Octubre de 2011, 11:06:46
Buenas tardes estoy usando un ds1307 con un pic18f452, usando la libreria me funciona pero me  va un pelin rapido, podria ser por el cristal? que es lo que hay que soldar a tierra?, las dos patillas del cristal, o la carcasa cilindrica exterior?, tiene que ser de 12.5pF obligatoriamente???

Gracias gente, haceis un excelente trabajo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Suky en 14 de Octubre de 2011, 11:30:19
Las patillas no van a GND! Y tampoco necesita capacitor externo.


Saludos!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jukinch en 14 de Octubre de 2011, 11:31:38
Hola Guevu:
            cito a un amigo que hizo un artículo al respecto:
 Una consideración especial se debe tener a la hora de montar el cristal de 32768Khz. Primero debes saber que será muy difícil lograr un circuito impreso óptimo para obtener una precisión ideal en el funcionamiento del reloj. Luego, debes comprender también que es de suma rareza encontrar cristales que resuenen a la frecuencia exacta que indica su nomenclatura. Es decir, lo normal será encontrar cristales con una “tolerancia” de error que a lo largo de los días (o meses) se haga notable en algunos segundos de atraso o adelanto de la hora grabada. Si las variaciones son de muchos minutos en pocas semanas, sin dudas debemos cambiar el cristal por otro de mejor calidad. Pero si optas por un cristal común (sin demasiada selección especial), con un lazo de alambre conectado a GND (como ves en la imagen superior), con un buen plano de tierra en los alrededores de su conexión (tal como indica la hoja de datos del DS1307) y con un largo adecuado de los pines de conexión, debes lograr una pequeña variación de pocos segundos en uno o dos meses. NUNCA obtendrás una precisión absoluta pero al menos puedes aproximarte mucho a un excelente funcionamiento. Observa los planos de tierra en el circuito impreso. (http://cms.teotrack.com/images/Cache/B3B5x590y590.jpg)

(http://cms.teotrack.com/images/Cache/B3B6x590y590.jpg)

fuente : http://www.neoteo.com/ds1307-reloj-en-tiempo-real-con-18f2550
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Suky en 14 de Octubre de 2011, 12:24:46
Lo que va a GND es el pin VBat si no usas una batería.


Saludos!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: JOJOJORGE5 en 15 de Octubre de 2011, 21:37:00
(http://cms.teotrack.com/images/Cache/B3B5x590y590.jpg)
fuente : http://www.neoteo.com/ds1307-reloj-en-tiempo-real-con-18f2550

Pues si esa configuración la vi también en muchas placas base de PC solo que en ese caso al ser placas multilayer la carcasa del cristal iba soldada directamente al plano de tierra.
si ellos la usan debe ser buena.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: bmfranky en 04 de Noviembre de 2011, 09:47:17
Buenas tardes estoy usando un ds1307 con un pic18f452, usando la libreria me funciona pero me  va un pelin rapido, podria ser por el cristal? que es lo que hay que soldar a tierra?, las dos patillas del cristal, o la carcasa cilindrica exterior?, tiene que ser de 12.5pF obligatoriamente???

Gracias gente, haceis un excelente trabajo

Según el datasheet, el cristal tiene que ser 12,5pf compatible.

Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: bmfranky en 04 de Noviembre de 2011, 10:01:48
Hola chicos, aprovecho para preguntar, si les sabría mal, que pusiese un enlace directo a este hilo, en la descripción del articulo, de unos kits de RTC DS1307 que he puesto a la venta en ebay, la verdad es que no lo he puesto porque no querría que nadie se sintiera ofendido, el motivo de insertar el enlace, seria el de proporcionarle ejemplos y ayuda a los usuarios que me compraran el kit.

El Kit es este Kit DS1307 (http://stores.ebay.es/LA-TIENDA-DE-FRAN/Clock-RTC-/_i.html?_fsub=3597859018&_sid=1000357128&_trksid=p4634.c0.m322)

Si los señores moderadores, creen que incumplo alguna norma al postear esto ,en esta sección, por favor no duden en mover lo, o eliminarlo si lo creen conveniente, repito que no quiero molestar a nadie ni mi interés es el de incentivar el negocio, mas halla de presentar el kit que vendo, para que sepan donde quiero insertar el enlace.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: juankcba en 15 de Mayo de 2012, 06:15:07
Hola a todos los del foro... resulta que estoy en una pequeña disputa con mi ds1307 y no logro dar en que estoy haciendo mal... implemento dos funciones una para inicializar el ic anterior al while(1) y la otra para leer los datos del ic, utilizo un cristal de 20Mhz y el pic 18f67j10 sin embargo aca estoy varado.

Código: [Seleccionar]
void RTF(void)
{
unsigned char sec, min, hr, mon, year, date, day;


OpenI2C1(MASTER,SLEW_OFF);
SSPADD =0x31;
 
 IdleI2C1();   StartI2C1();  IdleI2C1();
 
 if (!DataRdyI2C1())
      WriteI2C1(0b11010000); //address of DS1307.
 IdleI2C1();
 if (!DataRdyI2C1())
     WriteI2C1(0x00); // Position the address pointer to 0.
 IdleI2C1();
 if (!DataRdyI2C1())
     WriteI2C1(0x00); // Clear seconds register and CH bit.
 IdleI2C1();
 
 StopI2C1();
//****************  Date and Time ********************//
 hr  = 0b01100111; // Set to 12 hour format.
 min = 0b00000011;
 sec = 0b00000000; // Oscillator enabled.
 day = 0b00000001; // Set 1 = Sunday.
 date= 0b00000001;   // Date set to 1st.
 mon = 0b00000001;   // Month set to January.
 year= 0b00000100;   // Year set to 2008.
//****************  Transmit Time and Date ********************//
 
 StartI2C1();
 IdleI2C1();
 
 if (!DataRdyI2C1())
    WriteI2C1(0b11010000); //address of DS1307.
 IdleI2C1();
 
 if (!DataRdyI2C1())
 WriteI2C1(0x00); // Position the address pointer to 0.
 IdleI2C1();
 
 if (!DataRdyI2C1())
    WriteI2C1(sec);
 IdleI2C1();
 
 if (!DataRdyI2C1())
     WriteI2C1(min);
 IdleI2C1();
 
 if (!DataRdyI2C2())
    WriteI2C1(hr);
 IdleI2C1();
 
 if (!DataRdyI2C1())
     WriteI2C1(day);
 IdleI2C1();
 if (!DataRdyI2C1())
    WriteI2C1(date);
 IdleI2C1();
 if (!DataRdyI2C1())
    WriteI2C1(mon);
 IdleI2C1();
 if (!DataRdyI2C1())
     WriteI2C1(year);
 IdleI2C1();
 if (!DataRdyI2C1())
   
 WriteI2C1(0x00);
 IdleI2C1();
 StopI2C1();
}


y la funcion para leer es

Código: [Seleccionar]
void RTC(void)
{
unsigned char seconds,minutes,hours,day,date,month,year,dow;

 StartI2C1();
 IdleI2C1();
 
 if (!DataRdyI2C1())
    WriteI2C1(0xd0); //address of DS1307.
 IdleI2C1();
 
 if (!DataRdyI2C1())
    WriteI2C1(0x00); // Position the address pointer to 0.
 IdleI2C1();
 StartI2C1();
 IdleI2C1();
 
 if (!DataRdyI2C1())
     WriteI2C1(0xd1); // Direction bit set to read.
 IdleI2C1();
//*********************** Reception *********************//
 if (DataRdyI2C1())
     seconds = ReadI2C1();  IdleI2C1();   AckI2C1();  IdleI2C1();
 if (DataRdyI2C1())
     minutes = ReadI2C1();  IdleI2C1();   AckI2C1();  IdleI2C1();
 if (DataRdyI2C1())
     hours = ReadI2C();  IdleI2C1();  AckI2C1();  IdleI2C1();
 if (DataRdyI2C1())
     day = ReadI2C1();  IdleI2C1();  AckI2C1();  IdleI2C1();
 if (DataRdyI2C1())
     date = ReadI2C1();  IdleI2C1();  AckI2C1();  IdleI2C1();
 if (DataRdyI2C1())
     month = ReadI2C1(); IdleI2C1();   AckI2C1();  IdleI2C1();
 if (DataRdyI2C1())
      year = ReadI2C1();  IdleI2C1();  NotAckI2C1();  IdleI2C1();
 StopI2C1();

deco(16,seconds);


}

la funcion deco lo unico que hace es desgoblar en 8 bits y mostrarlos en un glcd bit x bit... el problema es que cuando inicio el pic leeo 0000 0000 y al segundo leo 0000 0001... pero queda ahi y se que no esta tildado porque se ven actualizan otras cosas en el glcd cosa que sigue funcionando el codigo...

Cualquier ayuda sera bienvenida y perdon si revivo el post! es q despues de unas cuantas horas y de probar codigos ya no se que puede ser... este pic tiene 2 I2C los use a los dos tambien utilice las configuraciones  DDRDbits.RD6=1; DDRDbits.RD5=1; y  DDRCbits.RC4=1;  DDRCbits.RC3=1;

Saludos
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jeremylf en 15 de Mayo de 2012, 07:54:12
Tienes tus pullups puestas? 104 por todos lados? Revisa conexiones
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: juankcba en 15 de Mayo de 2012, 22:34:15
Si claro que las tengo puestas a vcc y también he probado diferentes resistencias pero nada
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jlaguna en 19 de Noviembre de 2013, 16:39:48
Buena tarde señores, tengo una inquietud e probado el programa, pero no veo el funcionamiento de byte dow para inicializar el DS1307:

void ds1307_set_date_time(byte day, byte mth, byte year, byte dow, byte hr, byte min, byte sec)

Entendí en un principio que byte year eran los dos primeros digitos del año(20) y dow los menos significativos (13), pero en realidad al escribirlos asi no lo toma me escribe es 203, por favor me pueden colaborar como se deben ingresar correctamente 2013, o es que el ds1307 solo usaría el 13 según lo que veo.

gracias.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: solapower en 20 de Noviembre de 2013, 07:11:40
Hola compañero.
El byte dow es el número del día de la semana (day of week en inglés) y el byte year son las unidades y las decenas del año.

Saludos
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jlaguna en 21 de Noviembre de 2013, 23:32:11
Gracias compañero, no hay forma de que registre el año completo cierto, según veo la memoria en la dirección donde se ubica el año solo va del 00-99
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: solapower en 25 de Noviembre de 2013, 16:12:12
Hola.
Debería funcionar.
void ds1307_set_date_time(byte day, byte mth, byte year, byte dow, byte hr, byte min, byte sec)
esta funcion debería quedarte así a dia de hoy :
void ds1307_set_date_time(25, 11, 13, 2, 20, 06, 15) t pongo como dow 2 por la notación anglosajona de los días de la semana,
nosotros empezamos las semanas trabajando y ellos las empiezan de fiesta.
En cuanto al 00-99 se refiere a las decenas y unidades de los años, supongo que como estos integrados se fabricaron en el ultimo
tramo del siglo todo lo que sea 10 ,20 le añade 2000, lo que pasará cuando lleguemos al 3000 creo que nos va a dejar a todos un poco indiferentes, no?


Saludos
Me corrijo los miles y las centenas de año no los dará nunca el integrado puesto que no tiene ninguna posición de memoria donde se almacenen, si quieres
que te salgan tendrás que implementarlo tu con alguna rutina que le sume 2000 y luego mostrarlo en el display.


PD pon el código por si hay algo que difiera.
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: arrluis en 16 de Febrero de 2014, 01:43:29
excelente trabajo , de hecho tengo que hacer algo similar pero solo manejo el codigo BASIC podrian pasarm el codigo en BASIC por favor ..... se los agradeceria muchiisimo
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: BINARIO en 07 de Noviembre de 2014, 21:23:15
Hola Red PIC!

Disculpa que te moleste, queria saber si esta libreria que modificaste funciona igual para todos los micros, tengo un 18F46K22 y el reloj no me funciona en el, de hecho cuando pido la hora el codigo completo se tilda, probe tambien con un 18F46K20 y tampoco corre,

hay alguna cosa que deba modificar en la libreria al cambiar de MCU ???

gracias y saludos!
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: RedPic en 08 de Noviembre de 2014, 08:24:27
Hola Red PIC!

Disculpa que te moleste, queria saber si esta libreria que modificaste funciona igual para todos los micros, tengo un 18F46K22 y el reloj no me funciona en el, de hecho cuando pido la hora el codigo completo se tilda, probe tambien con un 18F46K20 y tampoco corre,

hay alguna cosa que deba modificar en la libreria al cambiar de MCU ???

gracias y saludos!

Hola Binario ... Uffffff

Yo lo tengo en uso en el trabajo también con un 18F46K22 pero después de tantos años imagino que algunas cosas habré cambiado, no creo que ésta versión publicada en 2006 sea operativa 100% hoy día. No se si esta tenía ya un #define para habilitar/deshabilitar las interrupciones pero recuerdo que me dio algo de "ruido".

Otra cosa. He detectado que el 18F46K22 con CCS 5.x no va muy fino en cuanto a la configuración de los I2C y SPI según que canal uses de los dos de que dispone, recuerdo que en la protoboard tuve que ir probando a cambiar uno por otro hasta que dí con la configuración correcta y además lo que me funcionaba en el 18F46K22 DIP no iba en el TQFT :shock: :? ... no se si también eso te estará pasando a tí.

Lo que si te digo es que la base de la librería es la misma que escribí hace 8 años, en lo fundamental son exactamente la misma  :mrgreen:
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: BINARIO en 08 de Noviembre de 2014, 10:25:13
Hola Red PIC!

Disculpa que te moleste, queria saber si esta libreria que modificaste funciona igual para todos los micros, tengo un 18F46K22 y el reloj no me funciona en el, de hecho cuando pido la hora el codigo completo se tilda, probe tambien con un 18F46K20 y tampoco corre,

hay alguna cosa que deba modificar en la libreria al cambiar de MCU ???

gracias y saludos!

Hola Binario ... Uffffff

Yo lo tengo en uso en el trabajo también con un 18F46K22 pero después de tantos años imagino que algunas cosas habré cambiado, no creo que ésta versión publicada en 2006 sea operativa 100% hoy día. No se si esta tenía ya un #define para habilitar/deshabilitar las interrupciones pero recuerdo que me dio algo de "ruido".

Otra cosa. He detectado que el 18F46K22 con CCS 5.x no va muy fino en cuanto a la configuración de los I2C y SPI según que canal uses de los dos de que dispone, recuerdo que en la protoboard tuve que ir probando a cambiar uno por otro hasta que dí con la configuración correcta y además lo que me funcionaba en el 18F46K22 DIP no iba en el TQFT :shock: :? ... no se si también eso te estará pasando a tí.

Lo que si te digo es que la base de la librería es la misma que escribí hace 8 años, en lo fundamental son exactamente la misma  :mrgreen:

Ok redpic, hoy hago unas prueba y subo el feedback. Justo uso un 18f46k22 con ccs 5.25
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: jonathanPIC888 en 08 de Noviembre de 2014, 13:57:45
 Les paso una solución funcional del código. Estoy utilizando un PIC18F46K22 a 64Mhz con el DS1307.
La librería sufrió algunas modificaciones básicas, pero es la misma que encontrás en la página de RedPIC.

El encabezado.

Código: C
  1. // Librería para reloj de tiempo real DS1307.
  2. // Programador: Moyano Jonathan.
  3. // Basado en los trabajos de RedPIC: http://picmania.garcia-cuervo.net
  4. // Versión: v0.1 Revisión: 1.5
  5. // Fecha: 2014
  6.  
  7. // Definiciones varias.
  8. #define DS1307_ALL_DISABLED         0b00000000
  9. #define DS1307_OUT_ON_DISABLED_HIHG 0b10000000
  10. #define DS1307_OUT_ENABLED          0b00010000
  11. #define DS1307_OUT_1_HZ             0b00000000
  12. #define DS1307_OUT_4_KHZ            0b00000001
  13. #define DS1307_OUT_8_KHZ            0b00000010
  14. #define DS1307_OUT_32_KHZ           0b00000011
  15.  
  16. // Definición de funciones:
  17.  
  18. /// Inicializa el ds1307.
  19. /// Habilita el oscilador, sin modificar el registro de los segundos.               ///
  20. /// Podemos configurar los registros de control con los siguientes parámetros:      ///
  21. ///            DS1307_ALL_DISABLED Todo deshabilitado.                              ///
  22. ///            DS1307_OUT_ON_DISABLED_HIHG Salida en alto, desactivar salida.       ///
  23. ///            DS1307_OUT_ENABLED Salida habilitada.                                ///
  24. ///            DS1307_OUT_1_HZ Freq.   salida a 1 Hz                                ///
  25. ///            DS1307_OUT_4_KHZ Freq.  Salida a 4.096 Khz                           ///
  26. ///            DS1307_OUT_8_KHZ Freq.  Salida a 8.192 Khz                           ///
  27. ///            DS1307_OUT_32_KHZ Freq. Salida a 32.768 Khz                          ///
  28. ///                                                                                 ///
  29. ///            Ejemplo de inicialización:                                           ///
  30. ///                    ds1307_init(DS1307_ALL_DISABLED);                            ///
  31. ///                    ds1307_init(DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);           ///
  32.  
  33. void ds1307_init(int8 config);
  34.  
  35. // Escribe en los registros internos del DS1307. Configuramos la fecha.
  36. void ds1307_set_date(int8 day, int8 mth, int8 year, int8 dow);
  37.  
  38. // Escribe en los registros internos del  DS1307. Configuramos la hora.
  39. void ds1307_set_time(int8 hr, int8 min, int8 sec);
  40.  
  41. // Lee los registros internos del DS1307. Lee la fecha.
  42. void ds1307_get_date(int8 &day, int8 &mth, int8 &year, int8 &dow);
  43.  
  44. // Lee los registros internos del DS1307. Lee la hora.
  45. void ds1307_get_time(int8 &hr, int8 &min, int8 &sec);
  46.  
  47. // Convertimos un dato binario en BCD.
  48. unsigned int8 bin2bcd(unsigned int8 valor_binario);
  49.  
  50. // Convertimos un dato BCD en binario
  51. unsigned int8 bcd2bin(unsigned int8 valor_bcd);

La librería.

Código: C
  1. // Librería para reloj de tiempo real DS1307.
  2. // Programador: Moyano Jonathan.
  3. // Basado en los trabajos de RedPIC: http://picmania.garcia-cuervo.net
  4. // Versión: v0.1 Revisión: 1.5
  5. // Fecha: 2014
  6.  
  7. // Incluimos la librería con la definición de funciones:
  8. #include <DS1307.h>
  9.  
  10. // Desarrollo de las funciones de usuario:
  11.  
  12. void ds1307_init(int8 config){
  13.  
  14.   byte seconds = 0;
  15.  
  16. #ifndef USE_INTERRUPTS
  17.   disable_interrupts(global);
  18. #endif
  19.  
  20.   i2c_start();
  21.   i2c_write(0xD0);
  22.   i2c_write(0x00);
  23.   i2c_start();
  24.   i2c_write(0xD1);
  25.   seconds = bcd2bin(i2c_read(0));
  26.   i2c_stop();
  27.   seconds &= 0x7F;
  28.  
  29.   delay_us(3);
  30.  
  31.   i2c_start();
  32.   i2c_write(0xD0);
  33.   i2c_write(0x00);
  34.   i2c_write(bin2bcd(seconds));
  35.   i2c_start();
  36.   i2c_write(0xD0);
  37.   i2c_write(0x07);
  38.   i2c_write(config);
  39.   i2c_stop();
  40.  
  41. #ifndef USE_INTERRUPTS
  42.   enable_interrupts(global);
  43. #endif
  44.  
  45. }
  46.  
  47. void ds1307_set_date(int8 day, int8 mth, int8 year, int8 dow){
  48.  
  49. #ifndef USE_INTERRUPTS
  50.    disable_interrupts(global);
  51. #endif
  52.  
  53.   i2c_start();
  54.   i2c_write(0xD0);
  55.   i2c_write(0x03);
  56.   i2c_write(bin2bcd(dow));
  57.   i2c_write(bin2bcd(day));
  58.   i2c_write(bin2bcd(mth));
  59.   i2c_write(bin2bcd(year));
  60.   i2c_stop();
  61.  
  62. #ifndef USE_INTERRUPTS
  63.    enable_interrupts(global);
  64. #endif
  65.  
  66. }
  67.  
  68. void ds1307_set_time(int8 hr, int8 min, int8 sec){
  69.  
  70. #ifndef USE_INTERRUPTS
  71.    disable_interrupts(global);
  72. #endif
  73.  
  74.   sec &= 0x7F;
  75.   hr &= 0x3F;
  76.  
  77.   i2c_start();
  78.   i2c_write(0xD0);
  79.   i2c_write(0x00);
  80.   i2c_write(bin2bcd(sec));
  81.   i2c_write(bin2bcd(min));
  82.   i2c_write(bin2bcd(hr));
  83.   i2c_stop();
  84.  
  85. #ifndef USE_INTERRUPTS
  86.    enable_interrupts(global);
  87. #endif
  88.  
  89. }
  90.  
  91. void ds1307_get_date(int8 &day, int8 &mth, int8 &year, int8 &dow){
  92.  
  93. #ifndef USE_INTERRUPTS
  94.    disable_interrupts(global);
  95. #endif
  96.  
  97.   i2c_start();
  98.   i2c_write(0xD0);
  99.   i2c_write(0x03);
  100.   i2c_start();
  101.   i2c_write(0xD1);
  102.   dow  = bcd2bin(i2c_read() & 0x7f);
  103.   day  = bcd2bin(i2c_read() & 0x3f);
  104.   mth  = bcd2bin(i2c_read() & 0x1f);
  105.   year = bcd2bin(i2c_read(0));
  106.   i2c_stop();
  107.  
  108. #ifndef USE_INTERRUPTS
  109.    enable_interrupts(global);
  110. #endif
  111.  
  112. }
  113.  
  114. void ds1307_get_time(int8 &hr, int8 &min, int8 &sec){
  115.  
  116. #ifndef USE_INTERRUPTS
  117.    disable_interrupts(global);
  118. #endif
  119.  
  120.   i2c_start();
  121.   i2c_write(0xD0);
  122.   i2c_write(0x00);
  123.   i2c_start();
  124.   i2c_write(0xD1);
  125.   sec = bcd2bin(i2c_read() & 0x7f);
  126.   min = bcd2bin(i2c_read() & 0x7f);
  127.   hr  = bcd2bin(i2c_read(0) & 0x3f);
  128.   i2c_stop();
  129.  
  130. #ifndef USE_INTERRUPTS
  131.    enable_interrupts(global);
  132. #endif
  133.  
  134. }
  135.  
  136. unsigned int8 bin2bcd(unsigned int8 binary_value){
  137.  
  138.   unsigned int8 temp;
  139.   unsigned int8 retval;
  140.  
  141.   temp = binary_value;
  142.   retval = 0;
  143.   while(true){
  144.     if(temp >= 10){
  145.       temp -= 10;
  146.       retval += 0x10;
  147.     }else{
  148.       retval += temp;
  149.       break;
  150.     }
  151.   }
  152.   return(retval);
  153. }
  154.  
  155. unsigned int8 bcd2bin(unsigned int8 valor_bcd)
  156. {
  157.    unsigned int8 valor_bin;
  158.    
  159.    valor_bin = valor_bcd;
  160.    valor_bin >>= 1;
  161.    valor_bin &= 0x78;
  162.  
  163.    return(valor_bin + (valor_bin >> 2) + (valor_bcd & 0x0f));
  164. }

El encabezado del programa para el PIC:

Código: C
  1. // Plantilla de programación para el microcontrolador PIC18F46K22.
  2. // Programador: Moyano Jonathan.
  3. // Fecha: Agosto de 2013.
  4. // Versión: v0.1 Revisión: 1.0
  5.  
  6. // Incluimos el header con las definiciones del microcontrolador utilizado.
  7. #include <18F46K22.h>
  8. // Conversor de 10 bits con justificación a la derecha.
  9. #device ADC=10
  10. // Declaración para trabajar con punteros a constantes.
  11. #device PASS_STRINGS=IN_RAM
  12. // Configuramos velocidad de operación (64Mhz - 16 Mips).
  13. #use delay(clock=64000000)
  14.  
  15. // Configuramos los fusibles de programación.
  16.  
  17. #FUSES NOWDT                    // No utilizamos el perro guardían.
  18. #FUSES FCMEN                    // Monitor de reloj activado.
  19. #FUSES PUT                      // Temporizador de encendido.
  20. #FUSES NOBROWNOUT               // No activamos el reset por bajo voltaje.
  21. #FUSES NOPBADEN                 // Deshabilitamos el módulo conversor ADC del puerto B.
  22. #FUSES PRIMARY_ON               // Oscilador primario, habilitado.
  23. #FUSES HSH                      // Modo de oscilador: Alta potencia, alta velocidad: 16Mhz - 25Mhz.
  24. #FUSES PLLEN                    // PLL habilitado.
  25. #FUSES MCLR                     // Pin Master Clear habilitado.
  26. #FUSES STVREN                   // Si se rebalsa o llena el stack el microcontrolador se resetea.
  27. #FUSES NOLVP                    // No utilizamos bajo voltaje para programación.
  28. #FUSES NOXINST                  // Set de instruccciones ampliado, desactivado.
  29. #FUSES NODEBUG                  // No utilizamos código para debug.
  30. #FUSES NOPROTECT                // Código no protejido contra lecturas.
  31. #FUSES NOCPB                    // Sector de booteo no protejido.
  32. #FUSES NOCPD                    // Sin protección de código en la EEPROM.
  33. #FUSES NOWRT                    // Memoria de programa no protejida contra escrituras.
  34. #FUSES NOWRTC                   // Registros de configuración no protegido contra escritura.
  35. #FUSES NOWRTB                   // Bloque de booteo no protejido contra escritura.
  36. #FUSES NOWRTD                   // Memoria EEPROM no protejida contra escritura.
  37. #FUSES NOEBTR                   // Memoria no protejida contra lectuas de tablas de memoria.
  38. #FUSES NOEBTRB                  // Bloque de booteo no protejido contra lectura de tablas de memoria.
  39.  
  40. // Definimos los pines utilizados en las comunicaciones.
  41.  
  42. #define SIM900_RX PIN_C6
  43. #define SIM900_TX PIN_C7
  44. #define DEBUG_TX  PIN_B6
  45. #define DEBUG_RX  PIN_B7
  46. #define I2C_SDA   PIN_B5
  47. #define I2C_SCL   PIN_B4
  48.  
  49. #use rs232(baud=9600, xmit=SIM900_RX,rcv=SIM900_TX,errors,stream=SIM900)  // EUSART0 - SIM900.
  50.  
  51. #use rs232(baud=9600, xmit=DEBUG_RX,rcv=DEBUG_TX,errors,stream=DEBUG)     // EUSART1 - DEBUG.
  52.  
  53. #use i2c(Master, SDA=I2C_SDA, SCL=I2C_SCL)                                // Memoria EEPROM, RTC.
  54.  
  55. // Acceso a puertos de alta velocidad.
  56.  
  57. #use fast_io(A)
  58. #use fast_io(B)
  59. #use fast_io(C)
  60. #use fast_io(D)
  61. #use fast_io(E)
  62.  
  63. // Definimos los pines de E/S.
  64.  
  65. #define LED_GSM_OK     PIN_D0
  66. #define LED_GPRS_OK    PIN_C3
  67. #define LED_SD_OK      PIN_D3
  68. #define LED_GSM_ERROR  PIN_D1
  69. #define LED_SD_ERROR   PIN_D2
  70.  
  71. // Macros de E/S.
  72.  
  73. #define LED_GSM_OK_ON    output_high(LED_GSM_OK);
  74. #define LED_GPRS_OK_ON   output_high(LED_GPRS_OK);
  75. #define LED_SD_OK_ON     output_high(LED_SD_OK);
  76. #define LED_GSM_ERROR_ON output_high(LED_GSM_ERROR);
  77. #define LED_SD_ERROR_ON  output_high(LED_SD_ERROR);
  78.  
  79. #define LED_GSM_OK_OFF    output_low(LED_GSM_OK);
  80. #define LED_GPRS_OK_OFF   output_low(LED_GPRS_OK);
  81. #define LED_SD_OK_OFF     output_low(LED_SD_OK);
  82. #define LED_GSM_ERROR_OFF output_low(LED_GSM_ERROR);
  83. #define LED_SD_ERROR_OFF  output_low(LED_SD_ERROR);
  84.  
  85. // Prototipos de funciones auxiliares.
  86.  
  87. void aPortInit(void);

El código principal.

Código: C
  1. // Programa de prueba para visualizar el funcionamiento del DS1307.
  2. // Desarrollo basado en la placa de control TPHC.
  3. // Programador: Moyano Jonathan.
  4. // Versión: 0.1 Revisión: 0.01
  5. // Fecha: Abril de 2014.
  6.  
  7. // Incluimos los encabezados necesarios.
  8. #include "PlantillaPIC18F46K22.h"
  9. // Incluimos la librería del RTC.
  10. #include "DS1307.c"
  11.  
  12. // Variables globales.
  13.  
  14. int8 sec;
  15. int8 min;
  16. int8 hrs;
  17. int8 day;
  18. int8 month;
  19. int8 yr;
  20. int8 dow;
  21.  
  22. void aPortInit(void){
  23.  
  24. // Configura el puerto A.
  25. set_tris_a(0b00000000);
  26. // Configura el puerto B.
  27. set_tris_b(0b01000000);
  28. // Configura el puerto C.
  29. set_tris_c(0b10000000);
  30. // Configura el puerto D.
  31. set_tris_d(0b00000000);
  32. // Configura el puerto E.
  33. set_tris_e(0b00000000);
  34.  
  35. // Colocamos a nivel bajo todas las salidas.
  36. output_a(0x00);
  37. output_b(0x00);
  38. output_c(0x00);
  39. output_d(0x00);
  40. output_e(0x00);
  41.  
  42. }
  43.  
  44. void main(){
  45.  
  46. // Inicializa los puertos.
  47. aPortInit();
  48. // Inicializamos el DS1307.
  49. ds1307_init(DS1307_OUT_ON_DISABLED_HIHG | DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);
  50. // Configuramos la hora y fecha deseados.
  51. ds1307_set_date(20,4,14,20); // 20 de Abril de 2014.
  52. ds1307_set_time(18,23,00);   // 18:23:00 PM.
  53.  
  54.  while(true){
  55.  
  56.   // Leemos hora y fecha del DS1307.
  57.  fprintf(DEBUG,"FECHA:\r\n");
  58.  ds1307_get_date(day,month,yr,dow);
  59.  fprintf(DEBUG,"%02d/\%02d/\%02d\r\n",day,month,yr);
  60.  fprintf(DEBUG,"HORA:\r\n");
  61.  ds1307_get_time(hrs,min,sec);
  62.  fprintf(DEBUG,"\%02d:\%02d:\%02d\r\n", hrs,min,sec);
  63.  
  64.  delay_ms(1000);
  65.  
  66.  }
  67. }

A tener en cuenta: El cristal que usé para el PIC fué de 16Mhz, para lograr 64Mhz con el PLL.

Espero te funcione, Saludos !
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: Pacio en 06 de Mayo de 2015, 23:44:52
Hola foro que tal?

Perdón por revivir el post viejo, pero eh estado leyendo y no encuentro nada acerca de mi problema, necesitaria una mano, si es posible,claro está.

El problema es el siguiente, hace unos dias compre un modulo ds1307, y empecé a jugar junto con un pic 16f873a, y un modulo hc 06 el cual conecto al celular y lo configuro desde allí al modulo, todo funciona bien, o casi del todo bien, lo puedo configurar correctamente, cuenta bien los segundos y todos los datos del modulo, pero a la hora de cumplir su función principal, que es mantener la hora una vez desconectado el modulo, no sigue con la cuenta! al volver a alimentar todo y leer los registro los encuentro en 00(en realidad en la cantidad de segundos desde que lo volvi a conectar, es decir apenas lo alimento comienza a contar desde cero) ya le di mil vueltas al codigo y no encuentro solucion, ya me leí todo el datasheet, medi la tension de la bateria,es superior a 3v, medí la salida de SQ con un osciloscopio configurado par que parpadee a 1 hz y mientras está alimentado lo hace correctamente, al desconectar vcc(obviamente la pila sigue conectada) estos pulsos comienzas a disminuir su amplitud hasta que desaparece, voy a postear el código tal cual lo tengo, supongo que será algo muy basico que se me está pasando, pero no logro descubrirlo.
MUCHAS GRACIAS!
y perdón por revivir este post que ya lleva algunos meses inactivo..
Dejo el código:

Código: [Seleccionar]
#include <16f873a.h>
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOPROTECT
#use delay (clock=20000000)
#use rs232(baud=9800,XMIT=pin_C6,RCV=pin_C7)
#use STANDARD_IO(a)
#use STANDARD_IO(b)
#use FAST_IO(c)


#use I2C(MASTER,SDA=pin_C4,SCL=pin_C3)

/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//||||||||||||||||||||||||||||||||||||||||||||FUNCIONES PARA DS1307|||||||||||||||||||||||||||||||||||||||||||||
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////////////////////////

//**************************REGISTROS DEL DS1307  TODOS LOS DATOS ESTAN EN CODIGO BCD***************************

#define ds1307W 0b11010000  //direccion del modulo para escritura(write)
#define ds1307R 0b11010001  //direccion del modulo para lectura(read)


int8 ds1307[7];
int bytes=0;
int1 flag=1;

#int_RDA
void conf_hora(){               // RECIBO 8 BYTES DEL CELULAR

if(bytes<=6){
ds1307[bytes]=getc();
bytes++;
}
else if(bytes==7&&255==getc()){
     bytes=0;
     flag=1;                            // SI RECIBO 7 BYTES Y EL 8vo ES '0xff' pongo en 1 el flag
}
else{
bytes=0;
flag=0;
}
}

 
//*************************************************************************************************************\\
//******************************************FUNCIONES DEL DS1307***********************************************\\
//*************************************************************************************************************\\

unsigned int bcd_a_bin(unsigned int bcd){              // FUNCION DE CONVERSION DE BCD A BINARIO
unsigned int bcdL=0,bcdH=0;
bcdL=((bcd)&15);
bcdH=(((bcd)>>4)*10);
return bcdH+bcdL;
}

int bin_a_bcd(int8 bin){                    // FUNCION DE CONVERSION DE BINARIO A BCD
int bcdH=0,bcdL;
bcdH=bin/10;
bcdL=bin%10;
return bcdH<<4|bcdL;
}


void ds1307_init(){                          // CONFIGURACION INICIAL
 
i2c_start();
i2c_write(ds1307W);
i2c_write(0x00);
bit_clear(ds1307[0],7);   // PONGO EL BIT CH EN 0 PARA QUE EL OSCILADOR COMIENCE A FUNCIONAR
i2c_write(bin_a_bcd(ds1307[0])); //segundos=0   BIT 7 DEBE ESTAR EN 0 PARA QUE EL OSCILADOR FUNCIONE
i2c_write(bin_a_bcd(ds1307[1])); //minutos=30
bit_set(ds1307[2],5);                    /// PONGO EN 1 EL BIT 5 PARA CONFIGURARLO EN 24HORAS
i2c_write(bin_a_bcd(ds1307[2])); //horas=13hs
i2c_write(bin_a_bcd(ds1307[3]));  //dia de la semana=1
i2c_write(bin_a_bcd(ds1307[4]));  //dia del mes
i2c_write(bin_a_bcd(ds1307[5]));    //mes
i2c_write(bin_a_bcd(ds1307[6]));   //año=96
i2c_write(0b00010000);       //configuracion
i2c_stop();
}


void ds1307_fecha()                                 // LECTURA DE LA FECHA DEL MODULO
{
  i2c_start(); //Inicia I2C
  i2c_write(ds1307W); //Direcciona DS1307 write
  i2c_write(0x03); //Indica que ponga registro en dia de la semana
  i2c_start();
  i2c_write(ds1307R);
  ds1307[3]=bcd_a_bin(i2c_read());
  ds1307[4]=bcd_a_bin(i2c_read());
  ds1307[5]=bcd_a_bin(i2c_read());
  ds1307[6]=bcd_a_bin(i2c_read(0));
  i2c_stop();
  }
 
void ds1307_horas(){                                  //LECTURA DE LA HORA DEL MODULO

 i2c_start(); //Inicia I2C
  i2c_write(ds1307W); //Direcciona DS1307 write
  i2c_write(0x00); //Indica que ponga registro en ds_seconds
  i2c_start();
  i2c_write(ds1307R);
  ds1307[0]=bcd_a_bin(i2c_read());
  ds1307[1]=bcd_a_bin(i2c_read());
  ds1307[2]=bcd_a_bin(i2c_read(0));
  i2c_stop();
bit_clear(ds1307[2],5);                    /// PONGO EN 5 EL BIT 5 PARA EVITAR EL BIT DE CONF DE 24 HORAS
}
//*************************************************************************************************************\\
//***********************************FIN DE FUNCIONES DEL DS1307***********************************************\\
//*************************************************************************************************************\\

void puerto_salida(int port)
{
output_bit(pin_c0,bit_test(port,0));
output_b(port);
}


void main()
{

output_a(0x00);
output_b(0x00);
set_tris_c(0b10000000);

   //setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   //setup_timer_2(T2_DIV_BY_1,0,1);
   Setup_adc_ports(NO_ANALOGS);
   
  // enable_interrupts(INT_EXT);
   enable_interrupts(INT_RDA);
  // enable_interrupts(INT_TIMER1);
  // enable_interrupts(INT_TIMER2);
  // enable_interrupts(INT_EEPROM);
  enable_interrupts(GLOBAL);



while(TRUE)
{
 if(flag==1)
 {
 ds1307_init();
 output_toggle(pin_a1);
 delay_ms(100);
 flag=0;
 }
 else{

 
  ds1307_fecha();
  ds1307_horas();
 
  puerto_salida(ds1307[0]);
 
  //printf(lcd_putc,"\f%d-%d-20%d\n",ds1307[4],ds1307[5],ds1307[6]);
  //printf(lcd_putc,"%d : %d : %d",ds1307[2],ds1307[1],ds1307[0]); //23:59:5// 
  putc(ds1307[0]);
  putc(ds1307[1]);
  putc(ds1307[2]);
  putc(ds1307[3]);
  putc(ds1307[4]);
  putc(ds1307[5]);
  putc(ds1307[6]);
 
  output_toggle(pin_a0);
  delay_ms(1000);
 }
}
}
Título: Re: Real Time Clock o el DS1307 desatado
Publicado por: KILLERJC en 07 de Mayo de 2015, 03:14:50
Citar
, al desconectar vcc(obviamente la pila sigue conectada) estos pulsos comienzas a disminuir su amplitud hasta que desaparece
Eso es normal, la salida es open colector, y si utilizaste el diagrama tiene una resistencia de pull-up a VCC. Al cortar el suministro solo queda lo de los capacitores.

Suponiendo que le HW este bien. Si es por software miraria en que lugares es donde grabas

como en ds1307_init()

i2c_write(bin_a_bcd(ds1307[2])); //horas=13hs
i2c_write(bin_a_bcd(ds1307[3]));  //dia de la semana=1
i2c_write(bin_a_bcd(ds1307[4]));  //dia del mes
i2c_write(bin_a_bcd(ds1307[5]));    //mes
i2c_write(bin_a_bcd(ds1307[6]));   //año=96

Si no me euivoco ahi estarias escribiendo la hora y fecha
Eso se ejecuta en el main cuando flag esta a 1. La variable ds1307 todavia no tiene ningun valor asi que debo suponer 00.
El flag se pone a 1 cuando recibe 7 bytes por la UART y tambien
Ocurre que cuando definis la variable flag la pones a 1.
int1 flag=1;

trata de cambiarlo por:

int1 flag=0;

Y fijate si se te soluciona.

Título: Re:Real Time Clock o el DS1307 desatado
Publicado por: net_jean en 21 de Enero de 2016, 22:04:43
Ante todo muchas gracias a RedPic por el aporte de la librería que ah sido muy útil. La eh probado con un pic 18f4550 junto a un LCD 20x4 y eh podido visualizar la fecha y la hora sin problema (modificando el código de prueba que también publicaste).

Me surgió un problema que no estoy logrando solucionar desde hace ya varios días y sinceramente estoy estancado. El problema surgió cuando quise agregar todo lo aprendido del DS1307 junto con tu librería, a otro circuito. Básicamente estoy usando la interrupción de RB (pines B4-B7) para tomar el valor de unos pulsadores e ingresar a un especie de Menu donde tengo varias opciones de visualización (Temperatura, humedad, etc). El problema es que cuando agrego la inicializacion del ds1307 "ds1307_init(DS1307_OUT_ON_DISABLED_HIHG);" en mi código dentro de la función principal (main), los pulsadores dejan de funcionar. Es como si la interrupción INT_RB quedara "disable". Cuando elimino esta linea dentro del código, funcionan sin problemas los pulsadores. Estuve mirando el código de la librería buscando donde esta el problema, pero no eh podido repararlo:

void ds1307_init(int val){
 
   byte seconds = 0;
 
#ifndef USE_INTERRUPTS
   disable_interrupts(global);
#endif
 
   i2c_start();
   i2c_write(0xD0);
   i2c_write(0x00);
   i2c_start();
   i2c_write(0xD1);
   seconds = ds1307_bcd2bin(i2c_read(0));
   i2c_stop();
   seconds &= 0x7F;
 
   delay_us(3);
 
   i2c_start();
   i2c_write(0xD0);
   i2c_write(0x00);
   i2c_write(ds1307_bin2bcd(seconds));
   i2c_start();
   i2c_write(0xD0);
   i2c_write(0x07);
   i2c_write(val);
   i2c_stop();
 
#ifndef USE_INTERRUPTS
   enable_interrupts(global);
#endif
 
}

Espero me puedan dar una mano con este problema.

Saludos.
Título: Re:Real Time Clock o el DS1307 desatado
Publicado por: rghugo en 06 de Mayo de 2016, 12:47:11
una disculpa amigos, estoy haciendo un proyecto con el reloj, pero tengo algunas dudas

si lo inicio con fecha y hora fija, con cada corte de energia, el programa al pasar por inicio volvera a reprogramar los registros del DS1307?

si lo inicio variable con una direccion de registro, tengo que agregarle una eeprom aparte?

no terminio de entenderlo bien...  :?

si alguie puede ayudarme...

gracias
Título: Re:Real Time Clock o el DS1307 desatado
Publicado por: KILLERJC en 06 de Mayo de 2016, 14:51:32
si lo inicio con fecha y hora fija, con cada corte de energia, el programa al pasar por inicio volvera a reprogramar los registros del DS1307?

Normalmente eso lo haces cuando lo estas "probando" (o en simulaciones con proteus para darle una fecha/hora inicial), o recien estas programando el comienzo del programa y ni siquiera tenes una bateria conectado al DS,

Sino, no deberias nunca ponerle la fecha /hora al inicio, sino que deberia existir una rutina que permita cambiarle la fecha y hora, eso se guarda en el DS1307, esta rutina es a voluntad tuya ( ejemplo mantener un boton presionado 3 segundos), el DS mantiene la hora gracias a la bateria que tiene conectada en sus pines de bateria, cuando inicia de nuevo el PIC solo pregunta por los datos que posee el DS en ese momento no le asigna ningun valor.
Título: Re:Real Time Clock o el DS1307 desatado
Publicado por: rghugo en 12 de Mayo de 2016, 07:28:05
Muchas gracias por tu respuesta.

te puedo hacer una nueva consulta...

tengo muchas dudas sobre los días de la semana, hice una rutina que me indique los días, pero igual tengo serias dudas sobre que días es en BCD para el integrado.

en algunos lugares lei que el 00 es domingo, pero segun mis rutinas es 01 domingo.

por ello no estoy seguro...

usted puede ayudarme con esto?

Muchas gracias
Título: Re:Real Time Clock o el DS1307 desatado
Publicado por: KILLERJC en 12 de Mayo de 2016, 08:16:37
usted puede ayudarme con esto?

Por supuesto, esta todo en el datasheet:

http://datasheets.maximintegrated.com/en/ds/DS1307.pdf
pagina 8

Citar
The day-of-week register increments at midnight. Values that correspond to the day of week are user-defined but must be sequential (i.e., if 1 equals Sunday, then 2 equals
Monday, and so on.) Illogical time and date entries result in undefined operation

Primero nombrar que el dia de la semana no es lo mismo que el dia del mes.
El valor va de 1 a 7 (lo ves en la tabla abajo al lado de donde dice Day), no existe el valor 0, como ves el primer dia es "user-defined" o definido por el usuario. Algunos paises usan el primer dia de la semana el domingo, por lo cual para ellos el 1 va a ser domingo, otros acostumbran a tener un calendario que el primer dia de la semana es Lunes por lo tanto para ellos el 1 es lunes. Lo unico que tenes que tener en cuenta es que esten seguidos, 1 domingo, 2 lunes, 3 martes, etc ...,

El integrado lo unico que hace es simplmente incrementar ese registro en 1 cuando son las 00hs, nada mas.
Título: Re:Real Time Clock o el DS1307 desatado
Publicado por: rghugo en 12 de Mayo de 2016, 08:33:31
Excelente muchas gracias.

leí también por ahí que es conveniente colocar una resistencia de 5k6 entre el pin 3 batt y Gnd, para evitar que se descontrole cuando va a reemplazar la batería, ese dato en data shett no sale.-
Título: Re:Real Time Clock o el DS1307 desatado
Publicado por: KILLERJC en 12 de Mayo de 2016, 13:55:47
Citar
leí también por ahí que es conveniente colocar una resistencia de 5k6 entre el pin 3 batt y Gnd, para evitar que se descontrole cuando va a reemplazar la batería, ese dato en data shett no sale.-

Hacelo y tu pila va a durar mucho menos. por que lo unico que estas haciendo es que circule corriente por la resistencia. Una corriente mucho mas grande que lo que necesita el DS para funcionar. Por lo cual es energia perdida y termina agotando mas rapido la bateria.

Se va a descontrolar cuando le quites la pila si o si. Puede ser que tal ves sea una pequeña capacidad, igual hay que ver la velocidad de subida maxima que admite el DS en sus pines de bateria. Que en ese caso si admitiria una resistencia + capacitor, pero no conectada como lo explicas. De esa forma mientras cambias la bateria se termina alimentando del capacitor.

Hoy en dia dependiendo de la aplicacion muchos usan "supercapacitores", en ves de bateria, cuando necesitan que sobreviva sin alimentacion un buen tiempo pero no demasiado. Y se evitan tener que cambiar baterias.
Título: Re:Real Time Clock o el DS1307 desatado
Publicado por: rghugo en 12 de Mayo de 2016, 19:57:30
gracias por tu gran aporte...

hay un tema, si bien la hoha de datos dice day: 01-07... en mi ds1307, por algun motivo la convercion a bcd o el registro, es desde 00 a 06....

hice varias reloj termina la semana en 06 y vuelve a 00 como dia domingo...

alguien tiene una experiencia asi?

saludos
Título: Re:Real Time Clock o el DS1307 desatado
Publicado por: KILLERJC en 12 de Mayo de 2016, 20:22:47
Citar
por algun motivo la convercion a bcd o el registro

Tal ves es algo de la libreria que tengas. Y no del integrado. Es decir tal ves la libreria toma el valor de 1 a 7 y lo pasas de 0 a 6, tal ves para que sea mas "directo" para usarlo como indice de un array.
Título: Re:Real Time Clock o el DS1307 desatado
Publicado por: micronet3 en 24 de Octubre de 2017, 14:41:27
usted puede ayudarme con esto?

Por supuesto, esta todo en el datasheet:

http://datasheets.maximintegrated.com/en/ds/DS1307.pdf
pagina 8

Citar
The day-of-week register increments at midnight. Values that correspond to the day of week are user-defined but must be sequential (i.e., if 1 equals Sunday, then 2 equals
Monday, and so on.) Illogical time and date entries result in undefined operation

Primero nombrar que el dia de la semana no es lo mismo que el dia del mes.
El valor va de 1 a 7 (lo ves en la tabla abajo al lado de donde dice Day), no existe el valor 0, como ves el primer dia es "user-defined" o definido por el usuario. Algunos paises usan el primer dia de la semana el domingo, por lo cual para ellos el 1 va a ser domingo, otros acostumbran a tener un calendario que el primer dia de la semana es Lunes por lo tanto para ellos el 1 es lunes. Lo unico que tenes que tener en cuenta es que esten seguidos, 1 domingo, 2 lunes, 3 martes, etc ...,

El integrado lo unico que hace es simplmente incrementar ese registro en 1 cuando son las 00hs, nada mas.

killerjc, tengo un codigo que te permite modificar el dia de semana, funciona bien pero dow pasa de 7 a 0 y no a uno como deberia ser,a que se pude deber eso?