Problema al usar DS1337 - RTC

Estoy tratando de usar una versión editada de la biblioteca dada en este enlace . Básicamente, cambié parte del archivo incluido y parte de la función modificada de la biblioteca wire.h. Aunque no soy un programador empedernido, de alguna manera siempre puedo usar alguna biblioteca existente. Hice un código de muestra, solo para establecer el tiempo en DS1337 y leerlo. A continuación se muestra el código

#include <DS1337.h>
#include <Wire.h>
#include <avr/power.h>
#include <avr/sleep.h>
int i;
DS1337 RTC = DS1337();

void setup(){
Serial.begin(9600);
if(!RTC.time_is_set())
  {
    Serial.println("Clock did not set, wtf? Check that its oscillator is working.");
  }
RTC.start();
    RTC.setSeconds(00);
    RTC.setMinutes(00);
    RTC.setHours(05);
    RTC.setDays(06);
    RTC.setMonths(3);
    RTC.setYears(2014);
RTC.writeTime();
}

void loop(){
  int i;
  for(i=0;i<=5;i++){
  RTC.readTime(); // update RTC library's buffers from chip
  printTime(0);
  delay(5000);
  Serial.print("\n");
    }
  }

void printTime(byte type)
{
  // Print a formatted string of the current date and time.
  // If 'type' is non-zero, print as an alarm value (seconds thru DOW/month only)
  // This function assumes the desired time values are already present in the RTC library buffer (e.g. readTime() has been called recently)

  if(!type)
  {
    Serial.print(int(RTC.getMonths()));
    Serial.print("/");  
    Serial.print(int(RTC.getDays()));
    Serial.print("/");  
    Serial.print(RTC.getYears());
  }
  else
  {
    //if(RTC.getDays() == 0) // Day-Of-Week repeating alarm will have DayOfWeek *instead* of date, so print that.
    {
      Serial.print(int(RTC.getDayOfWeek()));
      Serial.print("th day of week, ");
    }
    //else
    {
      Serial.print(int(RTC.getDays()));
      Serial.print("th day of month, ");      
    }
  }

  Serial.print("  ");
  Serial.print(int(RTC.getHours()));
  Serial.print(":");
  Serial.print(int(RTC.getMinutes()));
  Serial.print(":");
  Serial.print(int(RTC.getSeconds()));  
}

Sin embargo, este código me da esta salida.

Salida de código

Y con esta salida es bastante claro que mi oscilador no funciona, aunque puedo configurar la fecha y la hora (pero ese tiempo no aumenta). Aquí está el esquema de cableado que utilicé.

Esquemático

No puedo entender lo que estoy haciendo mal. Actualmente no estoy usando las capacidades de alarma del DS1337, básicamente para lo cual se usa el DS1337.

Necesito ayuda con esto.

Nota: según el resultado de búsqueda de Google, mantuve el VCC para DS1337 en 3.3 V. Aunque también probé con 5V, pero no funcionó.

Edición 1: tenía algunos registros inicializados en el archivo DS1337.h que son los siguientes

#define DS1337_SP           0x0E
#define DS1337_SP_EOSC      B00000000
#define DS1337_SP_RS2       B00010000
#define DS1337_SP_RS1       B00001000
#define DS1337_SP_INTCN     B00000000
#define DS1337_SP_A2IE      B00000010
#define DS1337_SP_A1IE      B00000001

Ahora http://datasheets.maximintegrated.com/en/ds/DS1337-DS1337C.pdf página 10 dice algo diferente:

Bit 7: habilitar oscilador (EOSC). Este bit activo bajo, cuando se establece en 0 lógico, inicia el oscilador. Cuando este bit se establece en 1 lógico, el oscilador se detiene. Este bit está habilitado (0 lógico) cuando se aplica energía por primera vez.

Bits 4 y 3: Selección de tasa (RS2 y RS1). Estos bits controlan la frecuencia de la salida de onda cuadrada cuando se ha habilitado la onda cuadrada. La siguiente tabla muestra las frecuencias de onda cuadrada que se pueden seleccionar con los bits RS. Estos bits se establecen en 1 lógico (32 kHz) cuando se aplica energía por primera vez.

Bit 2: Control de Interrupciones (INTCN). Este bit controla la relación entre las dos alarmas y los pines de salida de interrupción. Cuando el bit INTCN se establece en 1 lógico, una coincidencia entre los registros de cronometraje y los registros de alarma 1 activa el pin INTA (siempre que la alarma esté habilitada) y una coincidencia entre los registros de cronometraje y los registros de alarma 2 activa el SQW/ Pin INTB (siempre que la alarma esté habilitada). Cuando el bit INTCN se establece en 0 lógico, se emite una onda cuadrada en el pin SQW/INTB. Este bit se establece en 0 lógico cuando se aplica energía por primera vez.

Bit 1: Habilitación de interrupción de alarma 2 (A2IE). Cuando se establece en 1 lógico, este bit permite que el bit de bandera de alarma 2 (A2F) en el registro de estado afirme INTA (cuando INTCN = 0) o afirme SQW/INTB (cuando INTCN = 1). Cuando el bit A2IE se establece en 0 lógico, el bit A2F no inicia una señal de interrupción. El bit A2IE está deshabilitado (0 lógico) cuando se aplica energía por primera vez.

Bit 0: Habilitación de interrupción de alarma 1 (A1IE). Cuando se establece en 1 lógico, este bit permite que el bit de bandera de alarma 1 (A1F) en el registro de estado haga valer INTA. Cuando el bit A1IE se establece en 0 lógico, el bit A1F no inicia la señal INTA. El bit A1IE está deshabilitado (0 lógico) cuando se aplica energía por primera vez.

Para 32.768 KHz, INTCN, RS2, RS1 deben ser 0,1,1. No estoy seguro sobre el enmascaramiento de bits aquí.

¿Alguien puede ayudarme en eso?

moler la caja de cristal!!!! Tuve el mismo problema, así que puse una abrazadera alrededor de la lata y la conecté a tierra.

Respuestas (1)

Tus conexiones parecen estar bien. Además, desde la hoja de datos RS1337 , puede alimentar el IC con 5V y 3.3V. Ambos se encuentran dentro de las condiciones de funcionamiento de CC recomendadas descritas para el IC.

Si tiene un osciloscopio a mano, coloque la sonda en X1 y luego en X2 (nunca sé cuál es la correcta, así que pruebo ambas, una a la vez) y verifique si el cristal está oscilando. Si obtiene una onda cuadrada limpia de 32,768 Hz, entonces está oscilando correctamente.

Además, debe verificar dos veces si ha seguido las restricciones de diseño de la placa con respecto a la conexión a tierra y las señales que se acercan a los pines de cristal, según la hoja de datos. Estoy copiando la parte relevante a continuación:

Restricciones para el diseño de la placa para DS1337

Si hay una señal cerca de los pines de cristal, los registros IC internos se corromperán. Entonces tendrás todo tipo de síntomas extraños. Esa puede ser la causa de tu problema.

Me descuidé en uno de mis diseños con el RTC DS1307 y tuve problemas similares. En mi caso, podría configurar la hora, pero el registro de minutos disminuiría unidad a unidad, aleatoriamente.

Si su placa no sigue las recomendaciones, una forma de repararla es poner a tierra la caja de cristal (así: ¿ Es obligatoria la conexión a tierra de la caja en el cristal típico de 32,768 kHz para el reloj en tiempo real? ). Eso hizo el truco para mí.

Editar: al mirar nuevamente la impresión de su monitor en serie, parece que su código no pudo configurar la hora del reloj . El tiempo que se está imprimiendo en serie es probablemente el tiempo que intentó establecer, pero falló. Para mí, eso significa que la comunicación I2C no funciona correctamente. Tal vez sea la dirección del dispositivo la que está mal, o un problema con el cableado. Veo que tiene ambas resistencias pull-up conectadas correctamente a SCL y SDA, así que eso es bueno. Pero volvería a comprobar todo ese cableado.

Para depurar correctamente la comunicación I2C, necesitará un osciloscopio (como hice en esta pregunta mía: ¿ Qué sucede si omito las resistencias pullup en las líneas I2C? ).

Edición 2: sigo pensando que no estás configurando la hora como te imaginas. Esto se debe a que el siguiente código establece los valores que definió en el objeto C++ llamado RTC(que se encuentra en la RAM de Arduino), pero no los establece en el RTC IC:

void setup() {
    RTC.start();
    RTC.setSeconds(00);
    RTC.setMinutes(00);
    RTC.setHours(05);
    RTC.setDays(06);
    RTC.setMonths(3);
    RTC.setYears(2014);
    RTC.writeTime();      // I think this line is failing

    // But the lines above succeed in setting the time into RAM (but not on the RTC)
}

Luego, imprimes la hora adentro loop(), pero usando los valores en RAM:

void printTime(byte type) {
    Serial.print(int(RTC.getMonths())); // these values come from RAM, not the RTC
    Serial.print(int(RTC.getDays()));
    Serial.print(RTC.getYears());
    Serial.print(int(RTC.getDays()));
    Serial.print(int(RTC.getHours()));
    Serial.print(int(RTC.getMinutes()));
    Serial.print(int(RTC.getSeconds()));  
}

Para confirmar eso, intente ejecutar el siguiente código:

...
void setup() {
    RTC.start();
} 
void loop() {
    RTC.readTime(); 
    printTime(0);
    delay(1000);
}

Si no se establece el tiempo, imprimirá un montón de ceros como 0/0/0 0:0:0. Si se establece la hora, se imprimirá3/6/2014 5:0:0

No estoy usando PCB en este momento, sino que estoy haciendo lo mismo en una placa Vero y en una placa de pruebas, por lo que las posibilidades de corrupción del registro RTC son mínimas. Además, no tengo un osciloscopio, pero intenté cambiar el oscilador y el resultado es el mismo.
Por favor revise mi respuesta actualizada (últimos 2 párrafos).
Además, ¿por qué tuviste que cambiar lib y Wire.h? ¿Qué cambios hiciste?
También le sugiero que pruebe con una biblioteca diferente ( esta es para DS1307 , así que no estoy seguro de que funcione).
También he visto un código que hizo la comunicación usando Wire lib directamente. Yo también lo intentaría (lo siento, no tengo el enlace).
Tengo que editar la biblioteca de cables como DS1337 lib que estoy usando tenía funciones de envío y recepción que se han cambiado para escribir y leer ahora. Así que no cambié el cable sino la lib DS1337 que estoy usando. También con respecto al código, creo que fue capaz de configurar el reloj, ya que cuando apago todo el circuito y lo enciendo, la fecha era la misma que Lo configuré con la ayuda del código y eso significa que pude escribir la fecha y la hora en los registros DS1337.
Abordé sus comentarios en mi segunda edición en mi respuesta. Échale un vistazo.
Una pregunta, cuando apago Arduino, ¿cómo se pueden almacenar algunos valores en la memoria RAM de Arduino? También tenía una duda con respecto a la inicialización de algunos registros en el archivo DS1337.h. Its with respect to #define DS1337_SP 0x0E #define DS1337_SP_EOSC B00000000 #define DS1337_SP_RS2 B00010000 #define DS1337_SP_RS1 B00001000 #define DS1337_SP_INTCN B00000000 #define DS1337_SP_A2IE B00000010 #define DS1337_SP_A1IE B00000001 if we refer page 10 of datasheets.maximintegrated.com/en/ds/DS1337- DS1337C.pdf , encontramos algunas diferencias. ¿Puede verificar eso?
También había editado mis preguntas con respecto a algunos registros. Creo que son algunos lo que estan creando problemas con respecto a los 32.768 Khz
La RAM se borra cuando apagas el Arduino. Con el DS1307, puede mantenerlo funcionando cuando el Arduino está apagado si conecta el RTC a una batería de tipo botón. DS1337 no parece tener esa función. Entonces su RTC perderá el tiempo cuando apague su Arduino. Todavía no sé por qué no comienza a funcionar después de encender tu Arduino. ¿ Puedes hacer una llamada a Serial.print(RTC.time_is_set());después de tu llamada a RTC.writeTime()?