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

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

Desconectado Cryn

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

Desconectado AKENAFAB

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

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Real Time Clock o el DS1307 desatado
« Respuesta #122 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.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado JOJOJORGE5

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

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Real Time Clock o el DS1307 desatado
« Respuesta #124 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.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Cryn

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

Desconectado JOJOJORGE5

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

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Real Time Clock o el DS1307 desatado
« Respuesta #127 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í, 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.
« Última modificación: 05 de Marzo de 2010, 20:08:55 por Geo »
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado JOJOJORGE5

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

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Real Time Clock o el DS1307 desatado
« Respuesta #129 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.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Real Time Clock o el DS1307 desatado
« Respuesta #130 en: 07 de Marzo de 2010, 05:28:11 »
Lo del CH Bit=0 viene en el Datasheet que tengo del DS1307 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.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Real Time Clock o el DS1307 desatado
« Respuesta #131 en: 07 de Marzo de 2010, 21:26:57 »
Lo del CH Bit=0 viene en el Datasheet que tengo del DS1307 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 :).
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado RedPic

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

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Real Time Clock o el DS1307 desatado
« Respuesta #133 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.
« Última modificación: 09 de Marzo de 2010, 01:05:36 por Geo »
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Miquel_S

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

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