[uquote="bootooz",url="/forum/viewtopic.php?p=4283642#p4283642"]Конечно лучше писать без библиотек. Подумаю над тем чтобы всё переписать) [/uquote]
Замечательная идея))
А главное что и писать ничего не надо... Всё уже давно написано (см. выше). И без глюков.
Писал сообщение минут 30-40, отправил. А радио-кот решил что меня нужно разлогинить..
Добавлено after 5 minutes 24 seconds:
В общем сделал синхронизацию времени между блоками.
Время считаю по прерыванию таймера с частотой 1000Гц инкрементирую глобальную переменную.
Сделал тестовый режим который стартует и финиширует автоматически через заданные интервалы времени. Результат всегда один и тот же.
Но по прошествии получаса заметно что по факту между стартом и финишем много меньше времени чем эталонное время тестового режима.
При ручном запуске секундомера, при одновременном нажатии на старт и финиш время фиксируется сильно больше чем реальный результат. При одновременном нажатии результат доходит до 1.5 секунд. Хотя тестовый режим показывает верное время..
Радиокот всю охоту отбил что-либо подробно расписывать..
В общем кому интересно пообщаться - го в телеграм (@stkudryashov)
bootooz писал(а):При одновременном нажатии результат доходит до 1.5 секунд.
Какие нафиг 1.5 секунд...
Nrf24l01+ передаёт пакет максимум 1.5 миллисекунды... Поэтому точность не может быть хуже 1.5 миллисекунды.
Выше код кидал.
У меня нет телеграм.
А насколько точно само время отсчитывается? Могут быть пропуски прерываний или не точный осцилл тор или дедьтель таймера.
К тому же, если вы каждую миллисекунд передаёт по радиоканалу, то в зависимости от количества передаваемых байт и скорости 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.
Фууух, писал с мобилы, неудобно. А ещё про приём на приемнике надо написать
В общем спасибо всем за помощь! Неточность времени я победил.
Проблема была в расхождении времени между 2мя микроконтроллерами т.к синхронизацию я делал один раз при старте. Теперь 3 раза в секунду синхронизирую. Теперь всё довольно точно.