Перейти к содержанию
    

Связь двух устройств с uart. Между ними arduino

Здравствуйте.

Подскажите, пожалуйста:

 

Имеются 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);
}

 

 

Спасибо!

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Брать состояние ножки и транслировать его на другую - плохая идея для UART даже на малых скоростях.
Делайте нормальное соединение по аппаратному UART. Иначе так и будете ловить глюки на ровном месте.
Или поставьте аналоговый мультиплексор (да хоть цифровой) и после настройки соедините девайсы вместе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, skilful сказал:

Программный вроде глючно работает на 115200.

ррррр! На такие скорости и программный uart... не стоит. Если есть свободный SPI и хотя бы одна ножка MOSI, сделайте на нём usart. Правда не уверен, что вам МК позволит подобрать делитель для скорости 115200. Но если может, то делаете фрейм 10 бит. По краям всегда нулевые биты (стартовый и стоповый). В середину аккурат вставляете байт из восьми битов. Должно работать. Это, естественно, для самых полпулярных настроект порта 115200 8N1.

1 час назад, skilful сказал:

Получается arduino просто как "повторитель" будет работать. 

Тогда как он будет настраиваеть устройства?

Ну или сделайте матрицу на мультиплексорах: к единственному аппаратному последовательному порту ардуинки вы можете подключить любой порт от устройства, а затем соединить их кроссом между собой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:

Брать состояние ножки и транслировать его на другую - плохая идея для UART даже на малых скоростях.
Делайте нормальное соединение по аппаратному UART. Иначе так и будете ловить глюки на ровном месте.
Или поставьте аналоговый мультиплексор (да хоть цифровой) и после настройки соедините девайсы вместе.

 

Так я просто пока не пойму почему плохая идея.

За 1/115200 секунды на частоте 16 МГц у меня имеется более 100 тактов для считывания и трансляции на другую ножку.

Объясните, пожалуйста.

 

Если мне память не изменяет uart тоже должен каждый бит многократно прочитать для получения его точного значения

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, skilful сказал:

За 1/115200 секунды на частоте 16 МГц у меня имеется более 100 тактов для считывания и трансляции на другую ножку.

Объясните, пожалуйста.

1. Хотя-бы потому, что UART на 115200 бод работает на тактовой в 16 раз выше (читайте что такое оверсэмплинг в UART). Иногда бывает опция - оверсэмплинг==8, но не у всех.

2. Когда вы будете "читать и транслировать", у вас не будет например прерываний? Или всё-таки будут? Подумайте что будет при этом.

2 часа назад, skilful сказал:

Если мне память не изменяет uart тоже должен каждый бит многократно прочитать для получения его точного значения

Вот именно. Это называется оверсэмплинг. Теперь читайте как он работает.

 

PS: Надо слезть с иглы абдурины и поставить любой МК с 2-я UART-ами. И всех делов. :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, skilful сказал:

Объясните, пожалуйста.

UART боится девиации частот и рассогласование ее между передатчиком и приемником хотя бы на >4% уже обязательно скажется на результате.
Костылем в виде копирования пина на другой вывод (программно) можно обеспечить только лишь невнятный джиттер и как следствие потерю символа.
А джиттер обеспечен хотя бы потому, что любое прерывание растянет момент от считывания пина до выдачи на другую ножку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, skilful said:

мне рекомендовали Arduino с двумя uart. Но пока не получается его поменять

Стоит постараться, что бы получилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, MrBearManul сказал:

MOSI, сделайте на нём usart.

Простите, погорячился. Забыл, что нужен и приём. Сам сейчас подобной задачей занят. На микроконтроллере нет второго последовательно порта. Сменить его возможности тоже нет. Но порт нужен только на передачу. Вот машинально вас и дизинформировал)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, skilful сказал:

Так я просто пока не пойму почему плохая идея.

За 1/115200 секунды на частоте 16 МГц у меня имеется более 100 тактов для считывания и трансляции на другую ножку.

Объясните, пожалуйста.

А вы посмотрите, во что выливается ваши digital_read() и digital_write(). Насколько я помню - там наворочено столько, что даже 100 тактов не хватит для одной пары, а у вас их две да еще и прерывания.

Если очень хочется оставить ардуину - можно поставить две ардуины УАППами наружу, а между собой связать их по SPI или параллельной шиной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так нет у меня прерываний.

 

Просто коммутация (пересылка) между двумя ножками в бесконечном цикле через digitalRead, digitalWrite.

Uart на Ардуино я отключаю.
 

 

Сейчас я пробую так:

Компьютер <-> USB-UART переходник <-> Ардуино с кодом, указанным выше <-> Устройством с UART

 

И пока не получается пообщаться с устройством с UART с компьютера.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Период выполнения указанного цикла около 15мкс. Т.е. примерно в 20 раз медленней, чем нужно для транзита 115200 таким способом.

Все равно "странно и не понятно"?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может, проще будет как-то обрисовать здесь более детально Вашу конструкцию?
Авось ардуину можно будет выкинуть и связать девайсы между собой без всяких посредников.
Сейчас же пока что из всего описания я понял, что для железки был выбран дендро-фекальный способ конструирования:wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, skilful сказал:

так нет у меня прерываний.

У вас нет. А у ардуины есть. Если я опять ничего не путаю - ардуиновская библиотека настраивает таймер 0 и использует его прерывания для каких-то внутренних целей, того же программного УАПП.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как вы "засекли" время исполнения цикла.

Я раньше в avr studio высчитывал в отладчике. А теперь скачал arduino ide и только через засекание функцией micros() думаю можно узнать.

Или портировать код в atmel studio надо.

 

Не знал, что digital()...такие прожорливые да и много в ардуине кажется где-то запрятанным/скрытым ))

Взял ее потому, что это дешево и доступно и надеялся быстро протестировать можно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...