Использую DS3231 на самодельной печатной плате около полугода. Нередко работают от батарейки. Относительно телефона, который берёт время из сети, не ушли ни на секунду. Пробовал разные библиотеки, ни одна не понравилась. Те, что мне попадались, выдавали время и дату какими-то строками, с которыми непонятно что делать. Остановился на стандартной библиотеке I2C, отправляя ей коды из даташита. Время выставил раз и читаю, SQW переключается и работает. В дату и будильники не лазал, там сложно, да и мне без надобности.
Готовый модуль на ds1307 пробовал, время убегает безбожно. Я и кварц пропаивал, и аккумулятор на батарейку менял....А если в контроллере использовать ежесуточную программную коррекцию (как сделано во многих поделках из интернета), то зачем RTC вообще нужен?
Вобщем часы работают без замечаний. Добавил в коде еще вывод температуры(ну если есть градусник нужно пользоваться)
Я же Вам объяснял почему нужно время переключать по SQW а не в loop спрашивать время. Но, дело Ваше. Не нужно точность, а нужна перегрузка контроллера - Вам жить :)
Что касается "<i>есть градусник нужно пользоваться</i>", зачем? Он показывает не температуру воздуха, а температуру внутри чипа и используется для корректировки кварца. Можно его использовать, например, для определения момента, когда надо принудительное охлаждение включать. А показывать его ... нафига? Цену на овёс смотреть?
Переключая время по SQW невозможно обеспечить моргание светодиода раз в секунду. Может вам это не интересно, но без этого цифровые часы выглядят как то не так. Температура чипа, по моим наблюдениям , точно соответствует температуре воздуха. Превышения не наблюдал.
"....Переключая время по SQW невозможно обеспечить моргание светодиода раз в секунду...."
Почему? При частоте в 1 Гц точки пол-секунды горят, пол- не горят, а прерывание по RISE раз в секунду приходит. Точки вообще можно аппаратно запустить, через ключик транзисторный. МОжно в прерывании включать, а по миллису отключать (если программно). Или я вас не понял?
При частоте 1Гц период колебания составит 1 сек. То есть за 1 сек должен пройти полный цикл переключения. А то, про что вы пишите, это-0,5Гц. Или я совсем с ума сошёл, коллеги рассудите?
Почему переотдыхал? Простое размышление. Часы пробуждаются 1 раз в секунду. Значит изменить состояние диода горит - не горит можно раз в секунду. Полный период мигания получается 2 секунды или 0.5 герца. А мигать должно с частотой 1 герц. Т.е 500 милисекунд горит, 500 милисекунд не горит. Если пробуждаться только от часов раз в секунду этого не обеспечить. Нужно что бы ещё через 500 милисекунд процессор проснулся да хоть бы от чего то еще, что бы погасить диод, который будет зажжён при секундном прерывании. Что не так в моих рассуждениях? Как вы обеспечите период 500 мс для управлением морганием? DS3231 не имеет возможности делать прерывание 500 мс.
Ну во-первых можно настроить прерывание на CHANGE, тогда будут приходить каждые 0,5с. Ну и выше предлагался (обсуждался) аппаратный способ управления двоеточием.
Аппаратный это не наш вариант. Мы микроконтроллер программно мучаем. А вот про: "CHANGE, тогда будут приходить каждые 0,5с" можно по подробнее? Либо я не понял даташит, либо прерывание от секунд нужно сбрасывать в ручную. Т.Е. если вы хотите получить следующее секундное прерывание вы должны в текущей обработке снять флаг A1F. Через 500 милисекунд ничего не происходит. Так как программно?
nik182, и всё таки вы переотдыхали :) В #60 "1 герц одну секунду горит одну секунду не горит " А в №63 уже "А мигать должно с частотой 1 герц. Т.е 500 милисекунд горит, 500 милисекунд не горит" Мне одному кажется что длительность герца в двух фразах была разной? ;)
И про 1Герц из часов может что-то не пропустил, -но в часах есть два режима дёрганья лапой SQW. Режим генератора, и режим будильника. Соответссно в первом не требуется снимать флаг.
Yes! Действительно в режиме генерации 1 герц будет то что нужно - просыпание каждые 500 мс. У меня проблема в другом. У меня DS3231 пристёгнута к тиньке 25 и ног на прерывание просто нет. Даже кнопки пришлось на ноги управления дисплеем сажать.
Тогда по таймеру (внутри контроллера) можно прерывание организовать 2 раза за секунду, в каждом светодиод переключать, в каждом втором время обновлять (хотя этот способ и осудили в данной теме из-за несинхронности,но он рабочий).
счастливые владельцы ds1307 смотрите сюда https://www.youtube.com/watch?v=b8-4o6A7dZs
Использую DS3231 на самодельной печатной плате около полугода. Нередко работают от батарейки. Относительно телефона, который берёт время из сети, не ушли ни на секунду. Пробовал разные библиотеки, ни одна не понравилась. Те, что мне попадались, выдавали время и дату какими-то строками, с которыми непонятно что делать. Остановился на стандартной библиотеке I2C, отправляя ей коды из даташита. Время выставил раз и читаю, SQW переключается и работает. В дату и будильники не лазал, там сложно, да и мне без надобности.
Готовый модуль на ds1307 пробовал, время убегает безбожно. Я и кварц пропаивал, и аккумулятор на батарейку менял....А если в контроллере использовать ежесуточную программную коррекцию (как сделано во многих поделках из интернета), то зачем RTC вообще нужен?
Вобщем часы работают без замечаний. Добавил в коде еще вывод температуры(ну если есть градусник нужно пользоваться)
Вобщем часы работают без замечаний. Добавил в коде еще вывод температуры(ну если есть градусник нужно пользоваться)
Я же Вам объяснял почему нужно время переключать по SQW а не в loop спрашивать время. Но, дело Ваше. Не нужно точность, а нужна перегрузка контроллера - Вам жить :)
Что касается "<i>есть градусник нужно пользоваться</i>", зачем? Он показывает не температуру воздуха, а температуру внутри чипа и используется для корректировки кварца. Можно его использовать, например, для определения момента, когда надо принудительное охлаждение включать. А показывать его ... нафига? Цену на овёс смотреть?
Евгений,Вы здесь много что сказали ,в том числе и полезного. Но я ведь не спорю с Вами.
Благодарю Вас Всех за помощь!
Переключая время по SQW невозможно обеспечить моргание светодиода раз в секунду. Может вам это не интересно, но без этого цифровые часы выглядят как то не так. Температура чипа, по моим наблюдениям , точно соответствует температуре воздуха. Превышения не наблюдал.
"....Переключая время по SQW невозможно обеспечить моргание светодиода раз в секунду...."
Почему? При частоте в 1 Гц точки пол-секунды горят, пол- не горят, а прерывание по RISE раз в секунду приходит. Точки вообще можно аппаратно запустить, через ключик транзисторный. МОжно в прерывании включать, а по миллису отключать (если программно). Или я вас не понял?
Точки вообще можно аппаратно запустить, через ключик транзисторный.
Ну да и нафига прерываня городить. У меня так сделано.
По прерыванию можно просить контроллер обновить время, будильник проверять, например.
При частоте 1 герц одну секунду горит одну секунду не горит, а надо пол секунды. Прерываниями DS3231 этого не обеспечить. От слова никак.
При частоте 1Гц период колебания составит 1 сек. То есть за 1 сек должен пройти полный цикл переключения. А то, про что вы пишите, это-0,5Гц. Или я совсем с ума сошёл, коллеги рассудите?
Тарас Петрович, наш дорогой коллега Nic немножко переотдыхал, со всеми бывает :)
Почему переотдыхал? Простое размышление. Часы пробуждаются 1 раз в секунду. Значит изменить состояние диода горит - не горит можно раз в секунду. Полный период мигания получается 2 секунды или 0.5 герца. А мигать должно с частотой 1 герц. Т.е 500 милисекунд горит, 500 милисекунд не горит. Если пробуждаться только от часов раз в секунду этого не обеспечить. Нужно что бы ещё через 500 милисекунд процессор проснулся да хоть бы от чего то еще, что бы погасить диод, который будет зажжён при секундном прерывании. Что не так в моих рассуждениях? Как вы обеспечите период 500 мс для управлением морганием? DS3231 не имеет возможности делать прерывание 500 мс.
Ну во-первых можно настроить прерывание на CHANGE, тогда будут приходить каждые 0,5с. Ну и выше предлагался (обсуждался) аппаратный способ управления двоеточием.
Аппаратный это не наш вариант. Мы микроконтроллер программно мучаем. А вот про: "CHANGE, тогда будут приходить каждые 0,5с" можно по подробнее? Либо я не понял даташит, либо прерывание от секунд нужно сбрасывать в ручную. Т.Е. если вы хотите получить следующее секундное прерывание вы должны в текущей обработке снять флаг A1F. Через 500 милисекунд ничего не происходит. Так как программно?
nik182, и всё таки вы переотдыхали :) В #60 "1 герц одну секунду горит одну секунду не горит " А в №63 уже "А мигать должно с частотой 1 герц. Т.е 500 милисекунд горит, 500 милисекунд не горит" Мне одному кажется что длительность герца в двух фразах была разной? ;)
И про 1Герц из часов может что-то не пропустил, -но в часах есть два режима дёрганья лапой SQW. Режим генератора, и режим будильника. Соответссно в первом не требуется снимать флаг.
CHAGE- прерывание по изменению уровня на входе. Реализуется штатными программными средствами ардуино.
http://arduino.ru/Reference/AttachInterrupt
Yes! Действительно в режиме генерации 1 герц будет то что нужно - просыпание каждые 500 мс. У меня проблема в другом. У меня DS3231 пристёгнута к тиньке 25 и ног на прерывание просто нет. Даже кнопки пришлось на ноги управления дисплеем сажать.
Тогда по таймеру (внутри контроллера) можно прерывание организовать 2 раза за секунду, в каждом светодиод переключать, в каждом втором время обновлять (хотя этот способ и осудили в данной теме из-за несинхронности,но он рабочий).