RTC DS1302 funktioniert scheinbar nicht

Hi,
Ich habe zum lernen wie ich den RTC mit dem Arduino Mega ansteuer einen Code dazu im Internet gefunden. Zudem nutze ich noch ein 1602 Display. Mein Problem ist jetzt das wenn ich das Programm hochgeladen habe das die Uhr immer bei 0 anfängt und der Text RTC ERROR:SYNC ausgegeben wird. Was genau mache ich falsch?

Hier der Code

// A quick demo of how to use DS1302-library to make a quick
// clock using a DS1302 and a 16x2 LCD.
//
// I assume you know how to connect the DS1302 and LCD.
// DS1302:  CE pin    -> Arduino Digital 29
//          I/O pin   -> Arduino Digital 31
//          SCLK pin  -> Arduino Digital 33
//          VCC pin   -> Arduino Digital 37
//          GND pin   -> Arduino Digital 35
//
// LCD:     DB7       -> Arduino Digital 7
//          DB6       -> Arduino Digital 6
//          DB5       -> Arduino Digital 5
//          DB4       -> Arduino Digital 4
//          E         -> Arduino Digital 9
//          RS        -> Arduino Digital 8

#include <LiquidCrystal.h>
#include <DS1302RTC.h>
#include <Time.h>

// Init the DS1302
// Set pins:  CE, IO,CLK
DS1302RTC RTC(31, 29, 33);

// Optional connection for RTC module
#define DS1302_GND_PIN 35
#define DS1302_VCC_PIN 37

// Init the LCD
//   initialize the library with the numbers of the interface pins
//            lcd(RS,  E, d4, d5, d6, d7)
LiquidCrystal lcd(8,   9,  4,  5,  6,  7);

void setup()
{
  // Setup LCD to 16x2 characters
  lcd.begin(16, 2);

  // Activate RTC module
  digitalWrite(DS1302_GND_PIN, LOW);
  pinMode(DS1302_GND_PIN, OUTPUT);

  digitalWrite(DS1302_VCC_PIN, HIGH);
  pinMode(DS1302_VCC_PIN, OUTPUT);

  lcd.print("RTC activated");

  delay(500);

  // Check clock oscillation  
  lcd.clear();
  if (RTC.haltRTC())
    lcd.print("Clock stopped!");
  else
    lcd.print("Clock working.");

  // Check write-protection
  lcd.setCursor(0,1);
  if (RTC.writeEN())
    lcd.print("Write allowed.");
  else
    lcd.print("Write protected.");

  delay ( 2000 );

  // Setup Time library  
  lcd.clear();
  lcd.print("RTC Sync");
  setSyncProvider(RTC.get); // the function to get the time from the RTC
  if(timeStatus() == timeSet)
    lcd.print(" Ok!");
  else
    lcd.print(" FAIL!");

  delay ( 2000 );

  lcd.clear();
}

void loop()
{

  // Display time centered on the upper line
  lcd.setCursor(3, 0);
  print2digits(hour());
  lcd.print("  ");
  print2digits(minute());
  lcd.print("  ");
  print2digits(second());

  // Display abbreviated Day-of-Week in the lower left corner
  lcd.setCursor(0, 1);
  lcd.print(dayShortStr(weekday()));

  // Display date in the lower right corner
  lcd.setCursor(5, 1);
  lcd.print(" ");
  print2digits(day());
  lcd.print("/");
  print2digits(month());
  lcd.print("/");
  lcd.print(year());

  // Warning!
  if(timeStatus() != timeSet) {
    lcd.setCursor(0, 1);
    lcd.print(F("RTC ERROR: SYNC!"));
  }

  delay ( 1000 ); // Wait approx 1 sec
}

void print2digits(int number) {
  // Output leading zero
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
}

void setTime()
{
  rtc.writeProtect(false);
  rtc.halt(false);
  Time t(2016, 2, 19, 15, 30, 50, Time::kFriday;
  rtc.time(t);
  }

Danke schonmal im vorraus

Was genau mache ich falsch?

  • Die Funktion setTime wird nie aufgerufen
  • Du schreibst nicht, ob die Meldung "Clock stopped!" oder ob "Clock working" ausgegeben wird (eins von beiden sollte ca. 2 sec lang nach reset zu sehen sein)

Ok danke für die Info. Da ich noch ein anfänger bin weiß ich leider nicht wie ich das umsetzen kann. Könntest du mir dabei helfen?

  1. Du setzt dich vor den Arduino und das LCD Display, drückst den Reset Knopf und passt auf, was du siehst:

Wenn für ca eine halbe Sekunde "LCD activated" auf dem Display erscheint, ist das richtig angeschlossen.

Wenn nicht, musst du dich erstmal darum kümmern oder deine Untersuchung der DS1302 anders machen. (z.B. mit Serial Testausgaben.) Wenn ja, kommt danach für 2 Sekunden was anderes.

Du solltest - auch als Anfänger - erkennen, woher diese Ausgaben in deinem Sketch kommen, und soviel Englich verstehen um raten zu können, was diese Texte bedeuten.

  1. setTime aufrufen kannst du, indem du an passender Stelle in deinen Sketch     setTime();einfügst.

eventuell hier:

  ... 
  if (RTC.haltRTC()) {
    lcd.print("Uhr Starten");
    setTime();
  }
  else
  ...

Okay, das habe ich soweit auch verstanden. Mein Problem lag darin den Code so zuerweitern das es funktioniert.

Zur Info wie das Programm aktuell abläuft:

  1. RTC activated

  2. Clock working Write allowed

  3. RTC Sync Fail

  4. jetzt statret das Arduino von 0 an hoch zu zählen unter der Uhr steht dann RTC ERROR: SYNC!

Zudem bekomme ich folgenden Fehlercode:

Arduino: 1.6.7 (Windows 10), Board: "Arduino Nano, ATmega328"

C:\Users\Tim\AppData\Local\Temp\arduino_0373aec93c954ffd0300e1f1e28f3454\sketch_feb20a.ino: In function 'void setTime()':

sketch_feb20a:126: error: 'rtc' was not declared in this scope

   rtc.writeProtect(false);

   ^

sketch_feb20a:128: error: 'Time' was not declared in this scope

   Time.t(2016, 2, 19, 15, 30, 50, Time::kFriday);

   ^

sketch_feb20a:128: error: 'Time' is not a class, namespace, or enumeration

   Time.t(2016, 2, 19, 15, 30, 50, Time::kFriday);

                                   ^

sketch_feb20a:129: error: 't' was not declared in this scope

   rtc.time(t);

            ^

exit status 1
'rtc' was not declared in this scope

  Dieser Report hätte mehr Informationen mit
  "Ausführliche Ausgabe während der Kompilierung"
  aktiviert in Datei > Einstellungen.
DS1302RTC RTC(31, 29, 33);
...
rtc.halt(false);

Groß- und Kleinschreibung beachten!

Danke den Fehler habe ich gerade auch bemerkt. Sehr dumm von mir :astonished: :astonished:

Ich habe das jetzt so verbessert:

void setTime()
{
  RTC.writeProtect(false);
  RTC.halt(false);
  time.t(2016, 2, 19, 15, 30, 50, Time::kFriday);
  RTC.time(t);
  }

trotzdem bekomme ich immer noch die Meldung:

Arduino: 1.6.7 (Windows 10), Board: "Arduino Nano, ATmega328"

C:\Users\Tim\AppData\Local\Temp\arduino_55e9be357d7b59010bcfecffaaabf58e\sketch_feb20a.ino: In function 'void setTime()':

sketch_feb20a:126: error: 'class DS1302RTC' has no member named 'writeProtect'

   RTC.writeProtect(false);

       ^

sketch_feb20a:127: error: 'class DS1302RTC' has no member named 'halt'

   RTC.halt(false);

       ^

sketch_feb20a:128: error: 'time' was not declared in this scope

   time.t(2016, 2, 19, 15, 30, 50, Time::kFriday);

   ^

sketch_feb20a:128: error: 'Time' has not been declared

   time.t(2016, 2, 19, 15, 30, 50, Time::kFriday);

                                   ^

sketch_feb20a:129: error: 'class DS1302RTC' has no member named 'time'

   RTC.time(t);

       ^

sketch_feb20a:129: error: 't' was not declared in this scope

   RTC.time(t);

            ^

exit status 1
'class DS1302RTC' has no member named 'writeProtect'

  Dieser Report hätte mehr Informationen mit
  "Ausführliche Ausgabe während der Kompilierung"
  aktiviert in Datei > Einstellungen.

Wie muss ich time angeben? :o

Wenn ich das richtig verstehe soll das DS1302 bei einem Stromausfall die Uhrzeit speichern. Bei mir ist das leider nicht der fall. Aktuell könnte ich mir auch das teil sparen, da es auch ohne bei 0 schafft zu zählen.

Nur mal so als Gedankenspiel, hast du dir mal überlegt, eine andere Library zu verwenden? Z.B. funktioniert die RTC1302 auch mit der DS3231 Library zusammen.

Die ist nicht so merkwürdig kompliziert. Daann kommt noch das Problem mit der Genauigkeit der 1302.

Wie gesagt ich bin ein Anfänger im bereich Arduino und weiß nicht was es alles für möglichkeiten gibt die Uhrzeit über ein DS1302 zu steuern. Ich bin über jede Hilfestellung sehr dankbar. Wenn ihr jetzt sagt das was ich habe ist von grund an nix, bin ich für verbesserungen immer offen. :)

Ich will ja nicht alles schlecht reden, aber was die Genauigkeit der RTC betrifft, ist die DS3231 deutlich besser. Und die dazu gehörige Library ist besser dokumentiert mit Beispielen.

Aber was ich im letzten Post geschrieben habe, war leider verkehrt. Die Library für die DS3231 kannst du nicht mit der DS1302 einsetzen. Also bitte nicht testen.

Allerdings hatte hier kürzlich schon einer Probleme mit der DS1302 und ist glaube ich auch auf die DS3231 umgestiegen.

http://forum.arduino.cc/index.php?topic=376468.0

Beispiel, such dir einfach den schnellsten und preiswertesten Händler aus:

http://www.amazon.de/s/?ie=UTF8&keywords=ds3231+arduino&tag=googhydr08-21&index=aps&hvadid=89782487230&hvpos=1s1&hvexid=&hvnetw=g&hvrand=17693410193966299758&hvpone=&hvptwo=&hvqmt=b&hvdev=c&ref=pd_sl_1gtuphes2_b

Aber noch mal zur DS1302, hast du das hier schon probiert?

http://playground.arduino.cc/Main/DS1302RTC

Hi, ja das habe ich schon versucht. Das ist der Code von oben. Was hälst du von dem DS 1307?

DS1307 war mal der Standard, hängt aber - wie die DS1302 - von einem externen Quarz ab. Und da findet man viel Müll, der nicht einmal den Standard 20 ppm (2 sec am Tag) einhält.

Mein Vorschlag: Entweder du setzt deinen sportlichen Ehrgeiz darin, deine vorhandene DS1302 in den Griff zu kriegen, oder du besorgst dir zum gleichen Preis wie eine DS1307 die bessere DS3231 [ Link enfernt ]

Ds 1307 ist zu ungenau,geht mehrere Sekunden falsch pro Tag. nimm wie schon erwähnt die 3231 und brauchst keine Uhr mehr vor oder zurückstellen.
Wirklich sehr geanau

michael_x: Mein Vorschlag: Entweder du setzt deinen sportlichen Ehrgeiz darin, deine vorhandene DS1302 in den Griff zu kriegen, oder du besorgst dir zum gleichen Preis wie eine DS1307 die bessere DS3231

Ein deutlich besseres Angebot: 2Stk DS3231

Neben der doppelten Zahl an Uhren, sind Knopfzellenakkus statt Batterien inbegriffen. Mit dem Händler habe ich nur gute Erfahrungen gemacht.

Okay. ich habe mal den ds3231 bestellt

Egal welche von den DS3231 du auswählst, Preis und Lieferzeit solltest du beachten.
Aber dank der Temperaturkompensation ist diese RTC sehr genau, was die 1302 oder 1307 nicht bieten können.

Tim3007: Okay. ich habe mal den ds3231 bestellt

In der Wartezeit kannst Du schon mal etwas über I2C lesen. Mir hat das Tutorial – Using DS1307 and DS3231 Real-time Clock Modules with Arduino beim Verständnis geholfen und bislang habe ich auch den Code ohne Bibliothek verwendet. Für mich war das der leichter zu durchschauenede Weg.

agmue: Mir hat das Tutorial – Using DS1307 and DS3231 Real-time Clock Modules with Arduino beim Verständnis geholfen

Ja, sehr brauchbar!

Damit spreche ich meine DS3231 auch an. Im Gegensatz zu mit irgendwelchen Libs funktionierte es genau so, wie ich wollte. Gleichzeitig habe ich eine Menge über das Ansprechen von I2C gelernt.