Создал тему, чтобы задавать возникающие по ходу дела вопросы. Делаю проект заготовку. Часы, календарь, будильник, таймер. DS3231.
Вопрос первый. У DS3231 намертво зашитый календарь или нет? Поясняю вопрос. Если я запишу в RTC некорректный календарь, что произойдет? К примеру, пусть сегодня 17 сентября, четверг. 2020 год. Я в настройках набрал 17 сентября, пятница. 2020 год. Заливаю данные в DS3231. Что произойдет?
Видео процесса на данный момент. Дисплей Futaba M204SD08AA. 20x4. На 4 строке тестовый вывод переменных и справа выведено значение 16 битного таймера, который измеряет время обращения к RTC.
Последний раз редактировалось Demiurg Чт сен 17, 2020 15:51:14, всего редактировалось 2 раза.
Произойдет парадокс с последующим разделением вероятности на две линии.
даташит:
The day-of-week register increments at midnight. Values that correspond to the day of week are user-defined but must be sequential (i.e., if 1 equals Sunday, then 2 equals Monday, and so on). Illogical time and date entries result in undefined operation.
Вольный перевод гуглом: регистр дня недели увеличивается в полночь. Значения, соответствующие дню недели, определяются пользователем, но должны быть последовательными (т. Е. Если 1 равно воскресенью, то 2 равно понедельнику и т. Д.). Нелогичные записи времени и даты приводят к неопределенной операции.
ден недели в поравилный RTC обычно не вносится он сам вычисляется чипом исходя из даты и года по матрице лет
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
BlackKilkennyCat писал(а): Я в настройках набрал 17 сентября, пятница. 2020 год. Заливаю данные в DS3231. Что произойдет?
Запишет как пятницу, то есть как 5-й день, ну или как 6-й, это зависит от того с какого дня у вас неделя начинается.
Он не определяет правильный ли день недели введен. Там с этим все примитивно.
[uquote="musor",url="/forum/viewtopic.php?p=3893581#p3893581"]ден недели в поравилный RTC обычно не вносится[/uquote]
Ну, исходя из этого 3231 не нормальный.
У него банально вводиться номер дня и он его по кругу считает от 1 до 7.
[uquote="musor",url="/forum/viewtopic.php?p=3893581#p3893581"]ден недели в поравилный RTC обычно не вносится...[/uquote]
Поправляю. Ден недели в правильном СОФТЕ обычно не вносится...
[uquote="OKF",url="/forum/viewtopic.php?p=3893644#p3893644"][uquote="musor",url="/forum/viewtopic.php?p=3893581#p3893581"]ден недели[/uquote]
Поправляю[/uquote]
Поправляльщик... Ггг. Хм, благодарю.
Сегодня поэкспериментирую. Посмотрю на поведение часиков...
Что там экспериментировать - это обычный счётчик, который знает, что в минуте столько-то секунд, в часах столько-то минут, в сутках столько-то часов, в таком-то месяце столько-то дней и високосные года. Вычислением дней недели оно не занимается, просто крутит от 1 до 7 в полночь
При этом когда пользователь задаёт дату, то именно софт должен ограничивать его. Не давать вписать 31 ноября или знать в каком году в феврале на день больше.
Сначала вводится год, определяем високосный ли он и далее по списку.
Сделал проверку. Записывал в RTC только числа месяцев, месяцы, годы. Затем сразу же считывал данные. День недели не менялся. То есть, день недели задается пользователем.
Сейчас занимаюсь примерами вычисления високосных лет. Если кто поделится примером на си, заранее благодарен.
С какой целью это делать при использовании DS3231? Она и без этого умеет это делать. Вот если бы Вы делали часы просто на основе одного МК, то тогда другое дело. А так все подобные алгоритмы (ИМХО) в данном варианте не несут ни какой пользы.
Мои эксперименты показали следующее: (если с часами уже экспериментировали, как поведут себя новые часы, пока неизвестно, нет в наличии), при задании календарной даты день недели произвольный, задается пользователем, также RTC молча проглотил 30 февраля и при задании 23.59.00 вывел 31 февраля.
Резюмирую. Нужно софтово проверять корректность календарных данных. При изменении месяцев, если февраль, проверять, какая дата стоит, чтобы не перевалило за 28 или 29.
Добавлено after 6 hours 5 minutes 48 seconds:
В данный момент чешу репу, как быть. На уровне интерфейса. Если некорректные данные при вводе времени, календарных данных. Скажем, 30 число, вводим Февраль. Некорректно. Или был високосный год, а сейчас не високосный, стоял февраль. 29 число. Правим год. Невисокосный, а число 29 февраля. Некорректно. Это примеры ввода.
Выводить какое-то сообщение или? В данный момент у меня сделано так. При входе в редактирование параметров массив переменных переносится во временный массив. Если данные некорректны, при нажатии на Enter возвращаются назад старые данные. Если все корректно, записывается в RTC.
Зачем задавать заведомо неправильную дату месяца? Ни один софт не сможет победить глупость пользователя. Не пойму какую цель Вы преследуете. Как отреагирует Ваш софт если вместо сегодняшнего 18 сентября, пользователь установит 20 сентября. Сможет Ваш софт скорректировать неправильную дату? Нет? Вот то-то и оно. Что касается RTC, он никогда не выведет неправильную дату в феврале если задать изначально правильно текущую дату и соответствующий год.
не совсем понятно, в чём трудность не дать в принципе ввести за пределами диапазона.
день более 28 - месяц проверяется на февраль, если да - проверяется на високосность и день меняется на 29 или 28, если нет, проверяется на апрель, июнь, сентябрь и ноябрь, если да и равно 31 - меняется на 30.
В данный момент у меня все параметры проверяются на корректность автоматически при редактировании (кнопки Плюс-Минус, диапазоны значений). Также, когда введены необходимые значения, при нажатии на Enter данные проверяются на корректность перед сохранением и заливкой в RTC. Оказалось, могут быть коллизии, я их описал выше. Это февраль, високосный-невисокосный год, 29 число.
Мне нужно: подчеркиваю, не кодом, а словами, на уровне интерфейса. Что делать, если некорректные значение. К примеру, когда я делал блоки управления для станков, у меня было реализовано так: если какое-либо значение некорректно, на дисплей выводится сообщение с соответствующим предупреждением и ошибкой. Чтобы выйти из этого состояния, оператор должен нажать кнопку Esc-Отмена.
да зачем вообще давать возможность вводить некорректное значение? чтобы потом сообщить пользователю? и заставить нажимать Esc?
На станках подобного вообще не должно быть. нажал не то - раздался бип, что не то, и всё. Следующее нажатие уже должно быть мочь то, а не лишнее Esc.
Не понимаю в чём проблема.
Всё просто, сначала вводится год. +/- границы понятны(например от 20 до 99 или от 020 до 999 или от 2020 до 9999). После ввода сразу вычисляем високосный он или нет.
Потом вводится месяц от 1 до 12, границы тоже определены. Сделать так чтобы +/- нельзя было нащёлкать 0 или 13))) Просто? Просто!
Далее с учётом високосности решаем сколько дней в указанном месяце: 28/29/30/31 и ставим границу для числа от 1 до вычисленного.
А далее просим ввести число: просто нажимая на +/- они по кругу будут идти правильные и никаких ошибок выводить никому не надо. Просто другое не ввести.
Если ввод пультом цифрами, то если цифра в вводимом разряде не может быть введена, она не вводится и разряд продолжает "мигать" пока не введут правильную.
Телефон свой откройте да посмотрите как сделано.
Три параметра: дата месяц год, справа у вас готовый календарь отображается.
Ставлю 31 января 2020.
Перевожу на февраль, дата становится 29.
Взял старый сотовый:
Три параметра: дата месяц год, слева день недели (день недели недоступен редактированию)
ставлю 31 января 2020
перевожу месяц на февраль, дата меняется с 31 на 29.
[uquote="AndTer",url="/forum/viewtopic.php?p=3894222#p3894222"]...[/uquote]
Вы не поняли моего вопроса. Написали все то я и так знаю, у меня это и реализовано. Но вы не написали ничего, что касается интерфейса. Повторяю. На уровне ИНТЕРФЕЙСА.
[uquote="Dimon456",url="/forum/viewtopic.php?p=3894252#p3894252"]...[/uquote]
Наконец-то конкретика. Ага, то есть, если выставлены последние числа месяцев, то от этого и исходить. Хм... Вариант.
Добавлено after 24 minutes 32 seconds:
Новое видео.