Но надо обязательно отметить, что такая операция неатомарна и если где-то ещё в коде изменяется порт, то рано или поздно, по закону Мёрфи, это случится именно между чтением и записью. Собственно, поэтому во многих архитектурах есть спецрегистры для записи/сброса битов. BSRR, например, на stm32. И если целевая платформа такую фичу поддерживает, следует использовать её.
Есть более короткая версия данных анализа GPS из UBX-G6010? Пока декодирую только данные для часов (со множеством проверок), но хотелось бы, чтобы с более короткими выражениями.
И какого размера должен быть буфер? Ставлю 500 для теста ( вх. UART 9600, новые данные загружаются каждые 1 секунду). (Для всей успешно перехваченной посылки ($GPGGA, $GPGSA, $GPGSV, $GPGLL, $GPRMC ...) мне кажется это мало).
Третьим аргументом функции GPIO_WriteBit() будет значение выражения
Код:
(i == 0) ? (i = Bit_SET) : (i = Bit_RESET)
которое при каждом вызове будет менять своё значение с Bit_SET на Bit_RESET и наоборот.
-- без учёта внешнего кода сложно сказать, что будет там происходить -- поскольку i может меняться где то еще -- а так же надо понимать, что собой представляют Bit_SET и Bit_RESET -- поскольку если ни один из них не равен нулю -- всегда будет ложь.
safocl, прошло всего-то пол года. Не усложняйте, там всё именно так как описано. Придумывать варианты когда не будет работать смысла нет, ибо код пишут чтобы он работал.
//если время 00 : 00 : 30 : понедельник if (hour(tm)==0 && minute(tm)==0 && second(tm)==30 && Wday(tm)==1){
if (tik_correc >= 3){ //считаем недели //корректируем секунды прибавляя или отнимая число TIME_CORRECT (от - 5 сек. до +5 сек.) Now.Second = second(tm) + TIME_CORRECT; RTC.write(Now); tik_correc = 0;} // запись в ds 3231
else {tik_correc++;} // прибавляем неделю delay (5000); }
добрый день! есть китайский ds3231 и он за четыре недели отстает на 2 секунды... у нас в деревне раз или два точно отключается свет, соответственно переменная tik_correc обнуляется отсюда корректировка времени не получается... в еепром запоминать нехочется, а как еще можно коректировать не завися от электричества.
Но ведь у DS3231 есть встроенная коррекция. Почему бы не использовать её?
P.S. Я имею в виду регистр 10h (Aging offset), записывая в который число от -128 до 127, можно влиять на используемую в DS3231 температурную компенсацию.
Добавлено after 3 hours 29 minutes 33 seconds: https://community.alexgyver.ru/resource ... odulej.32/ у меня одна микросхема ds3231, Arduino IDE version 1.8.19 загрузил скеч synchro_RTC_MINI... Arduino IDE version >= 1.8.13 (!Replace compilation flags from -Os to -O2);- че поменять ??? я не понял
Цитата:
Этот метод медленный, но его преимущество заключается в том, что он не требует каких-либо ручных усилий, кроме установки и считывания текущего времени. Нужно просто дать модулю спокойно поработать на полке день или два. Преимущество этого метода заключается еще в том, что часы проходят несколько дневных и ночных циклов, где они подвержены суточным колебаниям температуры. И поэтому этот метод помогает лучше спрогнозировать долгосрочную стабильность часов.
разжуйте пожалуйста я не очень понимаю не пойму типа в регистр 10h Aging offset записалось число и дальше не парится... или при каждом считывании времени записывать в регистр 10h Aging offset переменную которая сохранилась в регистрах Alarm1
Цитата:
сохранение параметров и калибровочных данных в регистрах Alarm1 (DS3231);
ds 3231 при пропадании внешнего питания, питается от резервного (батарейка)
Добавлено after 12 minutes 16 seconds: попробую сформулировать вопрос я не пойму : узнав это число после 2-3 дней и записав его в регистрах Alarm1 (DS3231) при пропадании света в void setup () снова запишу в регистр 10h Aging offset и больше в коде ничего не нужно делать все с корректируется?
Если резервная батарейка стоит, то ничего больше делать не надо. Один раз записать - и всё.
А эта программка всего лишь позволяет за пару-тройку дней без лишних телодвижений выяснить, какое именно число для данного конкретного случая нужно. Но ничто не мешает и самому эту поправку вычислить. Скажем, сегодня выставить в 0, а через 10 дней непрерывной работы часов посмотреть, на сколько секунд ушло и посчитать необходимое значение.
А эта программка всего лишь позволяет за пару-тройку дней без лишних телодвижений выяснить
какая-то хрень, у меня Windows 10 64-bit и постоянно обрывается связь. ( пишут только с Linux нет проблем)...
Цитата:
Но ничто не мешает и самому эту поправку вычислить. Скажем, сегодня выставить в 0, а через 10 дней непрерывной работы часов посмотреть, на сколько секунд ушло и посчитать необходимое значение.
пожалуйста чуть чуть по подробнее что выставить и чего посмотреть ( прошу прощения для ВАС белый день для меня темный лес)
пожалуйста чуть чуть по подробнее что выставить и чего посмотреть ( прошу прощения для ВАС белый день для меня темный лес)
Выставляете значение коррекции 0 и в течение нескольких дней наблюдаете за ходом часов. Выясняете, спешат или отстают часы и на сколько. После этого разово устанавливаете новое значение коррекции, чтобы компенсировать этот уход.
По даташиту, "At +25°C, one LSB typically provides about 0.1ppm change in frequency."
То есть изменение на единицу значения коррекции даёт изменение количества импульсов в минуту на 0.1. В сутки это даст компенсацию в 0,1 / (32768 * 60) * (60 * 60 * 24) = 0,0044 секунды.
Получается, значения от -128 до +127 позволяют скомпенсировать суточный уход вплоть до ±0,55 секунды (0,0044*127).
Если я всё правильно посчитал и нигде не ошибся...
P.S. Если у Вас за четыре недели часы отстают на 2 секунды, получается:
2 сек за 28 дней => 2/28 = 0.0714 сек за сутки => 0.0714/0.0044 = 16.
Теперь, если записать "-16" в регистр "Aging Offset", часы должны соответствующим образом ускориться.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения