skilful 0 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба Здравствуйте. Подскажите, пожалуйста: Имеются 2 устройства с uart. "Между ними" стоит ардуино. Выглядит примерно так: устройство №1 с uart <-----> arduino <-----> устройство №2 с uart Ардуино служит для настройки этих устройств. Скорость 115200. У Ардуино только 1 аппаратный uart. Программный вроде глючно работает на 115200. Я некоторое время назад поднимал уже похожую тему, мне рекомендовали Arduino с двумя uart. Но пока не получается его поменять. Однако: Могу ли я сделать так, чтобы устройства общались между собой без применения uart ов у arduino ? То есть просто пересылать данные с uart этих двух устройств, используя метод прочитал состояние ножки и повторил его на другой ножке? Получается arduino просто как "повторитель" будет работать. Вот код маленький; только я пытаюсь его применить -- пока, что вижу, что какой-то мусор ходит между устройствами. Где мог ошибиться пока не пойму pinMode(rxPin1, INPUT); //к устройству №1 pinMode(txPin1, OUTPUT); pinMode(rxPin2, INPUT); //к устройству №2 pinMode(txPin2, OUTPUT); void loop (void) { //коммутируем ножки между собой int rxPin2_state = digitalRead(rxPin2); digitalWrite(txPin1, rxPin2_state); int rxPin1_state = digitalRead(rxPin1); digitalWrite(txPin2, rxPin1_state); } Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба Брать состояние ножки и транслировать его на другую - плохая идея для UART даже на малых скоростях. Делайте нормальное соединение по аппаратному UART. Иначе так и будете ловить глюки на ровном месте. Или поставьте аналоговый мультиплексор (да хоть цифровой) и после настройки соедините девайсы вместе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба 1 час назад, skilful сказал: Программный вроде глючно работает на 115200. ррррр! На такие скорости и программный uart... не стоит. Если есть свободный SPI и хотя бы одна ножка MOSI, сделайте на нём usart. Правда не уверен, что вам МК позволит подобрать делитель для скорости 115200. Но если может, то делаете фрейм 10 бит. По краям всегда нулевые биты (стартовый и стоповый). В середину аккурат вставляете байт из восьми битов. Должно работать. Это, естественно, для самых полпулярных настроект порта 115200 8N1. 1 час назад, skilful сказал: Получается arduino просто как "повторитель" будет работать. Тогда как он будет настраиваеть устройства? Ну или сделайте матрицу на мультиплексорах: к единственному аппаратному последовательному порту ардуинки вы можете подключить любой порт от устройства, а затем соединить их кроссом между собой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба Выглядит как будто ардуино лишнее звено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skilful 0 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба 1 hour ago, Arlleex said: Брать состояние ножки и транслировать его на другую - плохая идея для UART даже на малых скоростях. Делайте нормальное соединение по аппаратному UART. Иначе так и будете ловить глюки на ровном месте. Или поставьте аналоговый мультиплексор (да хоть цифровой) и после настройки соедините девайсы вместе. Так я просто пока не пойму почему плохая идея. За 1/115200 секунды на частоте 16 МГц у меня имеется более 100 тактов для считывания и трансляции на другую ножку. Объясните, пожалуйста. Если мне память не изменяет uart тоже должен каждый бит многократно прочитать для получения его точного значения Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба 2 часа назад, skilful сказал: За 1/115200 секунды на частоте 16 МГц у меня имеется более 100 тактов для считывания и трансляции на другую ножку. Объясните, пожалуйста. 1. Хотя-бы потому, что UART на 115200 бод работает на тактовой в 16 раз выше (читайте что такое оверсэмплинг в UART). Иногда бывает опция - оверсэмплинг==8, но не у всех. 2. Когда вы будете "читать и транслировать", у вас не будет например прерываний? Или всё-таки будут? Подумайте что будет при этом. 2 часа назад, skilful сказал: Если мне память не изменяет uart тоже должен каждый бит многократно прочитать для получения его точного значения Вот именно. Это называется оверсэмплинг. Теперь читайте как он работает. PS: Надо слезть с иглы абдурины и поставить любой МК с 2-я UART-ами. И всех делов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба 2 часа назад, skilful сказал: Объясните, пожалуйста. UART боится девиации частот и рассогласование ее между передатчиком и приемником хотя бы на >4% уже обязательно скажется на результате. Костылем в виде копирования пина на другой вывод (программно) можно обеспечить только лишь невнятный джиттер и как следствие потерю символа. А джиттер обеспечен хотя бы потому, что любое прерывание растянет момент от считывания пина до выдачи на другую ножку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex-lab 5 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба 4 hours ago, skilful said: мне рекомендовали Arduino с двумя uart. Но пока не получается его поменять Стоит постараться, что бы получилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба 4 часа назад, MrBearManul сказал: MOSI, сделайте на нём usart. Простите, погорячился. Забыл, что нужен и приём. Сам сейчас подобной задачей занят. На микроконтроллере нет второго последовательно порта. Сменить его возможности тоже нет. Но порт нужен только на передачу. Вот машинально вас и дизинформировал) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба 4 часа назад, skilful сказал: Так я просто пока не пойму почему плохая идея. За 1/115200 секунды на частоте 16 МГц у меня имеется более 100 тактов для считывания и трансляции на другую ножку. Объясните, пожалуйста. А вы посмотрите, во что выливается ваши digital_read() и digital_write(). Насколько я помню - там наворочено столько, что даже 100 тактов не хватит для одной пары, а у вас их две да еще и прерывания. Если очень хочется оставить ардуину - можно поставить две ардуины УАППами наружу, а между собой связать их по SPI или параллельной шиной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skilful 0 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба так нет у меня прерываний. Просто коммутация (пересылка) между двумя ножками в бесконечном цикле через digitalRead, digitalWrite. Uart на Ардуино я отключаю. Сейчас я пробую так: Компьютер <-> USB-UART переходник <-> Ардуино с кодом, указанным выше <-> Устройством с UART И пока не получается пообщаться с устройством с UART с компьютера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neon416 0 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба Период выполнения указанного цикла около 15мкс. Т.е. примерно в 20 раз медленней, чем нужно для транзита 115200 таким способом. Все равно "странно и не понятно"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба Может, проще будет как-то обрисовать здесь более детально Вашу конструкцию? Авось ардуину можно будет выкинуть и связать девайсы между собой без всяких посредников. Сейчас же пока что из всего описания я понял, что для железки был выбран дендро-фекальный способ конструирования Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба 2 часа назад, skilful сказал: так нет у меня прерываний. У вас нет. А у ардуины есть. Если я опять ничего не путаю - ардуиновская библиотека настраивает таймер 0 и использует его прерывания для каких-то внутренних целей, того же программного УАПП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skilful 0 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба как вы "засекли" время исполнения цикла. Я раньше в avr studio высчитывал в отладчике. А теперь скачал arduino ide и только через засекание функцией micros() думаю можно узнать. Или портировать код в atmel studio надо. Не знал, что digital()...такие прожорливые да и много в ардуине кажется где-то запрятанным/скрытым )) Взял ее потому, что это дешево и доступно и надеялся быстро протестировать можно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться