DS3231 - Ausgabefehler bei Zeit und Datum
hallo !
ich habe ein problem mit meinem ds3231 modul, ich möchte mir mal die aktuelle zeit und das datum im serial monitor anzeigen lassen, aber es kommt nur müll raus :/
der output im monitor:
2165.25.165 165:165:165
hier stimmt irgendwas stark nicht. ich habe bereits die batterie getauscht, aber ohne erfolg.
der code (datum und uhrzeit sind falsch):
dieser ist eigentlich nur aus der zugehörigen biblo genommen.
ich habe ein problem mit meinem ds3231 modul, ich möchte mir mal die aktuelle zeit und das datum im serial monitor anzeigen lassen, aber es kommt nur müll raus :/
der output im monitor:
2165.25.165 165:165:165
hier stimmt irgendwas stark nicht. ich habe bereits die batterie getauscht, aber ohne erfolg.
der code (datum und uhrzeit sind falsch):
dieser ist eigentlich nur aus der zugehörigen biblo genommen.
code: [select]
#include <wire.h>
#include "ds3231.h"
#include "rtc_ds3231.h"
#define buff_max 128
uint8_t time[8];
char recv[buff_max];
unsigned int recv_size = 0;
unsigned long prev, interval = 5000;
void setup()
{
serial.begin(9600);
wire.begin();
ds3231_init(ds3231_intcn);
memset(recv, 0, buff_max);
serial.println("get time");
// serial.println("setting time");
// parse_cmd("t300608330032016",16);
// tssmmhhwddmmyyyy
}
void loop()
{
char in;
char buff[buff_max];
unsigned long = millis();
struct ts t;
// show time once in while
if ((now - prev > interval) && (serial.available() <= 0)) {
ds3231_get(&t);
// there compile time option in library include unixtime support
#ifdef config_unixtime
snprintf(buff, buff_max, "%d.%02d.%02d %02d:%02d:%02d %ld", t.year,
t.mon, t.mday, t.hour, t.min, t.sec, t.unixtime);
#else
snprintf(buff, buff_max, "%d.%02d.%02d %02d:%02d:%02d", t.year,
t.mon, t.mday, t.hour, t.min, t.sec);
#endif
serial.println(buff);
prev = now;
}
if (serial.available() > 0) {
in = serial.read();
if ((in == 10 || in == 13) && (recv_size > 0)) {
parse_cmd(recv, recv_size);
recv_size = 0;
recv[0] = 0;
} else if (in < 48 || in > 122) {; // ignore ~[0-9a-za-z]
} else if (recv_size > buff_max - 2) { // drop lines long
// drop
recv_size = 0;
recv[0] = 0;
} else if (recv_size < buff_max - 2) {
recv[recv_size] = in;
recv[recv_size + 1] = 0;
recv_size += 1;
}
}
}
void parse_cmd(char *cmd, int cmdsize)
{
uint8_t i;
uint8_t reg_val;
char buff[buff_max];
struct ts t;
//snprintf(buff, buff_max, "cmd '%s' %d\n", cmd, cmdsize);
//serial.print(buff);
// tssmmhhwddmmyyyy aka set time
if (cmd[0] == 84 && cmdsize == 16) {
//t355720619112011
t.sec = inp2toi(cmd, 1);
t.min = inp2toi(cmd, 3);
t.hour = inp2toi(cmd, 5);
t.wday = cmd[7] - 48;
t.mday = inp2toi(cmd, 8);
t.mon = inp2toi(cmd, 10);
t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
ds3231_set(t);
serial.println("ok");
} else if (cmd[0] == 49 && cmdsize == 1) { // "1" alarm 1
ds3231_get_a1(&buff[0], 59);
serial.println(buff);
} else if (cmd[0] == 50 && cmdsize == 1) { // "2" alarm 1
ds3231_get_a2(&buff[0], 59);
serial.println(buff);
} else if (cmd[0] == 51 && cmdsize == 1) { // "3" aging register
serial.print("aging reg ");
serial.println(ds3231_get_aging(), dec);
} else if (cmd[0] == 65 && cmdsize == 9) { // "a" set alarm 1
ds3231_set_creg(ds3231_intcn | ds3231_a1ie);
//assmmhhdd
(i = 0; < 4; i++) {
time[i] = (cmd[2 * + 1] - 48) * 10 + cmd[2 * + 2] - 48; // ss, mm, hh, dd
}
uint8_t flags[5] = { 0, 0, 0, 0, 0 };
ds3231_set_a1(time[0], time[1], time[2], time[3], flags);
ds3231_get_a1(&buff[0], 59);
serial.println(buff);
} else if (cmd[0] == 66 && cmdsize == 7) { // "b" set alarm 2
ds3231_set_creg(ds3231_intcn | ds3231_a2ie);
//bmmhhdd
(i = 0; < 4; i++) {
time[i] = (cmd[2 * + 1] - 48) * 10 + cmd[2 * + 2] - 48; // mm, hh, dd
}
uint8_t flags[5] = { 0, 0, 0, 0 };
ds3231_set_a2(time[0], time[1], time[2], flags);
ds3231_get_a2(&buff[0], 59);
serial.println(buff);
} else if (cmd[0] == 67 && cmdsize == 1) { // "c" - temperature register
serial.print("temperature reg ");
serial.println(ds3231_get_treg(), dec);
} else if (cmd[0] == 68 && cmdsize == 1) { // "d" - reset status register alarm flags
reg_val = ds3231_get_sreg();
reg_val &= b11111100;
ds3231_set_sreg(reg_val);
} else if (cmd[0] == 70 && cmdsize == 1) { // "f" - custom fct
reg_val = ds3231_get_addr(0x5);
serial.print("orig ");
serial.print(reg_val,dec);
serial.print("month ");
serial.println(bcdtodec(reg_val & 0x1f),dec);
} else if (cmd[0] == 71 && cmdsize == 1) { // "g" - set aging status register
ds3231_set_aging(0);
} else if (cmd[0] == 83 && cmdsize == 1) { // "s" - status register
serial.print("status reg ");
serial.println(ds3231_get_sreg(), dec);
} else {
serial.print("unknown command prefix ");
serial.println(cmd[0]);
serial.println(cmd[0], dec);
}
}
quote
hier stimmt irgendwas stark nichtja, die uhr antwortet überhaupt nicht.
165 = 15 * 10 + 15, d.h. alle bit gesetzt, d.h. gar nichts empfangen.
wenn du ohne uhrenbibliothek, nur mit wire.h arbeitest, könntest du das leicht sehen.
hast du die uhr jemals gestellt? falls ja, ist es vermutlich ein generelles i2c problem.
der i2c-scanner findet deinen uhrenmodul vermutlich auch nicht.
Arduino Forum > International > Deutsch (Moderator: uwefed) > DS3231 - Ausgabefehler bei Zeit und Datum
arduino
Comments
Post a Comment