Leichtgewichtige Libary (in Bezug auf Ram) für DS3231 RTC gesucht

Hallo,

ich benutze jetzt die uRTCLib (a). Verglichen mit anderen Libaries verbraucht die relativ wenig Ram. Ich habe leider keine Vergleichstabelle, sondern über 2-3 Jahre mich dem immer mal näher angenähert durch probieren.

Nun habe ich ca. 52% Speicherbelegung (Ram). Nach Einfügen der uRTCLib nach folgenden Schema sind nur noch ca. 59% frei (Arduino Uno). Ich habe die genaue Zahl leider nicht im Kopf.

#include "Wire.h"
#include "uRTCLib.h"

//#include "..."


// uRTCLib rtc;
uRTCLib rtc(0x68);


// weiteres

void setup() {


	// pinsetup
	// rtc.set(23, 42, 23, 6, 24, 10, 19);

}


void loop(){

	//... code

	funktionmitrtc();

	//...code

}



uint8_t secd(){

	rtc.refresh();
	return rtc.second() ;

}


uint8_t minu(){

	rtc.refresh();
	return rtc.minute();

}



uint8_t hour(){

	rtc.refresh();
	return rtc.hour() ;

}


void funktionmitrtc(){

	// ...code

	uint8_t nextsecond = secd() +1 ;

	// ..code

}

Was habe ich für Möglichkeiten den Speicherbedarf zu verkleinern? Ich brauche z.B. kein Datum und Temperatur. Gibt es eine Libary die sich wirklich nur auf Zeit beschränkt? Oder muß ich nun mal versuchen die uRTCLib anzupassen? Das will ich vermeiden, da wenn ich in ferner Zunkunft mit einer aktualisierten Arduino und Libary version das Programm mal wieder anfasse, muß ich die Änderungen nachpflegen.
Alternativ probiere ich eine eigene Libary zu schreiben die ich mitschleife. Aber vielleicht hat einer von euch eine Idee...

(a) GitHub - Naguissa/uRTCLib: Really tiny library to basic RTC functionality on Arduino. DS1307, DS3231 and DS3232 RTCs are supported.

staivoup:
Was habe ich für Möglichkeiten den Speicherbedarf zu verkleinern? Ich brauche z.B. kein Datum und Temperatur.

Eigentlich brauchst Du zum Lesen der Zeit keine Bibliothek, ein paar Lesezugriffe genügen. Ich habe vom Tutorial – Using DS1307 and DS3231 Real-time Clock Modules with Arduino gelernt, wie das geht. Das Beispiel kannst Du entsprechend Deinen Bedürfnissen reduzieren. Die Funktion setDS3231time kannst Du beispielsweise komplett löschen.

Vielen Dank. So etwas habe ich gesucht.

bei diesem Beispiel wird das auslesen aus meiner Sicht nicht ganz richtig gemacht. Wenn du einen Blick in das Datasheet des DS3231 wirfst, wirst du feststellen, dass bei fast allen Zeitkompenten nicht die ganzen 8 bit verwendet werden sollen, sondern bei second, minute, hour, dayOfWeek, dayOfMonth und Month eine Bitmask anzuwenden wäre. Nicht nur bei second und hour.
Offenbar schreiben alle gegenseitig von einander (falsch) ab.

"Richtiger" ist der Beispielsketch von meiner HT16K33 Lib. Findest auf http://werner.rothschopf.net - Beispiel 23_clock_14segment.ds3231.ino

Oder sonst eben das Datasheet des DS3231.

Bei einigen Registern sind die führenden ungenutzten Bit konstant auf 0 gesetzt, da erübrigt sich eine Bitmaske.

Gruß Tommy

ja, z.B. bei Second. Genau da wird auch aber auch im ersten Beispiel eine Bitmask gesetzt.
Entweder man macht es durchgängig oder gar nicht. Aber mal so mal so finde ich schlecht.

Du kannst jeden Baustein ohne Bibliothek nach Deinen Wünschen / Bedürfnissen ansprechen. Dann kannst Du Dich aber nicht auf Funktionen einer vorgefertigten Bibliothek verlassen sondern du mußt die Funktion des Bausteins und das Ansteuern/Auslesen verstehen und dementsprechend benutzen.
Du kannst auch Auszüge aus der Bibliothek benutzen und diese nach Deinen Bedürfnissen verändern und im Sketch einbauen.

Grüße Uwe

noiasca:
... wirst du feststellen, dass bei fast allen Zeitkompenten nicht die ganzen 8 bit verwendet werden sollen, sondern bei second, minute, hour, dayOfWeek, dayOfMonth und Month eine Bitmask anzuwenden wäre. Nicht nur bei second und hour.

Ich kann Dir leider nicht folgen. Kritisch ist im 24-Stunden-Modus nur Bit 7 beim Monat (0x05) als Century, wobei das ein Überlauf ist, der wohl momentan in weiter Ferne ist. Sonst sind alle unbenutzten Bits auf 0.

Datenblatt

noiasca:
Entweder man macht es durchgängig oder gar nicht. Aber mal so mal so finde ich schlecht.

Das Beispiel bezieht ausdrücklich DS1307 mit ein. Es war als Anregung gedacht und ist wohl auch so angekommen. Also an den TO: Verschiedene Maskierungen, die bei DS3231 nicht benötigt werden, können weggelassen werden.

noiasca:
Entweder man macht es durchgängig oder gar nicht. Aber mal so mal so finde ich schlecht.

Man macht es so, wie es notwendig ist, finde ich.

Gruß Tommy

agmue: das erste Beispiel macht eine Bitmask bei seconds und hours (im Bild grün markiert)
Warum bei seconds aber nicht bei minutes erschließt sich mir nicht.
bit 7 ist ja immer 0 - gilt sinngleich bei minutes wie bei seconds.


Die Abwärtskompatibilität zum DS1307 lass ich nicht gelten, da die Register 00h und 01h bei beiden ICs gleich definiert sind. Der Unterschied wäre im 05h month zu suchen.

Abschließend, den DS3231 lese ich so aus:

void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  byte datalen = 7;
  Wire.requestFrom(DS3231_I2C_ADDRESS, datalen);             // request seven bytes of data from DS3231 starting from register 00h
  if (Wire.available()) {
    *second = bcdToDec(Wire.read() & 0b01111111);            // 0x00 seconds
    *minute = bcdToDec(Wire.read() & 0b01111111);            // 0x01 minutes
    *hour = bcdToDec(Wire.read() & 0b00111111);              // 0x02 hours
    *dayOfWeek = bcdToDec(Wire.read() & 0b00000111);         // 0x03 "day" in the datasheet
    *dayOfMonth = bcdToDec(Wire.read() & 0b00111111);        // 0x04 "date" in the datasheet
    *month = bcdToDec(Wire.read() & 0b00011111);             // 0x05 month
    *year = bcdToDec(Wire.read());                           // 0x06 year
  }
  else
  {
    Serial.println(F("\nE071 no data from DS3231"));
  }
}

smile drunter :slight_smile:

noiasca:
agmue: das erste Beispiel macht eine Bitmask bei seconds und hours (im Bild grün markiert)
Warum bei seconds aber nicht bei minutes erschließt sich mir nicht.

Beim DS1307 gibt es CH (clock halt) in Bit 7 von 0x00 und CH ist manchmal 1. Bei angehaltener Uhr gäbe es einen falschen Wert.

noiasca:
smile drunter :slight_smile:

:slight_smile: