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?