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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Julius (Gast)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.