Сигнал секунды на DS3231
- Войдите на сайт для отправки комментариев
Пнд, 15/08/2016 - 11:55
Всем Привет!
Сейчас работаю с DS3231, прошу совета бывалых.
С помощью прерывания и данного RTC я создаю регистр ЧЧ:ММ:СС,ссс, тоесть добавляю миллисекунды.
В данный момент, при перещёлкивании так сказать таймера на 1 секунду, по идее должен обнуляться счетчик миллисекунд. Сейчас это реализовано путем сравнения предыдущего значения и действительного, но получается это слишком громоздко. Есть ли процедуры, работающие по событию onChange?
Заранее спасибо за ответы!
Вопрос не до конца понятен. Я понял его так: Вам нужно иметь какое-то прерывание или ещё что, короче чтобы какая-то Ваша функция вызывалась при переходе секунды. Правильно? Если неправильно, то дальнейшее можно не читать
С DS3231 это не проблема.
У неё можно настроить подачу сигнала на ногу SQW либо каждую минуту (при переходе минуты) либо каждую секунду (опять же при переходе секунды). Как это настраивается написано в разделе Alarms даташите - там есть таблица "Alarm Mask Bits" и там есть комбинации битов для "Alarm once per second" и "Alarm once per minute (00 seconds of every minute)".
Всё необходимое для настройка (запись в регистры) есть в библиотеках для этой RTC.
На практике на пине SQW постонно держется высокий уровень, а при переходе на новую минуту/секунду уровень становится низким. Точно не помню, кажется его надо вручную обратно восстановить (если надо я найду свои старые коды, там всё есть).
Т.е. я просто заводил SQW на одну из ног Ардуино, понимающих внешние прерывания и настраивал прерывание по falling - и всё срабатывало, моё прерывание дёргалось как раз при переходе минуты (мне нужно было именно минуты, но можно и секунды).
Если надо, могу найти свой код (для границы минуты), но только вечером, как домой попаду.
Ну сейчас времени поболее, напишу пожалуй подробнее =)
Делаю систему хронометража, и необходимо иметь четкое значение времени вплоть до миллисекунд. По началу решил сделать на базе таймерного прерывания, используя библиотеку TimerOne. Но к сожалению. у нескольких модулей он работал по-разному, и таймеры ушли на 4 секунды за 2 часа.
Поэтому были приобретены DS3231, чтобы получить правильные часы. Но вот незадача - у них есть только секундный регистр.
Идея такова - с помощью TimerOne делаем миллисекунду, а по сигналу смены секунды от DS3231 обнуляем значение таймера (с 0). Отсюда получаем требуемую точность =)
Если не трудно, пожалуйста поищите. Просто уже идеи кончились...
AntonM, можно обнулять саму функцию миллис, если оно не занята другими делами. У меня даже пример почти подходящий был, вот под вашу задачу подкорректировал:
Для датчиков то подойдет, а вот на светофоре как раз через millis сделано.... Но всё равно спасибо! Подожду вариант с пином SQW
AntonM, не понял, чего вы подождёте?? :)
AntonM, не понял, чего вы подождёте?? :)
На всякий случай -мой вариант именно с дёрганьем ногой SQW. От неё на прерывание ( 2 пин) ардуины.
AntonM, не понял, чего вы подождёте?? :)
На всякий случай -мой вариант именно с дёрганьем ногой SQW. От неё на прерывание ( 2 пин) ардуины.
Решение интересное. Но немного не понятное. Вы импортируете и выдергиваете значение времени из регистра, так? Но где у вас настройка выхода SQW?
И получается будет 2 прерывание у меня....
P.S.: просто не люблю тупо скопировать и вставить, хочу разобраться
AntonM, настройка выхода в часах -6 и 7 строка.
Спасибо!
Только вот интересная штука - ничего не настраивал, только подключил ds3231 - а там уже сидит 1 гц... Интересно...
Отбой, перебился провод с SQW до 3его пина =) Спасибо большое за код!