DS1302 зависает время

Maksksksksks

✩✩✩✩✩✩✩
13 Мар 2024
12
0
Товарищи, доброго времени суток всем! Уже писал здесь вопрос по реле - оказался китайский модуль, который управляется инвертированным сигналом. В том же проекте выяснилась новая ошибка. Время считывается с модуля ds1302 и выводится на дисплей tm1637. Заливаю программу с командой установления текущего времени, затем повторно заливаю(комментирую эту строчку) - время идёт нормально, двоеточие мигает, как и должно. Через пару дней-день(всегда по-разному) время останавливается, при этом двоеточие продолжает мигать. Перезагружаю - показывает реальное время, как будто и не останавливалось.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
@Maksksksksks, такое бывает при плохом контакте соединений между между модулем и ардуиной.
 

poty

★★★★★★✩
19 Фев 2020
3,261
948
@Maksksksksks, всё зависит от скетча. Мигание точек означает лишь, что МК работает, к DS1302 это никак не относится. А вот "остановка" времени может быть вызвана либо каким-нибудь переполнением (счётчика, например), либо производится попытка чтения DS1302, а он не отвечает.
 

Maksksksksks

✩✩✩✩✩✩✩
13 Мар 2024
12
0
@PiratFox, ардуинка вместе со всеми модулями находится в распределительной коробке, все закреплено жестко. Проводки там не могут никуда отходить.

@poty, сегодня сделаю простенькую схему на макетке. Посмотрим, как будет время идти. О результатах сообщу. Почему модуль может не отвечать?
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
@Maksksksksks, если провода не припаяны, а подключены разъёмами Дюпонт, то проблемы с надёжностью контакта всё равно будут. Впрочем, смотрите сами.
 

Maksksksksks

✩✩✩✩✩✩✩
13 Мар 2024
12
0
@PiratFox, провода к модулям припаяны, а у ардуинки на винтовых зажимах держатся, сама ардуинка стоит вот в таком шилде.
 

Вложения

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
@Maksksksksks, если вы так уверены в надёжности соединений, тогда чего-то наворочено в коде. Ну и нельзя полностью исключать глюки модуля ds1302.
 

poty

★★★★★★✩
19 Фев 2020
3,261
948
@Maksksksksks, вариантов много, например, отсутствуют подтягивающие резисторы на шинах I2C. Но опять же, нужно смотреть код, без этого все слова - лишь гадание на кофейной гуще.
 

Maksksksksks

✩✩✩✩✩✩✩
13 Мар 2024
12
0
@PiratFox, @poty, чтение времени происходит по таймеру на millis(), раз в секунду считывается время и два раза в секунду меняется состояние двоеточия. Тут нечему ломаться, я считаю. Или не так?
Я почти уверен, что проблема в том, что модуль не отвечает на запрос спустя какое-то время работы, но при этом само время в нем идет.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
@Maksksksksks, ну, камрад @poty уже сказал, что без наглядности это всё гадание на кофейной гуще. Приведите хотя бы код для ясности.
 

Maksksksksks

✩✩✩✩✩✩✩
13 Мар 2024
12
0
Оформи код соответствующим тэгом, см. Правила
@PiratFox,
Здесь кусок кода, где используются указанные модули. В других частях программы они не используются.
Форматирование (BB-код):
#include <iarduino_RTC.h>
#include "TM1637Display.h"

#define CLOCK_RST 7
#define CLOCK_DAT 8
#define CLOCK_CLK 9
#define TM1637_DIO 10
#define TM1637_CLK 11

iarduino_RTC clock(RTC_DS1302, CLOCK_RST, CLOCK_CLK, CLOCK_DAT);
TM1637Display display(TM1637_CLK, TM1637_DIO);

int h, m;
unsigned long int f = 0;
bool r = 0;

void setup() {
    clock.begin();  // инициализация модуля часов
    h = clock.Hours;
    m = clock.minutes;
    display.setBrightness(3);
    display.clear();
}

void loop() {
  if (millis() - f >= 500) {  // время
    f = millis();
    h = clock.Hours;
    m = clock.minutes;
    //Serial.println(error.ERROR);
    if (r) {
      display.showNumberDecEx(h, 0b00000000, 0, 2, 0);
      display.showNumberDecEx(m, 0b00000000, true, 2, 2);
    } else {
      display.showNumberDecEx(h, 0b01000000, 0, 2, 0);
      display.showNumberDecEx(m, 0b01000000, true, 2, 2);
    }
    r = !r;
  }
}
 
Изменено:

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
@Maksksksksks, в коде я не вижу периодического вызова функции gettime(). Без неё модуль ds1302 не опрашивается, а значения переменных Hours и minutes берутся из буфера, организованного библиотекой iarduino_RTC.h. Как по мне, всё дело в этом.
 

Maksksksksks

✩✩✩✩✩✩✩
13 Мар 2024
12
0
@PiratFox, gettime() ведь используется для склеивания времени в строку. Мне же нужны именно часы и минуты в двух переменных
Сейчас собрал на макетке схему, TM1637, ds1302 и ардуинка. Все работает. При отключении ds1302 время время сразу же сбрасывается в 0, при подключении обратно восстанавливается.
 
Изменено:

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
@Maksksksksks, Я не хочу дублировать здесь информацию, поэтому посмотрите примеры из библиотеки. В них есть описание функций. Читайте внимательно.
 
  • Лойс +1
Реакции: Maksksksksks

Maksksksksks

✩✩✩✩✩✩✩
13 Мар 2024
12
0
@PiratFox, прочитал, скорее всего, проблема была в этом, спасибо за помощь!
Пойду тестировать.
 

poty

★★★★★★✩
19 Фев 2020
3,261
948
@Maksksksksks, судя по коду время вообще не должно идти. Если я правильно помню для обновления переменных времени в классе iarduino_RTC необходимо непосредственно перед использованием этих переменных вызывать метод gettime().
Строка display.showNumberDecEx(m, 0b01000000, true, 2, 2); выглядит странно, так как второе двоеточие на экране отсутствует.