Forum: Mikrocontroller und Digitale Elektronik DS3231, funktioniert, merkwürdige Werte?


von Julius (Gast)


Lesenswert?

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?

von Einer K. (Gast)


Lesenswert?

Julius schrieb:
> Soweit ich das beurteilen kann empfangen hier beide "Libraries" ein Byte

Das eine Byte sieht so aus, als würde es aus einem Array kommen. Von 
"empfangen" sehe ich da nichts.

von Adam P. (adamap)


Lesenswert?

Julius schrieb:
> Müssten nicht beide Funktionen mit & 0x7f arbeiten?

Kann man machen, muss man nicht -> ein Blick ins Datenblatt hilft:
das MSB des Sekunden Registers ist immer 0, somit kann man da eine Maske 
(0x7F) drüber legen oder auch nicht.

von Julius (Gast)


Lesenswert?

@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.

von Bastian W. (jackfrost)


Lesenswert?

Bist du dir sicher das das senden des Arrays ohne Fehler geht ? Hast du 
einen LA um die Daten zu prüfen ? Gib dir mal die Empfangenen Rohdaten 
als ASCII am Seriellenmonitor aus

Gruß JackFrost

von Forist (Gast)


Lesenswert?

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

Du kannst hier im Forum Dateien als Anhang hochladen.

Bei Fehlerbeschreibungen sollte das Problem sowieso auf ein lauffähiges 
Minimalbeispiel herunter gebrochen sein, bei dem der Fehler auftritt. 
Das komplette Programm interessiert da nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.