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.

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 nicht
ja, 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