Tiny RTC verstellt sich! *Gelöst"

Hallo liebe Community,
was bin ich froh euch gefunden zu haben.
Ich besitze seit ein paar Tagen einen Arduino "Leonardo".
Dazu habe ich mir ein paar DS18S20 Sensoren, ein rtc1307 und ein SD Karten Modul gekauft.
Das mit den sensoren hat auch alles sehr gut geklappt. Sprich auslesen der Adressen über 1-Wire und auslesen auf den Seriellen Monitor.
Heute habe ich mich dann an das RTC Modul und an das SD-Karten Modul gemacht.
Und da kommen die Probleme.

Ich habe das RTC Modul an das Board angeschlossen und konnte auch promt die Uhr auslesen. Die war natürlich falsch.
Also habe ich dir Uhr per Zeitstempel gesetzt.
Allse Prima, aber nach 10 Messungen (Abstand von 30s.) wird die Uhrzeit komplett verworfen und ich lande in einem anderen Jahr zu einer anderen Uhrzeit.
Das Modul ist ein Tiny RTC I2c Modul.
Kennst ihr das Problem, braucht ihr noch mehr Infos?

Das nächste Problem ist, das ich das SD-Karten Modul nicht angeschlossen bekomme.
Es hat volgende ein und ausgänge:

  • GND
  • 5V
  • 3V3
  • CS
  • MOSI
  • SCK
  • MISO

Das Modul ist ein NoName würde ich sagen.
GND an Masse und dann 5V an 5V ist klar (Ich gehe davon aus das er nur eine Spannungsquelle braucht, daher habe ich 3V3 weg gelassen)
MOSI,SCK und MISO habe ich mit dem ICSP verbunden.
CS habe ich selbst definiert.

Zum Testen habe ich die Adafruit SD library genommen (GitHub - adafruit/SD: fixes & updates to the Arduino SD library - totally in progress. works but in beta).
Die Karte ist eine 1GB SD Karte die ich mit FAT16 formatiert habe.
Wenn ich dann aber aus der library das CardInfo Sketch nutze bekomme ich nur die Meldung ob ich eine Karte eingesetzt habe?
Ich versuche es nun schon seit stunden, aber es klappt einfach nicht. Hat evtl. noch jemand ein solches NoName SD-Board und kennt den Fehler?

Wäre echt klasse wenn mir jemand helfen könnte.
Falls noch mehr Daten gebraucht werden, so reiche ich diese so schnell wie möglich nach.

Gruß Denis

Hallo,
richtig angeschlossen hast du das RTC aber schon ?
Also bei mir verstellt sich das RTC nur nach langer Zeit wenn es
nicht an den Ardu angeschlossen ist.
Schau dir mal folgende Seite an...
RTC Anschliessen

Und ich stelle meine Uhr mit folgende Sketch :

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

// *********************************************
// 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()
{
 
  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(55, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  if (TimeIsSet != 0xaa55)
  {
    RTC.stopClock();
// Setzt das Datum  z.b. 15.6.2012        
    RTC.fillByYMD(2012,6,15);      // <-- hier das Datum eintragen
// Setzt die Uhrzeit  z.b. 20:35
    RTC.fillByHMS(21,47,0);        // <-- hier die Uhrzeit
    
    RTC.setTime();
    TimeIsSet = 0xaa55;
    RTC.setRAM(5, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.startClock();
  }
  else
  {
    RTC.getTime();
  }
}
void loop () {
}

Wie sieht denn dein Anschlussplan aus ?
Und der Sketch ?

GND an Masse und dann 5V an 5V ist klar (Ich gehe davon aus das er nur eine Spannungsquelle braucht, daher habe ich 3V3 weg gelassen)

3V3 musst Du auch verbinden. Ich gehe davon aus, dass die 5V nur für den Pegelwandler benutzt werden, die Stromversorung aber über 3V3 gehen.

Nicht alle SD-Karten eignen sich für den Anschluss an den Arduino. Ich habe zwar selbst noch kein Exemplar, das nicht funktioniert, aber von genug Fällen gelesen, die zwar Einwandfrei am PC funktionieren, aber beim einfachen SD-Karten-Slot des Arduino nicht wollen.

CS habe ich selbst definiert.

Hast Du die Bibliothek auch entsprechend angepasst?

Hallo lerion,

also zu deinem Tiny RTC Problem lässt sich ohne Quellcode schwer etwas sagen, obwohl ich von nem Programmierten Fehler ausgehen würde, da es ja nach genau 10 mal klappt und dann nicht mehr... Nach einem Blick über den Quellcode könnte ich da sicher mehr dazu sagen!

Zu dem SD-Karten Modul:
Wie du schon erkannt hast funktioniert die SPI Schnittstelle des Leonardo über den ICSP.
Nur zur Sicherheit (Selbst oft genug schon falsch verdrahtet) : http://www.instructables.com/id/Step-by-Step-Guide-to-the-Arduino-Leonardo/
Verkabel am besten den SPI nochmal von Grundauf neu um sicher zu seien das dort nicht der Fehler liegt!
CS liegt im Adafruit Tutorial auf Pin 10 am Arduino UNO, hast du das im Quellcode auch abgeändert? (Copy and Paste sinde Freund und Feind)

Hast du schon die von der Arduino Software mitgelieferte "Standard" Library für SD-karten samt Beispielen Probiert?

Hier im Forum gibt es nen Thread zum Leonardo und SD-Karten: Arduino Forum
dort Beschreibt jemand das nicht alle SD-Karten bei ihm funktionieren! Vlt mal eine andere Testen!

Hoffe ich konnte weiter helfen
Gruß Marc

So, da bin ich wieder.

Das RTC Modul ist genau dieses hier: Arduino Projekte
Nur zur Info, ich nutze die Arduino Version 1.0.3!

Ich habe es auch genau wie dort auf der Zeichnung ist angeschlossen. Nur das ich die rechte Anschlussleiste ohne "BAT" und "SQ" nutze.
Warum ist dort DS gestrichelt? Ich habe das so verstanden, dass man das Kabel nicht notwendiger weise braucht, richtig?
So, nun zur Bibliothek und dem Sketch.
Die Bibliothek habe ich von Arduino Playground - Time
Sollte also die richtige sein. Dort habe ich auch nichts verändert.

/* TimeRTC Sketch: Ausgabe auf serieller Konsole & LC-Display
 * Synchronisation mit Echtzeit-Uhr
 * angeregt durch Arduino Cookbook von Michael Margolis
 * http://www.buecher.de/shop/englische-buecher/arduino-cookbook/margolis-michael/products_products/detail/prod_id/28958618/(externer Link)
 *
 * fribbe fuer http://macherzin.net(externer Link)
*/

#include <LiquidCrystal.h>  // binde LCd-Bibliothek ein
#include <Time.h> // binde Bibliothek Time ein

// Bibliothen fuer Echtzeituhr:
#include <Wire.h> // binde Wire-Bibliothek ein
#include <DS1307RTC.h>  // binde Bibliothek fuer DS1307-RTC(Uhr) ein

// abhaengig von Beschaltung des LC-Displays, siehe http://macherzin.net/article38-Arduino-Ausgabe-LC-Display(externer Link)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialisieren Bibliothek und Interface-Pins

void setup()
{
  Serial.begin(9600); // initialisieren serielle Kommunikation
  setSyncProvider(RTC.get); // holen Zeit von RTC(Uhr)
  
  // Nur zur Kontrolle:
  if(timeStatus()!= timeSet) // wenn Status geaendert
  {
     Serial.println("Synchronisation fehlgeschlagen"); // bei Fehler
  }
  else // sonst ...
  {
     Serial.println("Synchronisation erfolgreich"); // alles ok
  }
  lcd.begin(16, 2); // Display hat 16 Zeichen x 2 Zeilen,
  // Kontrolle Ende
  
  Serial.println("macherzin.net: "); // nur so
  lcd.print("macherzin.net: "); // nur so
}

void loop()
{
   digitalUhrAnzeige(); // rufen Subroutine auf
   delay(1000); // warten, weil unser Auge nicht so schnell ...
}

void digitalUhrAnzeige() // definieren Subroutine
{
   // digitale Anzeige der Zeit
   lcd.setCursor(0, 1); // positionieren LCD-Cursor, 1. Zeile, 1. Spalte
   printZiffernGenulltOhnePunkt(hour()); // rufen Subroutine auf
   printZiffernGenulltmitPunkt(minute()); // rufen Subroutine auf
   printZiffernGenulltmitPunkt(second()); // rufen Subroutine auf
   Serial.print(" "); // fuegen Freizeichen ein
   lcd.print(" "); // fuegen Freizeichen ein
   printZiffernGenulltOhnePunkt(day()); // rufen Subroutine auf
   Serial.print(" "); // fuegen Freizeichen ein
   lcd.print(" "); // fuegen Freizeichen ein
   printZiffernGenulltOhnePunkt(month()); // rufen Subroutine auf
   Serial.print(" "); // fuegen Freizeichen ein
   Serial.println(year());; // Zeilenvorschub
   // deaktiviert, kein Platz mehr auf 16er-Display:
   // lcd.print(" ");  
   // printZiffernGenulltOhneSemikolon(year());
}

void printZiffernGenulltOhnePunkt(int zahl) // definieren Subroutine
{
  // verschoenern Anzeige, indem wir ...
  if(zahl < 10) // wenn kleiner als 10 ...
   {
     Serial.print(""); // fuehrende 0 einfuegen
     lcd.print("");  // fuehrende 0 einfuegen
   }
   Serial.print(zahl); // Ausgabe auf serieller Konsole
   lcd.print(zahl); // Ausgabe auf LCD     
}

void printZiffernGenulltmitPunkt(int zahl) // definieren Subroutine
{
  // verschoenern Anzeige, indem wir ...
  Serial.print(":"); // trennende ":" einfuegen
  lcd.print(":"); // trennende ":" einfuegen
  if(zahl < 10) // wenn kleiner als 10 ...
  {
     Serial.print('0'); // fuehrende 0 einfuegen
     lcd.print('0');
  }
  Serial.print(zahl); // Ausgabe auf serieller Konsole
  lcd.print(zahl);
}

Dieses Sketch habe ich benutzt um die Uhrzeit ein Mal einzustellen. Dazu habe ich mir von http://www.epochconverter.com/ den Zeitstempel geholt und dann über die Konsole "T(Zeitstempel)" eingegeben.
Man sieht auch sofort das er die neue Zeit übernimmt. Ich habe danach mal das delay auf 10 Sekunden verlängert und es eine weile laufen lassen.
Exact nach 5 Minuten springt er zu einer anderen Zeit und einem anderen Datum (und das alle 5 M.).

Ich habe nun auch mal das von Cetax verwendete Sketch nutzen wollen, doch dann erscheint eine Fehlermeldung.

RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08 (wird Orange markiert)

Und darunter steht RTC was not declared in this scope

Anfangs dachte ich, es liegt evtl. an der Batterie. Das kann ich aber ausschließen, da ich sie nachgemessen habe.
Für die Übersicht in diesem Thread werde ich einen neuen erstellen, der sich mit der SD-Karte befasst.

Hi,
ich benutze eine andere Bibliothek(#include <DS1307new.h>) als du(#include <DS1307RTC.h>),
deshalb funktioniert der Sketch bei dir nicht.

lerion:
...
Ich habe nun auch mal das von Cetax verwendete Sketch nutzen wollen, doch dann erscheint eine Fehlermeldung.

RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08 (wird Orange markiert)

Und darunter steht RTC was not declared in this scope

Die Bibliothek kann ich dir gern geben.

Ok, daran hatte ich nicht gedacht.
Ich habe extra nochmals das IDE geladen und vergessen die Bibliothek mit einzufügen.
Hätte ja sein können das ich irgendwo nen Fehler gemacht habe in der alten Bibliothek.

Wenn ich das richtig verstehe, brauche ich diese Einstellung nur ein mal vor nehmen, oder muss ich das Datum immer ändern und in meine Sketche den Code mit einfügen?

Hi,

lerion:
Ok, daran hatte ich nicht gedacht.
Ich habe extra nochmals das IDE geladen und vergessen die Bibliothek mit einzufügen.
Hätte ja sein können das ich irgendwo nen Fehler gemacht habe in der alten Bibliothek.

Wenn ich das richtig verstehe, brauche ich diese Einstellung nur ein mal vor nehmen, oder muss ich das Datum immer ändern und in meine Sketche den Code mit einfügen?

Ja, du brauchst das eigentlich nur einmal einstellen. Das sollte ein seperater Sketch bleiben, um die Uhr zu stellen.

Hier mein Sketch mit dem ich mir die Zeit und Wochentag anzeigen lasse.
RTC_Uhr_Auslesen_incl_WoTag

Und falls du einen Arduino Ethernet hast, kannst die RTC auch mit dem NTP Syncen.

RTC_sync_NTP

Also irgendwie klappt das auch nicht wirklich.
Ein Ethernet habe ich nicht.
Hab jetzt mal dein Sketch zum abrufen eingebunden, aber das einzige was er mir andauernd anzeigt ist: "165:165:85 165.165.2165 Montag - Clock was set!"
Kann es sein das es am Quarz liegt? Eventuell defekt?
Irgendein Grund muss es ja geben das er die Zeit nicht dauerhaft speichert.

Bist du sicher das du die RTC richtig angeschlossen hast ?

lerion:
Also irgendwie klappt das auch nicht wirklich.
Ein Ethernet habe ich nicht.
Hab jetzt mal dein Sketch zum abrufen eingebunden, aber das einzige was er mir andauernd anzeigt ist: "165:165:85 165.165.2165 Montag - Clock was set!"
Kann es sein das es am Quarz liegt? Eventuell defekt?
Irgendein Grund muss es ja geben das er die Zeit nicht dauerhaft speichert.

Wenn du 165:165:85 165.165.2165 Montag - Clock was set!
angezeigt bekommst, dann scheint es so als wenn der Arduino keine Verbindung zur RTC hat!
Wenn ich den Sketch drauf spiele ohne RTC, dann zeigt er mir das selbe an.
Also mir scheint es so, als wenn da was nicht richtig angeschlossen ist.

Bei mir ist die RTC so angeschlossen:

RTC | Arduino
GND --> GND
VCC --> 5V
SDA --> A4 (AnalogPin)
SCL --> A5 (AnalogPin)
DS --> D3 (DigitalPin)

So sieht es aus:
RTC

Ha, ich hab´s!
Ich war so auf das Anschlussbild des Moduls fixiert, das mit nicht aufgefallen ist, das der "Leonardo" spezielle "SCL und SDA" Anschlüsse besitzt.
Läuft nun seit 10 Minuten durch ohne Probleme.
Vielen Dank für die ganzen Antworten.
Dann mache ich mich mal daran damit Relais zu schalten.

Danke nochmals!

Super, das freut mich.
Ich habe aber wohl auch überlesen, das du einen "Leonardo" benutzt. :blush: