GyverBus на ATTINY 841

qwerty12345

✩✩✩✩✩✩✩
27 Сен 2024
3
0
Доброго времени суток.
Есть две платы с ATTINY 841 на борту (для удобства Master и Slave). У плат общее питание, земля и один сигнальный провод, по которому осуществляется коммуникация.
Проблема следующая. Не могу организовать двустороннее общение этих МК ни одним из возможный протоколов GyverBus.
Пробовал GBUSmini - GBUSmini и softUART - softUART.
Далее будет описание что делал/пробовал.

При помощи GBUSmini Master отправляет пачку данных Slave`у. Slave понимает что ему отправил Master. Аналогично если написать программу, где Slave отправляет данные Master`у. Если написать код так, чтобы Master отправлял пачку данных, а потом "слушал" что там ему ответят - сигнальная линия с 5В (порт приёма/отправки данных объявляется как INPUT_PULLUP), падает до 0В (смотрел осциллографом) с редкими импульсами менее 0,1 мкс (не совсем похоже на пачку данных). При попытке подтянуть резистором 10 кОм сигнальную линию к цепи питания редкие импульсы меняются на стандартную пачку данных, которую Slave не может "расшифровать". Причём если чередовать у Master`а запрос данных у Slave с периодической отправкой последнему пачки данных, которую ранее Slave понимал, то ничего не работает. Введение задержки между отправкой и приёмом данных не помогает.

softUART вообще не завёлся на ATTINY 841. Попробовал код из примера - на Mega заработал, а на тиньке - нет.

Ядро для тинек - ATTINYCore. Частота тактирования - внутренний 8 МГц Vcc > 4,5 В. Пробовал и с бутлоадером и без. Wire mode пробовал Master only и Both. Шью тиньки через мегу. В меге залит скетч Arduino as ISP.

Перечитал всё что нашёл с запуском GyverBus на всём, что не является стандартной ардуиной. Добавить отдельную сигнальную линию для отправки данных от Slave к Master нет возможности. Могу использовать только один сигнальный проводник. Может есть какой-нибудь другой протокол? Добавить модуль общения между тиньками тоже не могу. Платы критичны к габаритам. Максимум могу воткнуть по микросхеме SO-16 на каждую плату (без обвязки)
 

qwerty12345

✩✩✩✩✩✩✩
27 Сен 2024
3
0
Пока тема проверялась для публикации, разобрался в чём дело. Мне кажется в комбинации softUART и GBUS нужно указывать при инициализации не &UART, а &myUART: "GBUS bus(&myUART, 3, 20); // обработчик UART, адрес 3, буфер 20 байт"
И резистором подтягивать сигнальную линию к 5В. Удалось написать скетч для двусторонней передачи данных. Но изначальная логика работы так и не была реализована мною.

Поэтому вопрос теперь иной.
Как я понял bus.sendData(3, data) и bus.readData(data) готовят переменную data для отправки, кладя её в буфер, и тик уже отправляет. В самом тике есть какой-то флаг, который поднимается в read или send, иначе как тик определяет что сейчас нужно отправлять или читать данные.
Получается мне чтобы отправить данные "здесь и сейчас" нужно вызвать sendData и рядом вызвать тик, а чтобы прочитать данные - вызвать тик и рядом readData?
 

Bruzzer

★★★★✩✩✩
23 Май 2020
845
263
нужно вызвать sendData и рядом вызвать тик,
В общем случае Тик надо вызвать не рядом, а постоянно вызывать в цикле, с малыми задержками между вызовами.

Мое мнение, что при использовании "хитрых" протоколов надо САМОМУ досконально разобраться в их работе, особенностях и ограничениях.
Допустимость или удобство их использования очень сильно зависят от конкретного проекта, наличию требований к допустимым задержкам и т.д.
ATTINY 841 имеет ДВА встроенных UART. Если пинов хватает, то возможно будет полезно разобраться, как организовать прием передачу на встроенном UART по одному проводу (но используя два пина).
 

qwerty12345

✩✩✩✩✩✩✩
27 Сен 2024
3
0
@Bruzzer, Имеете ввиду мультиплексор/демультиплексор, который будет переключать RX и TX на сигнальную линию?
 

Bruzzer

★★★★✩✩✩
23 Май 2020
845
263
@qwerty12345,
Если быть оптимистом пофигистом, то можно просто соединить RX и TX. Если думать о защите от "а если вдруг...", то можно добавлять защиту, которая зависит от условий. В простейшем случае резистор 200 - 300 Ом на TX.
Я не говорю, что это оптимально для вашего случая, но разобраться по моему стоит. И наверняка варианты полудуплекса UART по одному проводу есть и в инете и скорее всего ИИ о нем знает.
 
Изменено: