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

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

Desconectado solapower

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 209
Re: Real Time Clock o el DS1307 desatado
« Respuesta #195 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

Desconectado jlaguna

  • PIC10
  • *
  • Mensajes: 2
Re: Real Time Clock o el DS1307 desatado
« Respuesta #196 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

Desconectado solapower

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 209
Re: Real Time Clock o el DS1307 desatado
« Respuesta #197 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.
« Última modificación: 25 de Noviembre de 2013, 16:29:40 por solapower »

Desconectado arrluis

  • PIC10
  • *
  • Mensajes: 4
Re: Real Time Clock o el DS1307 desatado
« Respuesta #198 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

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Real Time Clock o el DS1307 desatado
« Respuesta #199 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!
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Real Time Clock o el DS1307 desatado
« Respuesta #200 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:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Real Time Clock o el DS1307 desatado
« Respuesta #201 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
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 326
Re: Real Time Clock o el DS1307 desatado
« Respuesta #202 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 !

Desconectado Pacio

  • PIC10
  • *
  • Mensajes: 8
Re: Real Time Clock o el DS1307 desatado
« Respuesta #203 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);
 }
}
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Real Time Clock o el DS1307 desatado
« Respuesta #204 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.


Desconectado net_jean

  • PIC10
  • *
  • Mensajes: 1
Re:Real Time Clock o el DS1307 desatado
« Respuesta #205 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.

Desconectado rghugo

  • PIC10
  • *
  • Mensajes: 48
Re:Real Time Clock o el DS1307 desatado
« Respuesta #206 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Real Time Clock o el DS1307 desatado
« Respuesta #207 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.

Desconectado rghugo

  • PIC10
  • *
  • Mensajes: 48
Re:Real Time Clock o el DS1307 desatado
« Respuesta #208 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Real Time Clock o el DS1307 desatado
« Respuesta #209 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.


 

anything