Probleme mit RTC DS3232

hi,

ich habe die realtimeclock ds3232,
leider bekomme ich die nicht ans laufen bzw die uhrzeit nicht gestellt.

ich habs über setserial mit der eingabe year,month,day,hour,minute,second, über den serialmonitor versucht. angezeigt wird aber leider 00:27:36 31.12.2095

ich habe das hier:

sqw und 32k hab ich nicht angeschlossen.

ich hoffe ihr könnt mir helfen !?

magictrips:
ich habe die realtimeclock ds3232,
leider bekomme ich die nicht ans laufen bzw die uhrzeit nicht gestellt.

Woran scheitert es denn?

magictrips:
ich habs über setserial mit der eingabe year,month,day,hour,minute,second, über den serialmonitor versucht. angezeigt wird aber leider 00:27:36 31.12.2095

Tatsächlich über den seriellen Monitor gesendet hast Du aber hoffentlich schon so etwas wie:

2015,4,21,8,35,0,

Oder?

Ich habe mal kurz in das Datenblatt der DS3231 geschaut: Der Chip scheint ja dasselbe Interface (I2C), dieselbe Busadresse (0x68) und rein in Bezug auf die Uhrzeit auch dieselben Registeradressen wie die DS1307 und die DS3231 zu verwenden. Dann sollten doch auch andere Libraries funktionieren, die einfach nur die einfachen Zeitfunktionen ansteuern.

Vor wenigen Tagen habe ich in diesem Beitrag einen Beispielsketch im Dateianhang gepostet, bei dem keine speziellen Libraries verwendet werden müssen und nur die reine Uhrenfunktion der Maxim Uhrenchips über RTC angesteuert werden. Ich sehe jetzt nicht, warum der Sketch nicht auch mit der DS3232 funktionieren sollte. Einfach den in der ZIP-Datei enthaltenen Ordner im Arduino-Sketchordner entpacken, keine zusätzliche Installation von Libraries notwendig. Kannst Du ja ggf. mal ausprobieren, wenn Du mit der setserial-Funktion der von Dir derzeit verwendeten Library überhaupt nicht klarkommst.

danke für die antwort !

woran genau, weiß ich nicht....
die uhrzeit läßt sich einfach nicht stellen bzw es verändert sich nichts.

kla, gesendet hab ich natürlich das korrekte datum (;

mit deinem sketch aus dem anderen beitrag läßt sich die uhr leider auch nicht stellen

ich hatte mal ein sketch für die ds1307 versucht, aber das selbe ergebnis....

ich bin was das angeht absoluter anfänger....
muss ich da noch was im sketch ändern ? zb busadresse oder so

magictrips:
ich bin was das angeht absoluter anfänger....
muss ich da noch was im sketch ändern ? zb busadresse oder so

Also als erstes testest Du dann am besten mal mit einem "I2C-Scanner" Sketch, ob Deine RTC überhaupt richtig angeschlossen ist und funktioniert.

Was siehst Du damit im Seriellen Monitor: Wird die RTC gefunden? Oder "No I2C devices found"?

also wenn ich den sketch von der seite verwende bekomme ich über den seriellen monitor folgende ausgabe:

Scanning...
I2C device found at address 0x57 !
I2C device found at address 0x68 !
done

magictrips:
also wenn ich den sketch von der seite verwende bekomme ich über den seriellen monitor folgende ausgabe:

Scanning...
I2C device found at address 0x57 !
I2C device found at address 0x68 !
done

OK, also die Uhr is richtig angeschlossen und sie funktioniert insoweit, dass sie auf I2C-Requests reagiert.

Gerade nochmal ins Datenblatt geschaut, die DS3232 scheint zwei zusätzliche Control- und Statusregister zu haben, die den richtigen Inhalt haben müssen, damit die Uhr läuft. Ich habe mal versucht, einen Diagnosesketch zu machen.

Teste mal die Ausgabe auf Serial mit diesem Code:

#include <Wire.h>  // include Wire library for I2C devices

#define RTC_I2C_ADDRESS 0x68 // // I2C adress of DS1307 and DS3231 RTC

void setup() {
  Serial.begin(9600);
  Wire.begin();
  delay(10); // small delay to stabilize I2C bus voltage
  Wire.beginTransmission(RTC_I2C_ADDRESS);
  Wire.write(0);
  if (Wire.endTransmission()==0) Serial.println("RTC OK");
  else Serial.println("RTC ERROR");
  Serial.println("Contents of Special-Purpose Registers:");

  Wire.beginTransmission(RTC_I2C_ADDRESS);
  Wire.write(0xE);
  Wire.endTransmission();
  Wire.requestFrom(RTC_I2C_ADDRESS, 2);
  byte Reg0xE=Wire.read();
  byte Reg0xF=Wire.read();
  
  Serial.print("Register 0xE: ");
  for (int i=7;i>=0;i--) Serial.print(bitRead(Reg0xE,i));
  Serial.println();
  Serial.print("Register 0xF: ");
  for (int i=7;i>=0;i--) Serial.print(bitRead(Reg0xF,i));
  Serial.println();
}

void loop() {
}

Eventuell kann man am Zustand der Register etwas sehen, dass vielleicht das "Oscillator Stop Flag" immer noch gesetzt ist, obwohl es Deine DS3232-Library eigentlich löschen sollte.

Hallo,

binär gefällt dir wohl nicht? :wink:

Serial.print("Register 0xE: "); Serial.println(Reg0xE,BIN);
Serial.print("Register 0xF: "); Serial.println(Reg0xF,BIN);

Sorry, mußte einfach sein ... :smiley:

Doc_Arduino:
binär gefällt dir wohl nicht? :wink:

Nein, das gefällt mir überhaupt nicht, wenn bei der binären Darstellung von 8 Bits eine unterschiedliche Stellenanzahl dargestellt wird, je nachdem, wieviele führende Nullen bei der Ausgabe unterdrückt werden.

8 Bits = 8 Stellen in der Anzeige, das gefällt mir!

Hallo,

okay, ist eine sehr gute Begründung.

vielen dank !, für die mühe !

ich hab zwar keine ahnung, was das bedeutet, aber das is bei rausgekommen:

RTC OK
Contents of Special-Purpose Registers:
Register 0xE: 00011100
Register 0xF: 00001000

Hallo,

wenn Du wissen möchtest was jurs gemacht hat, schau bitte in das Datenblatt
http://datasheets.maximintegrated.com/en/ds/DS3232.pdf
auf Seite 11, hier siehst Du das jurs die Register 0x0E und 0x0F ausgelesen hat und dessen Bedeutung der Bits.

Dein OSF Flag ist gelöscht. Kannst Du denn im Sekunden Takt eine Zeit auslesen mit laufender Sekunde?
Wenn das auch nicht klappt, stimmt die Spannungsversorgung?
Ist die RTC Batterie gepuffert oder hast Du den nackten IC?

magictrips:
ich hab zwar keine ahnung, was das bedeutet, aber das is bei rausgekommen:

RTC OK
Contents of Special-Purpose Registers:
Register 0xE: 00011100
Register 0xF: 00001000

Was die Registerinhalte bedeuten, steht im Datenblatt des DS3232 drin.

Soweit ich das sehe, sollte alles OK sein: Die Register befinden sich weitgehend in dem Zustand, den sie nach einem Power-On Reset haben sollten und der Oscillator sollte auch schwingen.

Vielleicht kannst Du diese Sketch mit etwas Inhalt in der loop()-Funktion laufen lassen:

#include <Wire.h>  // include Wire library for I2C devices

#define RTC_I2C_ADDRESS 0x68 // // I2C adress of DS1307 and DS3231 RTC

void setup() {
  Serial.begin(9600);
  Wire.begin();
  delay(10); // small delay to stabilize I2C bus voltage
  Wire.beginTransmission(RTC_I2C_ADDRESS);
  Wire.write(0);
  if (Wire.endTransmission()==0) Serial.println("RTC OK");
  else Serial.println("RTC ERROR");
  Serial.println("Contents of Special-Purpose Registers:");

  Wire.beginTransmission(RTC_I2C_ADDRESS);
  Wire.write(0xE);
  Wire.endTransmission();
  Wire.requestFrom(RTC_I2C_ADDRESS, 2);
  // A few of these need masks because certain bits are control bits
  byte Reg0xE=Wire.read();
  byte Reg0xF=Wire.read();
  
  Serial.print("Register 0xE: ");
  for (int i=7;i>=0;i--) Serial.print(bitRead(Reg0xE,i));
  Serial.println();
  Serial.print("Register 0xF: ");
  for (int i=7;i>=0;i--) Serial.print(bitRead(Reg0xF,i));
  Serial.println();
}

void loop() {
  Wire.beginTransmission(RTC_I2C_ADDRESS);
  Wire.write(0x0);
  Wire.endTransmission();
  Wire.requestFrom(RTC_I2C_ADDRESS, 1);
  byte second=Wire.read();
  for (int i=7;i>=0;i--) Serial.print(bitRead(second,i));
  Serial.println();
  delay(1000);
}

Dabei wird nur der Sekundenzähler ausgelesen und einmal pro Sekunde als BCD Binärwert aktualisiert.
Wenn die Sekunden laufen, sollten sich zwei aufeinanderfolgende Zeilen immer etwas unterscheiden.

Was gibt der Sketch bei Dir aus? Immer dasselbe? Oder in jeder Zeile was anderes?

vielen dank !

der sketch gibt folgendes aus:

RTC OK
Contents of Special-Purpose Registers:
Register 0xE: 00011100
Register 0xF: 00001000
00000011
00000100
00000101
00000110
00000111
00001000
00001001
00010000
00010001
00010010
00010011
00010100
00010101
00010110
00010111
00011000
00011001
usw

vielleicht hab ich mich auch falsch ausgedrückt ?

die uhr hat mit 1-2 sketch funktioniert, also die sekuden wurden hochgezählt usw
aber die uhrzeit, datum usw waren falsch...und ich konnte sie mit deinem und dem anderen sketch nicht stellen.....

Hallo,

dann vermute ich entweder immer noch einen Schreibfehler oder wenn Du die IDE nutzt zur Eingabe, dann steht unten rechts nicht "sowohl NL als auch CR" vor der Baudrate. Wenn das fehlt, fehlt dem Befehl der Abschluss oder so ähnlich.

magictrips:
der sketch gibt folgendes aus:

RTC OK
Contents of Special-Purpose Registers:
Register 0xE: 00011100
Register 0xF: 00001000
00000011
00000100
00000101
00000110
00000111
00001000

Also alles bestens.

magictrips:
vielleicht hab ich mich auch falsch ausgedrückt ?

die uhr hat mit 1-2 sketch funktioniert, also die sekuden wurden hochgezählt usw
aber die uhrzeit, datum usw waren falsch...und ich konnte sie mit deinem und dem anderen sketch nicht stellen.....

Wahrscheinlich. Dass die Zeit läuft und hochzählt, habe ich jetzt eben zum ersten mal gelesen.

Wenn Du "nur" die Uhr nicht stellen kannst, kommt hauptsächlich ein Bedienungsfehler in Frage.

Schau mal in Deinem Seriellen Monitor nach rechts unten und dort links neben der Baudrate, was steht da als zu sendendes Zeilenende:

  • Kein Zeilenende
  • Neue Zeile (NL)
  • Zeilenumbruch (CR)
  • Sowohl NL als auch CR

Stelle das mal auf "Sowohl NL als auch CR" und teste die Zeiteinstellung nochmal!

vielen, vielen dank !

funktioniert !

die baudrate und NL CR haben nicht gestimmt (;

sorry für das missverständnis !