RTC DS1302 определение наличия чипа при инициализации

xrx

✩✩✩✩✩✩✩
26 Фев 2023
3
1
Всем привет. Задача такова: необходимо определение наличия подключенного RTC DS1302 при старте микроконтроллера. То есть нужно составить такой алгоритм, при котором можно точно определить есть ли связь с модулем. В распространённых библиотеках для RTC подобного нету, поэтому планирую сделать собственную реализацию. Вот некоторые мысли по этому поводу: Как вариант, в функции инициализации производить запись в какой-нибудь из регистров модуля, например, в регистр 0x8F, в котором располагается флаг защиты от записи, с последующим чтением и сравнением результата. Второй вариант состоит в том, чтобы проверять инкремент регистра отсчёта секунд, что выливается в дополнительную задержку минимум в 1 сек при включении. Возможно, всё реализуется гораздо проще?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Часы работают по i2c ? Значит должны отзываться на запрос сканера i2c, если по адресу часов отзыва нет, то и часов нет, ну или они неисправны
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Вот я тоже думал про begin в начале, но беглое изучение бибилиотек из менеджера показало, что для этих часов везде begin void

А так в принципе можно попробовать снять 2 раза показания через 1 секунду, разница в показаниях должна ее и дать
 

xrx

✩✩✩✩✩✩✩
26 Фев 2023
3
1
@PiratFox, В библиотеках, исходники которых мной были изучены, функции инициализаии в основном ориентируются на запрос через шину I2c, а модуль 1302 использует свою SPI подобную шину

@Старик Похабыч, тоже думаю остановиться на таком варианте, поскольку в случае неработоспособности модуля значение в регистре не поменяется, а чтобы исключить случайный шум в случае обрыва линии данных, её можно подтянуть к питанию
 

xrx

✩✩✩✩✩✩✩
26 Фев 2023
3
1
@PiratFox, Да, но в библиотеке от iarduino метод begin разве что только инициализирует программную шину и флаг остановки генератора проверяет, больше ничего, поэтому тоже не вариант, к тому же для атмега8 великовата она, а в уже имеющемся проекте мк поменять нельзя, поэтому я пока остановился на собственной реализации работы с RTC

В общем такой вариант инициализации подходит. Сначала проверяются флаги как в библиотеке от iarduino, потом в цикле сравнивается значение регистра секунд с предыдущим значением.

C++:
bool DS1302_init(){
  uint8_t tmp;
  uint32_t timeout = millis();
  if (readRegister(REG_WP_READ) & 0x80)  writeRegister(REG_WP_WRITE, 0x00);      // проверка флага защиты от записи
  if ((tmp = readRegister(REG_HOURS)) & 0x80)  writeRegister(REG_HOUR_WRITE, tmp & ~0x80);     //установка 24ч формата 
  if ((tmp = readRegister(REG_SEC)) & 0x80)  writeRegister(REG_SEC_WRITE, tmp & ~0x80);    //старт генератора если остановлен
  while(readRegister(REG_SEC & 0x7f) == tmp){
   if (millis() - timeout > 2000){
     return 1; //rtc not init
   }
  }
  return 0;
}
 
  • Лойс +1
Реакции: PiratFox