Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Martian »

Darkmaster писал(а):как записать в порт, в младшие байты, не изменив старших.

Код: Выделить всё

tempo = (PORT & 0xF0) | (X & 0x0F); // X - младшие байты
PORT = tempo;
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Вопросы по С/С++ (СИ)

Сообщение azhel12 »

Но надо обязательно отметить, что такая операция неатомарна и если где-то ещё в коде изменяется порт, то рано или поздно, по закону Мёрфи, это случится именно между чтением и записью. Собственно, поэтому во многих архитектурах есть спецрегистры для записи/сброса битов. BSRR, например, на stm32. И если целевая платформа такую фичу поддерживает, следует использовать её.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Martian »

Да, верно.
Darkmaster
Встал на лапы
Сообщения: 137
Зарегистрирован: Вс окт 11, 2009 09:54:59
Откуда: Пенза

Re: Вопросы по С/С++ (СИ)

Сообщение Darkmaster »

Martian, azhel12, спасибо за подсказки.
оказывается недоглядел я чуток :)
Интересная,однако,штука
veso74
Поставщик валерьянки для Кота
Сообщения: 1903
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение veso74 »

Есть более короткая версия данных анализа GPS из UBX-G6010? Пока декодирую только данные для часов (со множеством проверок), но хотелось бы, чтобы с более короткими выражениями.

Вадиант $GPGGA:

Код: Выделить всё

$GPGGA,083836.00,8888.88888,N,88888.88888,E,1,04,4.25,45.7,M,34.7,M,,*62
И какого размера должен быть буфер? Ставлю 500 для теста ( вх. UART 9600, новые данные загружаются каждые 1 секунду).
(Для всей успешно перехваченной посылки ($GPGGA, $GPGSA, $GPGSV, $GPGLL, $GPRMC ...) мне кажется это мало).
safocl
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пн мар 18, 2024 22:04:17

Re: Вопросы по С/С++ (СИ)

Сообщение safocl »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4588505#p4588505"]Третьим аргументом функции GPIO_WriteBit() будет значение выражения

Код: Выделить всё

(i == 0) ? (i = Bit_SET) : (i = Bit_RESET)
которое при каждом вызове будет менять своё значение с Bit_SET на Bit_RESET и наоборот.[/uquote] -- без учёта внешнего кода сложно сказать, что будет там происходить -- поскольку i может меняться где то еще -- а так же надо понимать, что собой представляют Bit_SET и Bit_RESET -- поскольку если ни один из них не равен нулю -- всегда будет ложь.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

safocl, прошло всего-то пол года. :) Не усложняйте, там всё именно так как описано. Придумывать варианты когда не будет работать смысла нет, ибо код пишут чтобы он работал.
safocl
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пн мар 18, 2024 22:04:17

Re: Вопросы по С/С++ (СИ)

Сообщение safocl »

VladislavS, звучит из разряда "делать надо правильно, а неправильно не делать..." -- всегда поддерживал такие направления деятельности.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

Код: Выделить всё

   //если время 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 обнуляется отсюда корректировка времени не получается...
в еепром запоминать нехочется, а как еще можно коректировать не завися от электричества.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Но ведь у DS3231 есть встроенная коррекция. Почему бы не использовать её?

P.S. Я имею в виду регистр 10h (Aging offset), записывая в который число от -128 до 127, можно влиять на используемую в DS3231 температурную компенсацию.

P.P.S. https://radiokot.ru/forum/viewtopic.php ... 7#p4277377
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

спасибо, не зал, я подумаю... почитаю
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение OKF »

Человек делает коррекцию через приложение https://github.com/SergejBre/SynchroTime/
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

да я нашел это https://github.com/SergejBre/SynchroTim ... TC_alt.ino
почитал, но чета это для меня сложно

Добавлено 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);
СпойлерИзображение
Вложения
synchro_RTC_MINI.rar
(4.8 КБ) 85 скачиваний
Аватара пользователя
Starichok51
Модератор
Сообщения: 19040
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение Starichok51 »

Serzh2000 писал(а):в регистр 10h Aging offset записалось число и дальше не парится
не париться, пока на 3231 есть питание.
исчезнет питание - все регистры сбросятся.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

ds 3231 при пропадании внешнего питания,
питается от резервного (батарейка)

Добавлено after 12 minutes 16 seconds:
попробую сформулировать вопрос
я не пойму : узнав это число после 2-3 дней и записав его в регистрах Alarm1 (DS3231)
при пропадании света в void setup () снова запишу в регистр 10h Aging offset и больше в коде ничего не нужно делать все с корректируется?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Если резервная батарейка стоит, то ничего больше делать не надо. Один раз записать - и всё.

А эта программка всего лишь позволяет за пару-тройку дней без лишних телодвижений выяснить, какое именно число для данного конкретного случая нужно. Но ничто не мешает и самому эту поправку вычислить. Скажем, сегодня выставить в 0, а через 10 дней непрерывной работы часов посмотреть, на сколько секунд ушло и посчитать необходимое значение.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

А эта программка всего лишь позволяет за пару-тройку дней без лишних телодвижений выяснить
какая-то хрень, у меня Windows 10 64-bit и постоянно обрывается связь. ( пишут только с Linux нет проблем)...
Но ничто не мешает и самому эту поправку вычислить. Скажем, сегодня выставить в 0, а через 10 дней непрерывной работы часов посмотреть, на сколько секунд ушло и посчитать необходимое значение.
пожалуйста чуть чуть по подробнее :shock: что выставить и чего посмотреть ( прошу прощения для ВАС белый день для меня темный лес) :oops:
Аватара пользователя
Starichok51
Модератор
Сообщения: 19040
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение Starichok51 »

Serzh2000, а ты никогда не задумывался, что может пропасть не только внешнее питание, но и питание от батарейки?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

тык думал поэтому писал выше
в void setup () снова запишу в регистр 10h Aging offset
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

[uquote="Serzh2000",url="/forum/viewtopic.php?p=4668962#p4668962"]пожалуйста чуть чуть по подробнее :shock: что выставить и чего посмотреть ( прошу прощения для ВАС белый день для меня темный лес) :oops:[/uquote]
Выставляете значение коррекции 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", часы должны соответствующим образом ускориться.
Ответить

Вернуться в «Разные вопросы по МК»