Real Time Clock Module (DS1307)

Ich habe SCL und SDA an A5 und A4 angeschlossen, da hat aber nix angezeigt, zumindest nix brauchbares. Dann habe ich an PIN 12 und 13 angeschlossen (auch im Sketch geändert), dann hat die Uhr angefangen zu ticken.
Arduino vom Netz genommen und wieder angesteckt, die Uhr lief nicht weiter sondern war resettet und lief wieder ab dann, wie im setup eingestellt war.

Woran kann es liegen dass die Uhrzeit nicht gespeichert wird?
Wozu muss da an Pin2 verbunden werden und warum keine durchgehende linie?
http://www.dfrobot.com/wiki/index.php?title=Real_Time_Clock_Module_(DS1307)_(SKU:DFR0151)

Verstehe ich das richtig, man kann das Module für 2 Arduinos verwenden, oder warum gibts da P1 und P2 (an 2 Seiten Anschlüsse)? Ich habe an P2 verbunden.

Diesen Sketch habe ich benutzt:

// DS1307_LCD (C)2010 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// A quick demo of how to use my DS1307-library to make a quick
// clock using a DS1307 and a 16x2 LCD.
//
// I assume you know how to connect the DS1307 and LCD.
// DS1302:  SDA pin   -> Arduino Digital 4
//          SCL pin   -> Arduino Digital 5
// LCD:     DB7       -> Arduino Digital 6
//          DB6       -> Arduino Digital 7
//          DB5       -> Arduino Digital 8
//          DB4       -> Arduino Digital 9
//          E         -> Arduino Digital 10
//          RS        -> Arduino Digital 11

#include <LiquidCrystal.h>
#include <DS1307.h>

// Init the DS1307
DS1307 rtc(4, 5);

// Init the LCD
LiquidCrystal lcd(11, 10, 9, 8, 7, 6);

void setup()
{
  // Set the clock to run-mode
  rtc.halt(false);
  
  // Setup LCD to 16x2 characters
  lcd.begin(16, 2);

  // The following lines can be commented out to use the values already stored in the DS1307
  rtc.setDOW(SUNDAY);        // Set Day-of-Week to SUNDAY
  rtc.setTime(12, 0, 0);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(3, 10, 2010);   // Set the date to October 3th, 2010

  // Set SQW/Out rate to 1Hz, and enable SQW
  rtc.setSQWRate(SQW_RATE_1);
  rtc.enableSQW(true);
}

void loop()
{
  // Display time centered on the upper line
  lcd.setCursor(4, 0);
  lcd.print(rtc.getTimeStr());
  
  // Display abbreviated Day-of-Week in the lower left corner
  lcd.setCursor(0, 1);
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));
  
  // Display date in the lower right corner
  lcd.setCursor(6, 1);
  lcd.print(rtc.getDateStr());

  // Wait one second before repeating :)
  delay (1000);
}

Woran kann es liegen dass die Uhrzeit nicht gespeichert wird?

Ich würde schätzen, dass Du gar keinen Zugriff auf den DS1307 hattest. Auf jeden Fall verwendest Du nicht die Bibliotheken, die auf der von Dir verlinkten Seite angeboten werden, denn bei denen kannst Du keine Pins angeben, die verwenden grundsätzlich die Hardware-Schnittstelle (A4/A5).

Wozu muss da an Pin2 verbunden werden und warum keine durchgehende linie?

Ich finde kein Schema für das Modul, aber ich würde vermuten, dass dort das Sekunden-Signal (ein Impuls jede Sekunde) verfügbar ist. Das könntest Du dann im Arduino verwenden, z.B. um ihn aus dem Schlaf zu wecken.

Verstehe ich das richtig, man kann das Module für 2 Arduinos verwenden, oder warum gibts da P1 und P2 (an 2 Seiten Anschlüsse)? Ich habe an P2 verbunden.

Nein, das verstehst Du wahrscheinlich falsch. Wenn das Foto stimmt, dann ist ausser dem DS1307 noch ein I2C-EEPROM mit auf dem Board. Entweder sind die beiden Anschlüsse einfach parallel ausgeführt (für welchen Zweck auch immer) oder einer ist für den DS1307, der ander für den EEPROM-Chip (was aber seltsam wäre). Es könnte sein, dass einfach der Bus wieder rausführt wird, damit weitere Geräte angeschlossen werden können.

Welchen Aurduino hast Du?
Hat die RTC eine Batterie? Ist diese voll?
Der Sketch im Link hat die Möglichkeit die Zeit zu setzen Du mußt dazu einige Zeilen auskommentieren und dann den gleichen Sketch mit kommentierten Zeilen hochladen, ansonsten wird die RTC jedesmal beim Start des Sketches auf die gleiche Zeit gesetzt.

Verstehe ich das richtig, man kann das Module für 2 Arduinos verwenden, oder warum gibts da P1 und P2 (an 2 Seiten Anschlüsse)? Ich habe an P2 verbunden.

Nein, das verstehst Du falsch. Das sind nicht 2 verschiedene Busse sondern der gleiche Bus an beiden Anschlüssen. Du kannst da nicht 2 Master (Arduino's) anhängen.

Die DS1207 kann am Pin SQW/OUT ein Rechtecksignal mit 32768, 8192, 4096 oder 1Hz ausgeben. Du kannst dies als Aufwecksignal aus dem Sleepmodus benutzen oder als Signal genau alle x Zeit etwas zu machen.

Wozu muss da an Pin2 verbunden werden und warum keine durchgehende linie?

Was meinst Du mit durchgehende Linie?

Grüße Uwe

Arduino UNO. Batterie ist voll.

Der Sketch im Link

Funktioniert das mit meinem Sketch nicht?

ansonsten wird die RTC jedesmal beim Start des Sketches auf die gleiche Zeit gesetzt

Ich lade ja nicht den Sketch neu hoch, sondern einfach den USB Stecker ziehen und wieder dran.

 Was meinst Du mit durchgehende Linie?

Von DS an PIN2 ist keine durchgehende Linie, soll ich das Kabel auch so zuschnipseln?

Ich versuch mal jetzt mit dem Sketch aus dem Link.

Der Sketch wird wahrscheinlich nicht funktionieren da laut Dateiendung für eine alte (vor IDE1.x) Version geschrieben wurde.

Welche Bibiothek und welchen Sketch verwendest Du denn? Bitte links.

Von DS an PIN2 ist keine durchgehende Linie, soll ich das Kabel auch so zuschnipseln?

Das ist eine facultative Funktion und darum, wenn Du die Funktion verwenden willst mußt Du sie auch verdraten, ansonsten nicht.

Ich lade ja nicht den Sketch neu hoch, sondern einfach den USB Stecker ziehen und wieder dran.

Der Sketch startet jedesmal, wenn Du den Arduino mit Spannung versorgst oder ihn resetierst.

Grüße Uwe

// #############################################################################
// #
// # Scriptname : DS1307_Test.pde
// # Author     : Peter Schmelzer, Oliver Kraus
// # Date       : 2011-04-08

// # Editor     : Lauren from DFRobot
// # Date       : 30.12.2011

// # Description:
// # Test file for the DS1307new library. Assumes that you have a DS1307 
// # connected to the I2C-Bus of your Arduino and that it has a battery backup.
// # Update the library and sketch to compatible with IDE V1.0 and earlier

// # Version    : 1.0
// #############################################################################
// *********************************************
// INCLUDE
// *********************************************
#include <Wire.h>                       // For some strange reasons, Wire.h must be included here
#include <DS1307new.h>

// *********************************************
// DEFINE
// *********************************************

// *********************************************
// VARIABLES
// *********************************************
uint16_t startAddr = 0x0000;            // Start address to store in the NV-RAM
uint16_t lastAddr;                      // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55;            // Helper that time must not set again

// *********************************************
// SETUP
// *********************************************
void setup()
{
 // pinMode(2, INPUT);                    // Test of the SQW pin, D2 = INPUT
 // digitalWrite(2, HIGH);                // Test of the SQW pin, D2 = Pullup on

  Serial.begin(9600);

/*
   PLEASE NOTICE: WE HAVE MADE AN ADDRESS SHIFT FOR THE NV-RAM!!!
                  NV-RAM ADDRESS 0x08 HAS TO ADDRESSED WITH ADDRESS 0x00=0
                  TO AVOID OVERWRITING THE CLOCK REGISTERS IN CASE OF
                  ERRORS IN YOUR CODE. SO THE LAST ADDRESS IS 0x38=56!
*/
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08 

/*
   Uncomment the next 2 lines if you want to SET the clock
   Comment them out if the clock is set.
   DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK
   AFTER SETTING THE CLOCK ONCE.
*/
//  TimeIsSet = 0xffff;
//  RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));  

/*
  Control the clock.
  Clock will only be set if NV-RAM Address does not contain 0xaa.
  DS1307 should have a battery backup.
*/
  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
/*
  if (TimeIsSet != 0xaa55)
  {
    RTC.stopClock();
        
    RTC.fillByYMD(2011,4,8);
    RTC.fillByHMS(22,7,0);
    
    RTC.setTime();
    TimeIsSet = 0xaa55;
    RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.startClock();
  }
*/
  

/*
   Control Register for SQW pin which can be used as an interrupt.
*/

/*
  RTC.ctrl = 0x00;                      // 0x00=disable SQW pin, 0x10=1Hz,
                                        // 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz
  RTC.setCTRL();

  Serial.println("DS1307 Testsketch");
  Serial.println("Format is \"hh:mm:ss dd-mm-yyyy DDD\"");

  uint8_t MESZ;

  MESZ = RTC.isMEZSummerTime();
  Serial.print("MEZ=0, MESZ=1 : ");
  Serial.println(MESZ, DEC);    
  Serial.println();
  
*/  
}

// *********************************************
// MAIN (LOOP)
// *********************************************
void loop()
{
  RTC.getTime();
  if (RTC.hour < 10)                    // correct hour if necessary
  {
    Serial.print("0");
    Serial.print(RTC.hour, DEC);
  } 
  else
  {
    Serial.print(RTC.hour, DEC);
  }
  Serial.print(":");
  if (RTC.minute < 10)                  // correct minute if necessary
  {
    Serial.print("0");
    Serial.print(RTC.minute, DEC);
  }
  else
  {
    Serial.print(RTC.minute, DEC);
  }
  Serial.print(":");
  if (RTC.second < 10)                  // correct second if necessary
  {
    Serial.print("0");
    Serial.print(RTC.second, DEC);
  }
  else
  {
    Serial.print(RTC.second, DEC);
  }
  Serial.print(" ");
  if (RTC.day < 10)                    // correct date if necessary
  {
    Serial.print("0");
    Serial.print(RTC.day, DEC);
  }
  else
  {
    Serial.print(RTC.day, DEC);
  }
  Serial.print("-");
  if (RTC.month < 10)                   // correct month if necessary
  {
    Serial.print("0");
    Serial.print(RTC.month, DEC);
  }
  else
  {
    Serial.print(RTC.month, DEC);
  }
  Serial.print("-");
  Serial.print(RTC.year, DEC);          // Year need not to be changed
  Serial.print(" ");
  switch (RTC.dow)                      // Friendly printout the weekday
  {
    case 1:
      Serial.print("MON");
      break;
    case 2:
      Serial.print("TUE");
      break;
    case 3:
      Serial.print("WED");
      break;
    case 4:
      Serial.print("THU");
      break;
    case 5:
      Serial.print("FRI");
      break;
    case 6:
      Serial.print("SAT");
      break;
    case 7:
      Serial.print("SUN");
      break;
  }
/*  
  Serial.print(" seconds since 1.1.2000:");
  Serial.print(RTC.time2000, DEC);
  uint8_t MESZ = RTC.isMEZSummerTime();
  Serial.print(" MEZ=0, MESZ=1 : ");
  Serial.print(MESZ, DEC);  
  
  Serial.print(" - Address in NV-RAM is: ");
  RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
  Serial.print(lastAddr, HEX);
  lastAddr = lastAddr + 1;              // we want to use it as addresscounter for example
  RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  
*/  
  if (TimeIsSet == 0xaa55)              // check if the clock was set or not
  {
    Serial.println(" - Clock was set!");
  }
  else
  {
    Serial.println(" - Clock was NOT set!");
  }    
  delay(1000);                          // wait a second
}

Kann man den code so lassen oder kann da noch was raus/verbessert werden?

Ob die Uhr gestellt ist und läuft oder nicht, kann man auch leichter rauskriegen ...

Über Sachen wie ...

DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK
AFTER SETTING THE CLOCK ONCE.

... sollte man sich Gedanden machen.

Es gibt Testsketche, die brauchen so was nicht ...

aber natürlich kann man fremden Code so lassen wie er ist. Sollte man sogar :wink:

hi,

Kann man den code so lassen oder kann da noch was raus/verbessert werden?

naja, wenn man platz sparen will, kann die library raus. hab' das beispiel irgendwann im playground gefunden.

#include "Wire.h"

#define DS1307_I2C_ADDRESS 0x68                          // I2C Adresse
  #define I2C_WRITE Wire.write 
  #define I2C_READ Wire.read

char buffer[20] = "";                                    // Speicherbereich für Datenkonvertierung 
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

/****************************************************************************************************
 * Zeit und Datum aus DS1307 auslesen und konvertieren
 */
void getDateDs1307(int date[])
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);         // I2C-Kommunikation im Schreibmodus starten
  Wire.write(byte(0x00));                                   // Registerzeiger auf 0 setzen
  Wire.endTransmission();                             // I2C-Kommunikation beenden 
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);            // I2C-Kommunikation im Lesemodus starten

  date[ 0 ] = bcdToDec(Wire.read() & 0x7f);        // Sekunden
  date[ 1 ] = bcdToDec(Wire.read());               // Minuten
  date[ 2 ] = bcdToDec(Wire.read() & 0x3f);        // Stunden
  date[ 3 ] = bcdToDec(Wire.read());               // Wochentag
  date[ 4 ] = bcdToDec(Wire.read());               // Tag
  date[ 5 ] = bcdToDec(Wire.read());               // Monat
  date[ 6 ] = bcdToDec(Wire.read());               // Jahr
}

void setDateDs1307()                
{ 
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   I2C_WRITE(byte(0x00));
   I2C_WRITE(decToBcd(second) & 0x7f);    // 0 to bit 7 starts the clock
   I2C_WRITE(decToBcd(minute));
   I2C_WRITE(decToBcd(hour));      // If you want 12 hour am/pm you need to set
                                   // bit 6 (also need to change readDateDs1307)
   I2C_WRITE(decToBcd(dayOfWeek));
   I2C_WRITE(decToBcd(dayOfMonth));
   I2C_WRITE(decToBcd(month));
   I2C_WRITE(decToBcd(year));
   Wire.endTransmission();
}
/****************************************************************************************************
 */
void setup() {
  Wire.begin();
}

void loop() {
}