DS3231, funktioniert, merkwürdige Werte?

Gast #5066985
Hi,


nachdem mir hier bereits vor ein paar Tagen mit dem DS3231 geholfen 
wurde funktioniert zwar jetzt die Schaltung aber die ausgelesenen Werte 
sind falsch.


Dabei bin ich auf folgendes gestoßen, während der Arduino Sketch diese 
Zeile verwendet:
1
 *second = bcdToDec(Wire.read() & 0x7f);

wird dies in einem anderem freien Beispiel mit:
1
_tm.sec = bcd2dec(rtc[0]);

erledigt. Müssten nicht beide Funktionen mit & 0x7f arbeiten?
Soweit ich das beurteilen kann empfangen hier beide "Libraries" ein Byte 
und wandeln es von Bcd nach Dec um. Oder nicht?



Komplette Arduino Funktion die funktioniert:
1
void readDS3231time(byte *second,
2
byte *minute,
3
byte *hour,
4
byte *dayOfWeek,
5
byte *dayOfMonth,
6
byte *month,
7
byte *year)
8
{
9
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
10
  Wire.write(0); // set DS3231 register pointer to 00h
11
  Wire.endTransmission();
12
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
13
  // request seven bytes of data from DS3231 starting from register 00h
14
  *second = bcdToDec(Wire.read() & 0x7f);
15
  *minute = bcdToDec(Wire.read());
16
  *hour = bcdToDec(Wire.read() & 0x3f);
17
  *dayOfWeek = bcdToDec(Wire.read());
18
  *dayOfMonth = bcdToDec(Wire.read());
19
  *month = bcdToDec(Wire.read());
20
  *year = bcdToDec(Wire.read());
21
}



Freies Beispiel (nicht meiner):
1
https://github.com/akafugu/ds_rtc_lib/blob/master/library-gcc/rtc.c
2

3
_tm.sec = bcd2dec(rtc[0]);
4
  _tm.min = bcd2dec(rtc[1]);
5
  _tm.hour = bcd2dec(rtc[2]);
6
  _tm.mday = bcd2dec(rtc[4]);
7
  _tm.mon = bcd2dec(rtc[5] & 0x1F); // returns 1-12
8
  century = (rtc[5] & 0x80) >> 7;
9
  _tm.year = century == 1 ? 2000 + bcd2dec(rtc[6]) : 1900 + bcd2dec(rtc[6]); // year 0-99
10
  _tm.wday = bcd2dec(rtc[3]); // returns 1-7




Mein Code (etwas Lang um ihn hier direkt zu Posten):
https://bpaste.net/show/be4e0098ecc4


Alle 3 Sekunden wird die Zeit ausgelesen und die Anzahl der Jahre 
(letzter Versuch) per LED blinken ausgegeben.
Die Zeit wurde mit:
1
 // sec, min, hour...
2
    setTime(1,2,3,4,5,6,7);

gesetzt um etwas einfach darstellbares zu haben. der 7. Parameter ist 
die Jahresangabe....es sollte also bei jedem Durchlauf der While 
Schleife eine LED 7x blinken und dann eine andere LED 1x (Zur 
leichterern Unterscheidung das ein Loop endet)

Die momentane Ausgabe ist aber:
1,4,1,30+

Bei 30 habe ich aufgehört zu Zählen.

Jemand eine Idee wo hier die Zahlenumwandlung oder etwas anderes Schief 
läuft?
Gast #5067037
@ufuf: Richtig, mein Fehler. Empfangen wird mit
1
for (uint8_t i = 0; i < 7; i++) {
2
    rtc[i] = twi_receive();
3
  }

aber wie Adam schon sagte sind beide Varianten zulässig.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.