• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Проблема ESP8266 и DS1307

Старая проблема. Думал, что решилась, но опять вернулась.
Вобщем при считывании по i2c времени с 1307 (раз в 20 секунд) бывает проскакивает неадекватное время - 2165 год и т.п. чушь. потом через 20 секунд снова нормальное время. Бывает долго работает и не глючит. Но сам факт очень неприятен.
Частично решилась хорошей промывкой спиртом платы, а может и совпало.
Модуль и 01 и 12е на разных устройствах те же глюки.
Думал проблема в подтяжке шины - сделал через 2 х 10 кОм - не помогло (и вообще надо ли это?)
 

vad7

Active member
Подтяжка должна быть максимум 3.3k.
Если на время задержек при чтении/записи битов прерывания не запрещаются, возможны любые ошибки.
DS1307 имеет еще пользовательскую память.
Можно попробовать в нее записать "волшебное слово" и читать его вместе с памятью часов и проверять на валидность.
 
Подтяжка должна быть максимум 3.3k.
Если на время задержек при чтении/записи битов прерывания не запрещаются, возможны любые ошибки.
DS1307 имеет еще пользовательскую память.
Можно попробовать в нее записать "волшебное слово" и читать его вместе с памятью часов и проверять на валидность.
Спасибо , что откликнулись. Немного не понял на счёт волшебного слова. Валидность я и так вижу. Если время кракозяблы и первый регмстр извлкаемый функцией RTC.GetValid... (не помню) переходит в единицу.
А вот подтяжка в 3,3 кОма меня смутила.
Я после того как 10кОм не помогли вообще отказался от неё.
Просто если я цепляюсь к пинам 4 и 5 12е модуля то это спецноги для шины айтуси. И по крайней мере на AVRах никогда вообще не ставил их и всё работает прекрасно.
А вот прерывания... Тут ХЗ реально. Частота 80 Мгц у есп. скорость шины поставил 100000. Не думаю, что прерывания как-то блокируют обмен. Да и выскакивание глюков - полная неопределенность во времени. Может и час проработать, а потом сбойнуть. А может и сутки.
 

vad7

Active member
Это на ардуине?
DS1307 на готовой китайской плате или самостоятельная сборка? Тогда какая схема?
На платах стоит 3.3к. До 400kHz нормально.
Подтяжка зависит от частоты шины и емкости линии.
Точный расчет здесь: http://www.ti.com.cn/cn/lit/an/slva689/slva689.pdf
На AVR обычно прерывания быстро исполняются, мало кто в них большой код пишет.
А тут WiFi срабатывает периодически и сколько это отнимает времени неясно.
Так что либо пробовать запрещать прерывания на критичное время либо забить и проверять валидность.
"Волшебное" слово увеличит вероятность обнаружения глюка. Можно, в принципе, и проверять остальные регистры часов, чтобы они в диапазон попадали.
Но так как контрольной суммы нет, то рано или поздно все равно проскочит глюк.
 
Это на ардуине?
DS1307 на готовой китайской плате или самостоятельная сборка? Тогда какая схема?
На платах стоит 3.3к. До 400kHz нормально.
Подтяжка зависит от частоты шины и емкости линии.
Точный расчет здесь: http://www.ti.com.cn/cn/lit/an/slva689/slva689.pdf
На AVR обычно прерывания быстро исполняются, мало кто в них большой код пишет.
А тут WiFi срабатывает периодически и сколько это отнимает времени неясно.
Так что либо пробовать запрещать прерывания на критичное время либо забить и проверять валидность.
"Волшебное" слово увеличит вероятность обнаружения глюка. Можно, в принципе, и проверять остальные регистры часов, чтобы они в диапазон попадали.
Но так как контрольной суммы нет, то рано или поздно все равно проскочит глюк.
В прерываниях я ставлю только флаги, а сами функции выполняю в основной части программы.
Что делает вайфай с прерываниями - хз.
А вот поставить подтяжку в 3,3 буду пробывать.
Дай бог чтобы помогло.
 
Предлагаю радикальное, но действенное решение - аккуратно взять ds1307 и чтоб пины не погнуть ВЫКИНУТЬ из проекта.. потом на али за 0.56 центов на плате купить модуль с ds3231 и горя не знать. Проверено на личном опыте. Проблема в том, что штатно 1307 не проектировался для работы на 3.3 вольта и оно ТИПА работает, типа нет.. все, как Вы описываете. А 3231 штатно придуман работать на 5 и на 3.3 вольта. Может я и крайне криворук, но мои попытки завести 1307 на esp8266 не увенчались успехом, а вот 3231 - с пол пинка. аж скучно :)
 

vad7

Active member
Мы еще схему топик-стартера не увидели, а так да, по даташиту: Vcc > Vbat * 1.25
Если батарейка 3V, то Vcc должен быть больше 3.75V
 

al.kl

New member
Прерывания не могут запороть обмен по I2C, т.к. этот интерфейс не имеет максимальных временных интервалов ни по клокам, ни по данным. Только минимальные, и те ограничиваются самим устройством. Хоть раз в секунду дёргай CLK, получая частоту обмена = 1 Гц.
Это вам не 1-Wire, где временные интервалы у тайм-слотов жёстко определены :)

Что касается подтягивающих сопротивлений.
Их ставить обязательно ! Их роль - поднимать шину в состояние логической единицы. При этом, устройства освобождают линию, устанавливая выходы в высокоимпедансное состояние.
Сопротивление их не оговаривается. От него зависит скорость нарастания шины из лог "0" в лог. "1". Чем оно выше - тем дольше идёт нарастание, соответственно снижается максимальная скорость шины. Чем они ниже, тем выше максимальная скорость и выше помехоустойчивость. Но, увеличивается ток через выходные ключи устройств.
Отсюда можно сделать вывод. Ни в коем случае, никогда, нельзя подавать на шину данных логическую единицу (коммутировать линию данных на Vcc), т.к. в этот момент может другое устройство попытаться его притянуть к земле. И, судя по тому, что у человека что-то работает без сопротивлений, так оно и есть. Ибо ноль всегда "победит" единицу - он мощнее у выводов микросхем. В итоге получим - либо неработоспособность, либо глючность (из-за не до конца опустившейся шины в ноль), либо со временем убитые микросхемы.
 
Последнее редактирование:
Прерывания не могут запороть обмен по I2C, т.к. этот интерфейс не имеет максимальных временных интервалов ни по клокам, ни по данным. Только минимальные, и те ограничиваются самим устройством. Хоть раз в секунду дёргай CLK, получая частоту обмена = 1 Гц.
Это вам не 1-Wire, где временные интервалы у тайм-слотов жёстко определены :)

Что касается подтягивающих сопротивлений.
Их ставить обязательно ! Их роль - поднимать шину в состояние логической единицы. При этом, устройства освобождают линию, устанавливая выходы в высокоимпедансное состояние.
Сопротивление их не оговаривается. От него зависит скорость нарастания шины из лог "0" в лог. "1". Чем оно выше - тем дольше идёт нарастание, соответственно снижается максимальная скорость шины. Чем они ниже, тем выше максимальная скорость и выше помехоустойчивость. Но, увеличивается ток через выходные ключи устройств.
Отсюда можно сделать вывод. Ни в коем случае, никогда, нельзя подавать на шину данных логическую единицу (коммутировать линию данных на Vcc), т.к. в этот момент может другое устройство попытаться его притянуть к земле. И, судя по тому, что у человека что-то работает без сопротивлений, так оно и есть. Ибо ноль всегда "победит" единицу - он мощнее у выводов микросхем. В итоге получим - либо неработоспособность, либо глючность (из-за не до конца опустившейся шины в ноль), либо со временем убитые микросхемы.
Ну про коммутирование на +5В напрямую я не делал))) А пул-ап через 10 кОм. И не помогло.
 
Предлагаю радикальное, но действенное решение - аккуратно взять ds1307 и чтоб пины не погнуть ВЫКИНУТЬ из проекта.. потом на али за 0.56 центов на плате купить модуль с ds3231 и горя не знать. Проверено на личном опыте. Проблема в том, что штатно 1307 не проектировался для работы на 3.3 вольта и оно ТИПА работает, типа нет.. все, как Вы описываете. А 3231 штатно придуман работать на 5 и на 3.3 вольта. Может я и крайне криворук, но мои попытки завести 1307 на esp8266 не увенчались успехом, а вот 3231 - с пол пинка. аж скучно :)
Если честно, то не вижу влияния +5 и 3,3 вольтов на устройствах.
Если кто и пострадать должен так есп. Так как у него питание ниже.
А здесь 1307 даже "может и не знать" сколько вольт у ведущего его мк. Так как они оба стягивают шину на землю и нет разницы на какой напруге работают они. Хоть 220В.
 
Сверху Снизу