Странное поведение DS3231

arduino not my
arduino not my аватар
Offline
Зарегистрирован: 28.10.2020

Здравствуйте, товарищи знатоки.Проблема с DS3231.Сделал я свои часы на печатной плате, и DS3231 тоже.Схема как на маленьких модулях DS3231 с желтым небольшым АКБ.Часы завелись на плате, но они сбиваются при отключении питания.То есть ,допустим, сейчас 12:39 , выключаешь их , когда включаешь, время 12:39 и тикает далее.Скетч из примера библиотеки RTClib.Сразу говорю, все припаяно хорошо и аккумулятор также, и он заряжен на 3,1 вольта,все отмыто и прозвонено - обрывов нет.На форуме лазил 2 дня, есть люди с похожим дефектом, но у них решалось все пропайкой батарейного разъема или заменой библиотеки.Вот скетч

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif

  Serial.begin(9600);

  delay(3000); // wait for console opening

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop () {
    DateTime now = rtc.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
    
    // calculate a date which is 7 days and 30 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));
    
    Serial.print(" now + 7d + 30s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    
    Serial.println();
    delay(3000);
}

Вот схема:

arduino not my
arduino not my аватар
Offline
Зарегистрирован: 28.10.2020

Да, и на батарейка к микросхеме подключена правильно - на ноге VBAT +3,1 вольта.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Даташит на микросхему читал ?
Там есть специальный регистр, в котором есть специальный бит, который отвечает только за это.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Попробуйте закомментировать 24,25,27 строку.

arduino not my
arduino not my аватар
Offline
Зарегистрирован: 28.10.2020

Пробовал, все тоже самое,только время ставится как на ПК во время компиляции.Да, про тот бит я знаю, но почему эта же микросхема работает с другой ардуино абсолютно нормально(на моей плате распаяна атмега 328 и кварц на 16МГц, ну и эта микросхема).Если эту микросхему выпаять, припаять на модуль, как она и была ранее, то все замечательно работает с другой ардуино.

Feofan
Offline
Зарегистрирован: 28.05.2017
Цитата:
Если эту микросхему выпаять, припаять на модуль, как она и была ранее, то все замечательно работает с другой ардуино.
Скетч-то в обоих случаях используется один и тот же?
Если микросхему не выпаивать из модуля, в котором ей хорошо, а подсоединить сам модуль?
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вам дали правильный ответ

Kakmyc пишет:
Даташит на микросхему читал ? Там есть специальный регистр, в котором есть специальный бит, который отвечает только за это.

Всё что Вы описали (включая и то, что при перепаивании начинает работать), всё укладывается в это.

Добавьте в скетч, чтобы при загрузке программы делала следующее:

1. сбрасывала в 0 бит EOSC в регистре 0x0E
2. сбрасывала в 0 бит OSF в регистре 0x0F

и эффект должен уйти.

arduino not my
arduino not my аватар
Offline
Зарегистрирован: 28.10.2020

Я пробовал поключить вместо микросхемы целый модуль - эффекта ноль.И да, ткните меня,пожалйста, носом как работать с битами и регистрами, а то я лишь начинающий, и не сильно в этом силен.

arduino not my
arduino not my аватар
Offline
Зарегистрирован: 28.10.2020

Библиотека microDS3231 (вроде бы Гайверовская) заработала ,вроде бы, нормально.

arduino not my
arduino not my аватар
Offline
Зарегистрирован: 28.10.2020

Я тут выявил закономерность - если убрать эти строки , о которых тут говорится

Fenicksnet пишет:

Попробуйте закомментировать 24,25,27 строку.

то о чудо, модуль номально считает время, но его нужно установить вручную.Видимо это из за того, что я прошиваю свое устройство через программатор , а не UART.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

arduino not my пишет:

Я тут выявил закономерность - если убрать эти строки , о которых тут говорится

Fenicksnet пишет:

Попробуйте закомментировать 24,25,27 строку.

то о чудо, модуль номально считает время, но его нужно установить вручную.Видимо это из за того, что я прошиваю свое устройство через программатор , а не UART.

мало вероятно, что из-за программатора. я обычно отдельно скечем ставлю время ( так же и программатором).

#include <microDS3231.h>
MicroDS3231 rtc;
void setup() {
rtc.setTime(COMPILE_TIME);
}
void loop() {
}

и больше установку не использую.