Обсуждаем контроллеры компании Atmel.
Ответить

Re: Секундомер на Nrf24l01+

Пн сен 05, 2022 22:38:20

Конечно лучше писать без библиотек. Подумаю над тем чтобы всё переписать) :write: :beer:

Замечательная идея))
А главное что и писать ничего не надо... Всё уже давно написано (см. выше). И без глюков.

Re: Секундомер на Nrf24l01+

Пт сен 16, 2022 23:59:46

Писал сообщение минут 30-40, отправил. А радио-кот решил что меня нужно разлогинить.. ‍♂️

Добавлено after 5 minutes 24 seconds:
В общем сделал синхронизацию времени между блоками.
Время считаю по прерыванию таймера с частотой 1000Гц инкрементирую глобальную переменную.

Сделал тестовый режим который стартует и финиширует автоматически через заданные интервалы времени. Результат всегда один и тот же.

Но по прошествии получаса заметно что по факту между стартом и финишем много меньше времени чем эталонное время тестового режима.

При ручном запуске секундомера, при одновременном нажатии на старт и финиш время фиксируется сильно больше чем реальный результат. При одновременном нажатии результат доходит до 1.5 секунд. Хотя тестовый режим показывает верное время..

Радиокот всю охоту отбил что-либо подробно расписывать.. :(
В общем кому интересно пообщаться - го в телеграм (@stkudryashov)

Re: Секундомер на Nrf24l01+

Сб сен 17, 2022 10:50:36

bootooz писал(а):При одновременном нажатии результат доходит до 1.5 секунд.

Какие нафиг 1.5 секунд...
:facepalm:
Nrf24l01+ передаёт пакет максимум 1.5 миллисекунды... Поэтому точность не может быть хуже 1.5 миллисекунды.
Выше код кидал.
:tea:
У меня нет телеграм.

Re: Секундомер на Nrf24l01+

Сб сен 17, 2022 10:51:42

А насколько точно само время отсчитывается? Могут быть пропуски прерываний или не точный осцилл тор или дедьтель таймера.
К тому же, если вы каждую миллисекунд передаёт по радиоканалу, то в зависимости от количества передаваемых байт и скорости SPI и скорости по радиоэфиру, может банально не хватать времени между посылками. Учитывая обычно низкую производительность кода под АВРку, этот вариант вполне реален.
Я бы вообще отключил подтверждение передачи/приёма, поскольку оно сильно много времени тратит на внутреннее переключение приема/передачи.

Процедура передачи PTX выглядит так:
- опустить csn и отправить команду W_TX_PAYLOAD и принять ответный байт по SPI, это будет содержимое регистрпа STATUS.
- в принятом байте проверить бит 0 (TX_FIFO_full flag)
- если этот бит = 0, можно приступить к загрузке байтов отправляемые данныхпосле загрузки поднять CSN. Если бит = 1, закрыть текущую операцию переводом CSN в высокий уровень и затем перевести в низкий и передать команду FLUSH_TX и снова закрыть CSN. Затем повторить все сначала.
- сформировать импульс CE длительностью не менее 10 мск.
CE можно держать в высоком уровне постоянно, тогда передача новой посылки начнётся сразу после загрузки пакета в TX FIFO и поднятия CSN. Этим можно сэкономить немного времени.
- Ожидать сигнала на выводе INT (переход в низкий уровень)
По получению этого сигнала отправить команду W_REGISTER с номеном регистра STATUS. Принять по SPI байт ответа.
- в этом байте прочитать биты TX_DS и MAX_RT и отправить байт с 1 в этих битах для сброса прерывания INT.

Фууух, писал с мобилы, неудобно. А ещё про приём на приемнике надо написать

Re: Секундомер на Nrf24l01+

Сб сен 24, 2022 01:30:54

В общем спасибо всем за помощь! Неточность времени я победил.
Проблема была в расхождении времени между 2мя микроконтроллерами т.к синхронизацию я делал один раз при старте. Теперь 3 раза в секунду синхронизирую. Теперь всё довольно точно.

Прикрепил фото устройства кому интересно)
Вложения
210CF1EC-2B13-4B97-AF18-AE0B07DC2077.jpeg
Слева направо, финиш, старт, табло.
(144.61 KiB) Скачиваний: 48
Ответить