Problema al usar DS1337 - RTC

4

Estoy intentando usar una versión editada de la biblioteca que se encuentra 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 hardcore, 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.

Yconestasalidaesbastanteclaroquemiosciladornofunciona,aunquepuedoconfigurarlafechaylahora(peroesetiemponoaumenta).Aquíestáelesquemadecableadoqueutilicé

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

Necesito ayuda con esto.

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

Edición 1: Tuve 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 enlace página 10 dice algo diferente:

  

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

     

Bits 4 y 3: Selección de frecuencia (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 la lógica 1 (32 kHz) cuando se aplica la alimentación por primera vez.

     

Bit 2: Control de interrupción (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 la lógica 1, una coincidencia entre los registros de hora y los registros de alarma 1 l activa el pin INTA (siempre que la alarma esté habilitada) y una coincidencia entre los registros de hora normal y los registros de alarma 2 activa el SQW / Pin INTB (siempre que la alarma esté habilitada). Cuando el bit INTCN se establece en lógica 0, se emite una onda cuadrada en el pin SQW / INTB. Este bit se establece en 0 lógico cuando se aplica la alimentación por primera vez.

     

Bit 1: Activación de interrupción de alarma 2 (A2IE). Cuando se establece en la lógica 1, este bit permite que el indicador 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 lógica 0, el bit A2F no inicia una señal de interrupción. El bit A2IE se desactiva (lógica 0) cuando se aplica la alimentación por primera vez.

     

Bit 0: Activación de interrupción de alarma 1 (A1IE). Cuando se establece en la lógica 1, este bit permite que el bit de indicador de alarma 1 (A1F) en el registro de estado afirme INTA. Cuando el bit A1IE se establece en lógica 0, el bit A1F no inicia la señal INTA. El bit A1IE se desactiva (lógica 0) cuando se aplica la alimentación por primera vez.

Para 32.768 KHz, INTCN, RS2, RS1 deben ser 0,1,1. No estoy seguro de enmascarar un poco aquí.

¿Alguien puede ayudarme en eso?

    
pregunta shailendra

1 respuesta

4

Tus conexiones parecen estar bien. Además, desde la hoja de datos RS1337 , puede alimentar el IC tanto con 5V como con 3.3V. Ambos están dentro de las condiciones de funcionamiento de CC recomendadas por 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 las pruebo ambas a la vez) y verifique si el cristal está oscilando. Si obtienes una onda cuadrada de 32,768Hz limpia, entonces está oscilando correctamente.

Además, debe verificar si ha seguido las restricciones de diseño de la placa con respecto al suelo y las señales que van cerca de las clavijas de cristal, según la hoja de datos. Estoy copiando la parte relevante a continuación:

Sihayunaseñalcercadelasclavijasdecristal,losregistrosICinternossedañarán.Entoncestendrástodotipodesíntomasextraños.Esapuedeserlacausadesuproblema.

MedescuidéenunodemisdiseñosconelDS1307RTCytuveproblemassimilares.Enmicaso,podríaestablecerlahora,peroelregistrodeminutosdisminuiríaunidadporunidad,alazar.

Sieltableronosiguelasrecomendaciones,unaformadesolucionarloesenlacarcasadecristaldetierra(porejemplo: ¿Es obligatoria la conexión a tierra en el típico cristal de 32.768kHz para Real Time Clock? ). Eso hizo el truco para mí.

Editar: Mirando de nuevo la impresión del monitor de serie, parece que su código no pudo configurar la hora del reloj . La hora en que se imprime en serie es probablemente la hora que intentó configurar, pero falló. Para mí, eso significa que la comunicación I2C no funciona correctamente. Tal vez sea la dirección del dispositivo la incorrecta, o un problema con el cableado. Veo que tienes ambas resistencias pull-up correctamente conectadas a SCL y SDA, así que eso es bueno. Pero me gustaría revisar 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 el tiempo como te imaginas. Esto se debe a que el siguiente código establece los valores que definió en el objeto C ++ denominado RTC (que se encuentra en la RAM de Arduino), pero no los establece en el IC de RTC:

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, imprime el tiempo dentro de loop() , pero usando los valores en la 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 el tiempo, se imprimirá 3/6/2014 5:0:0

    
respondido por el Ricardo

Lea otras preguntas en las etiquetas