Нужна консультация при реализации алгоритма - просто получаем время "чч:мм:сс". Для этого последовательно выполняется 3 чтения - часы, минуты, секунды соответственное. Каждое из которых установили CE, отправили байт, приняли байт, сбросили СЕ. И так 3 раза.
Предположим, что сейчас 10:59:59 и
а) начинаем читать с секунд - 59. И время меняется. Далее минуты, получаем 00 и часы 11. И в итоге у нас 11:00:59 - т.е. на минуту больше, чем надо
б) начинаем читать с часов - 10. Время меняется... 10:00:00 - т.е. на час меньше, чем надо.
Я верно понимаю, что такая ситуация возможна? И решение, если я читаю часы-минуты-секунды и получаю в секундах 00 - то мне следует перечитать минуты ещё раз и сделать вывод.
p.s. Datasheet содержит описание именно "SINGLE BYTE READ".
Вопрос решен - все проблемы от неумения внимательно читать даташиты. Возможность заблокировать изменение на время чтения в микросхеме есть и при криворукой реализации (тупо читать), такая проблема возможна.
"At the beginning of a clock burst read, the current time is transferred to a second set of registers. The time
information is read from these secondary registers, while the clock may continue to run. This eliminates the need to
re-read the registers in case of an update of the main registers during a read. "
Как раз не надо ничего читать по несколько раз!
rowaxi, мы возможно ещё и разные документы смотрели. Я смотрел datasheet от Maxim вот с этой странички: https://www.chipdip.ru/product/ds1302
Но я суть именно так и понял. Там и на картинке ведь чтение двух байт нарисовано.
kalapanga, разные. У меня revision 092801, у вас 120208. Но если вы про картинку Figure 4, то одного - сначала передаем адрес - 1 байт, потом читаем. Просто разбираю чужой код, предполагаю в этом месте логическую ошибку с возможными неприятными последствиями. Скачал библиотеку от arduino - там устанавливают бит. Читают. Сбрасывают.
Ну это не только раз в час может произойти, но и раз в минуту при смене минуты. И вероятность этого можно оценить так: 500мс/1минута=0,83% 500мс/1час=0,014%
Что не так и мало. По-хорошему надо считать 2 раза и сравнить.
Посмотрел даташит по диагонали - там есть ещё и BURST MODE, возможно это именно то что нужно
И решение, если я читаю часы-минуты-секунды и получаю в секундах 00 - то мне следует перечитать минуты ещё раз и сделать вывод.
Обычно в таких случаях самый часто изменяющийся разряд читают дважды -- в начале и в конце чтения составного значения и перечитывают значение целиком если этот разряд изменился.
Целиком нецелесообразно, т.к. если секунда с первой по 59, а чтение гарантировано менее полсекунды (миллисекунды), то время не изменилось. Но вопрос в том, что теоретически ведь так произойти может с этой железкой?