USART в 2560-Мега - как работает?

6 Янв 2020
122
-4
В книге Евстифеева прямого ответа на вопрос не нашёл.
1. Когда запущен и идёт процесс USART приёма большой последовательности байт (например, ДМХ-512) по RX0
процессор 2560 Мега занят только этим (пока не закончится приём), или может в это время выполнять другую (основную ) программу?
2. все принятые байты складываются в какой-то массив автоматически?
3. Где указавается размер массива? или конец массива тоже определяется автоматически?
4. Если процессор может в это время выполнять другую программу, может ли он в её процессе считывать некоторые байты из принимаемого массива?
5. Если процессор может в это время выполнять другую программу, в которой используются внешние аппаратные прерывания INT, будет ли это мешать приёму пакета по п.1?
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
324
101
@avan,
Прием байта не занимает процессорное время, и не зависит от занятости процессора. Но принятый байт процессор по прерыванию должен положить в буфер приема ранше чем закончится прием следующего байта. Т.е если прерывания будут запрещены дольше, чем время приема байта, то возможна потеря байта. Размер буфера по умолчанию в UNO 64 бйта. Наверно и в 2560 столько. Надо или смотреть в исходниках, или проверить - послать с ПК много байт, и потом проверить, сколько лежит в буфере Serial.available().
 
  • Лойс +1
Реакции: avan

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,281
947
58
Марий-Эл
@avan, Есть ещё программный буфер.
И как работать с UART, я уже отвечал в другой ветке.
Если хочется работать с периферией правильно, уходите от ядер написанных под ArduinoIDE.
Да это затратно в смысле знаний, но это более правильно.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
1. Хочешь,можешь тупо ждать каждый байт,можешь обращаться по мере приёма каждого байта через прерывания
2. Это программист решает что делать с каждым очередным байтом,хоть на Луну пересылать.
3. Нигде. Программист определяет конец передачи.
4. Может и байты считывать и "спать",опять же программист решает.
5. Если ЦП не "затупит" к следующему байту,то можно.

USART это аппаратный блок. Он оперирует одним байтом. Решать тебе складывать их в массив,считать и манипулировать ими как вздумается.
Аппаратно 2 регистра: в один складываются/берутся биты при приёме/передаче,а в другой помещается/извлекается готовый байт. Только он программно доступен.
 
  • Лойс +1
Реакции: avan

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
@avan,не соглашусь) дело в том,что существует куча протоколов последовательной передачи,ни один разработчик не сможет учесть все варианты аппаратно.
Вы ведь не жалуетесь на кирпичный завод потому что он продает кучу кирпича вместо дома?)
 
6 Янв 2020
122
-4
Избыточное цитирование. Отредактируй или сообщение будет удалено
@avan,не соглашусь) ...,ни один разработчик не сможет учесть все варианты аппаратно.
Вы ведь не жалуетесь на кирпичный завод потому что он продает кучу кирпича вместо дома?)
Если кирпичный завод продаёт кирпичи - чего на него жаловаться? Всё честно.
А вот если Домостроительный комбинат под именем "конструкции для строительства дома" продаёт кирпичи - это уже непорядок.
Или вместо комплекта деталей "Деревянный дом" продаёт просто 10 кубов необработанных брёвен.

Практического смысла в том, чтобы городить аппарат для приёма одного байта, немного.
Время при приёме пачки не выигрывается.
просто вместо десяти команд пишешь четыре, и всё. овчинка выделки не стоит.
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,834
589
44
Практического смысла в том, чтобы городить аппарат для приёма одного байта, немного.
Ооочень ошибаетесь.
На частоте 16 МГц если программно ожидать прием одного байта на скорости 115200 бод, то процессор затратит около 1.4 тыс. тактов. Если использовать аппаратный блок, то он не затратит ничего. По завершению приема сработает прерывание, сложите принятый байт в буффер и это все затраты.
 
6 Янв 2020
122
-4
Ну, не совсем. Просто этот "грузовик" без автопилота и грузчики не прилагаются. :) :LOL:
этот грузовик как раз с автопилотом, но без кузова


то процессор затратит около 1.4 тыс. тактов.
то есть Вы утверждаете, что пока идёт приём одного байта, процессор сможет выполнить что-то осмысленное?
например, принять прерывание ИНТ от датчика двигателя, сделать десяток операций и выйти из прерывания?
Скорость должна быть 250 кбод - это стандарт для создаваемого устройства.
Если даже он обработает один двигатель, и только начнёт обрабатывать второй - вот тут и вис, т.к. нужно следующий байт принимать...
Чтобы такого не произошло, нужно придумывать какие-то таймеры-ограничители...
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,834
589
44
принять прерывание ИНТ от датчика двигателя, сделать десяток операций и выйти из прерывания?
Вход и выход из прерывания 24 такта (12 вход, 12 выход). Одна команда у атмеги 1-5 тактов, возьмем 2 такта на самые распространенные, по 3-4 команды на операцию - 70 тактов на десяток операций. Ну, возьмем 100 тактов на простое прерывание. Т.е. как минимум с десяток прерываний успеет сделать за прием одного байта.
Конечно, это при условии написания адекватного кода, без бессмысленных раздуваний кода в прерываниях.
 
6 Янв 2020
122
-4
@Геннадий П,
будем пробовать,
шикарно, если так будет получаться. я считал, что байт принимается минимум на порядок быстрее.
Тут есть ещё другой момент. Прием каждого БИТа производится по трём выборкам, потом мажоритарное голосование.
По трём выборкам - это значит крайне низкая помехооустойчивость, а она в данном случае важна.
Если за время приёма бита такая туча тактов процессора, можно ли как-то увеличить количество выборок?
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,281
947
58
Марий-Эл
Если за время приёма бита такая туча тактов процессора, можно ли как-то увеличить количество выборок?
Нужно не выборки городить, а интерфейс нормальный делать. Если у Вас DMX-512, то он по умолчанию подразумевает токовую петлю. А это нехилая защита.
 

poty

★★★★★★✩
19 Фев 2020
2,990
895
@avan, это уже не UART.
А по поводу всего остального: прежде, чем обвинять производителей стоит хотя бы узнать побольше, а то куча обвинений, сравнений и прочего, а по факту - обида за то, что приобрел не то.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,834
589
44
Прием каждого БИТа производится по трём выборкам, потом мажоритарное голосование.
Нет там никакого мажоритарного голосования. Есть стандарты уровней, есть стандарты таймингов для протокола.

По трём выборкам - это значит крайне низкая помехооустойчивость, а она в данном случае важна.
UART - это скажем так локальный интерфейс, он не предназначен для помехозащищенной передачи данных.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,281
947
58
Марий-Эл
Нет там никакого мажоритарного голосования
У STM можно выбрать по двум выборкам работать или по трём, но не на всех кристаллах.
UART - это скажем так локальный интерфейс, он не предназначен для помехозащищенной передачи данных.
Прикручиваешь к нему физический интерфейс, допустим RS422, RS485. И получаешь помехозащищённый канал на большие расстояния.
 
6 Янв 2020
122
-4
Нужно не выборки городить, а интерфейс нормальный делать. Если у Вас DMX-512, то он по умолчанию подразумевает токовую петлю. А это нехилая защита.
оно-то конешна, токовая петля это класс..
Если делать ВСЮ систему с нуля.
Но когда, кроме разрабатываемого устройства, УЖЕ есть масса покупных устройств разных производителей на одной линии ДМХ -
тут нужно не права качать, мол всё гамно, всё выкинуть и сделать токовую петлю, а встраиваться в то, что есть. И защищаться от помех и прочих плохих явлений , типа стоячих и блуждающих волн. (только не надо про терминатор!!!),

С чего Вы взяли, что ДМХ "по умолчанию подразумевает токовую петлю" ????м может, у какого-то отдельного производителя - и да, но тогда все приборы должны быть только его. В том числе и те, которые ему и в голову не пришли, а нужны.

@avan,Ок))) А изготовитель - "кирпичный завод", не может знать и угадать больное воображение нас,электронщиков и программистов)))
Сравнение образное, но слишком отдалённое.
Это в легковой машине тому, кто возит только свою ж., багажник не нужен.
А в грузовой - кузов обязателен. Она ради этого сделана.
Когда делается аппаратный приемопередатчик РАДИ ПЕРЕДАЧИ ОДНОГО БАЙТА - - это и есть больное воображение разработчика-схемотехника.
Если делается аппаратный приемопередатчик - то однозначно для передачи серий байтов. Дальше можно спорить - делать ли кузов на 1 куб.м, или на 5, или на 10, но то, что не на 1 литр - это точно.
Когда в микросхеме миллионы транзисторов, сделать буфер на 1024 или 512, ну, пусть ладно - 256 байт - не ахти какая сложность.
Даже хотя бы и на 16 - и то было бы дело...

Прикручиваешь к нему физический интерфейс, допустим RS422, RS485. И получаешь помехозащищённый канал на большие расстояния.
У автора уже есть DMX512.
Конечно есть. Конечно, я не цепляю к ножкам процессора провода по 500 метров. И 5 метров тоже не цепляю.
Однако вопрос был о помехоустойчивости. Не в теории по книжкам, а на практике в машинном зале.
И на практике, покупные устройства с ДМХ-512, и, конечно, с РС485, всего лишь на 100-метровой линии устроили такой тарарам, что хватило всем.

У STM можно выбрать по двум выборкам работать или по трём, но не на всех кристаллах.
В Атмеге 2560 считывание по трём выборкам, но хотелось бы больше. существенно больше.


Нет там никакого мажоритарного голосования
Может, и нет.
Только в анг.талмуде по Атмелу 2560 написано, что есть.

22.8.2 Asynchronous Data Recovery
When the receiver clock is synchronized to the start bit, the data recovery can begin. The data recovery unit uses a
state machine that has 16 states for each bit in Normal mode and eight states for each bit in Double Speed mode.
Figure 22-6 shows the sampling of the data bits and the parity bit. Each of the samples is given a number that is
equal to the state of the recovery unit.
Figure 22-6. Sampling of Data and Parity Bit
The decision of the logic level of the received bit is taken by doing a majority voting of the logic value to the three
samples in the center of the received bit. The center samples are emphasized on the figure by having the sample
number inside boxes. The majority voting process is done as follows: If two or all three samples have high levels,
the received bit is registered to be a logic 1. If two or all three samples have low levels, the received bit is registered
to be a logic 0.
This majority voting process acts as a low pass filter for the incoming signal on the RxDn pin.
The recovery process is then repeated until a complete frame is received. Including the first stop bit. Note that the
Receiver only uses the first stop bit of a frame.

Врут, наверное... :) чисто для понтов... но я пока верю.


А по поводу всего остального: прежде, чем обвинять производителей стоит хотя бы узнать побольше, а то куча обвинений, сравнений и прочего, а по факту - обида за то, что приобрел не то.
чего-чего. а обиды нет никакой. Обида - это детское, и, главное, непродуктивное чувство. опять же нет объекта - на кого обижаться?

А вот насчёт "приобрёл не то" - я чем дальше я изучаю тему и чем больше узнаю - тем меньше думаю, что "не то".
Конечно, есть процессоры покруче, и намного, но я пока надеюсь, что и на этом всё получится.
 
Изменено:

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,281
947
58
Марий-Эл
С чего Вы взяли, что ДМХ "по умолчанию подразумевает токовую петлю" ????
По стандарту положено.
Точнее не токовая, а синфазный сигнал. А так как ток бегает туды сюды, практически токовая.

И вообще у вас довольно сильная каша в накупленных комплектующих без реально проработанного плана.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
Когда в микросхеме миллионы транзисторов, сделать буфер на 1024 или 512, ну, пусть ладно - 256 байт - не ахти какая сложность.
А я захотел принимать в режиме 9 бит. Как это предусмотреть железом? Выделять по два байта в памяти под массив приёма?
По аналогии с грузовиком. Кузов тоже предназначен для узких задач. Песок или щебень одно,камни весом по паре тонн другое,бензин,молоко,кислота. А ещё существует ГАЗель и каръерный БелАЗ с кузовом на 170 тонн. Вам какой? И мне сложно представить универсальный грузовик.
А вот тягач это да. Но он бесполезен без прицепа,как и любые узлы МК без человека.

Вы не совсем понимаете суть. Взять интернет. Это несколько уровней протоколов начиная от логических сигналов в проводе или эфире до фильма или музыки на компьютере. И каждому нижестоящему уровню фиолетово что происходит на вышестоящем. Модуль UART предоставляет только железный уровень нулей и единиц по сути. Ему не важно что принимает: числа,текст или другое,неважен размер передачи. А касаемо AVR,так этот модуль может работать ещё и как таймер-счетчик и даже ШИМ с разрядностью 4 или 8 бит(не помню). Я тоже считаю это извращением,тем не менее,не существует модуля,который всё "делает сам".
 
6 Янв 2020
122
-4
По стандарту положено
Положено было, что с 1980 года у нас наступит коммунизм. Вместо этого....


Точнее не токовая, а синфазный сигнал.
Если посмотреть осциллографом, то противофазный, относительно нулевого провода.
Вообще-то - токовая петля - это совершенно конкретная схема, с транзистором на передатчике и включённым в его коллектор светодиодом оптрона в приёмнике.
Сейчас производителей устройств ДМХ много, и каждый умней другого, все фигачат на импортных микросхемах.
Причем внутренней ПРИНЦИПИАЛЬНОЙ схемы микросхемы мах485 НЕТ даже в её "даташите" - только условная, из чего непонятно, куда они цепляют нулевой провод линии связи


А я захотел принимать в режиме 9 бит.
Нет проблем. Железом это предусмотрено. Нужно заранее поставить нужный бит в нужный регистр, (см. "даташит"), и будет Вам счастье.
Можно принимать и не только 8-битный байт, а и 7,6,5-битный, это тоже устанавливается в настройках ЮЗАРТА.

Точно также можно было предусмотреть количество принимаемых байт в пачке, чтобы пользователь (программист) записывал это число в отдельный специальный регистр. И автомат потом принимал бы это количество байт, складывал в многобайтовый буфер (массив) и после этого вывешивал прерывание.
Это было бы естественно и неизмеримо полезнее.
А так всё это (приём по одному байту) ещё как-то может иметь смысл на малых скоростях передачи, но это, я считаю, недоделанное решение.
Это как тягач без фаркопа, раз тут уж автомобилисты собрались... :)
 
Изменено:

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
@avan,
И автомат потом принимал бы это количество байт,
И чем вам функция собственноручно созданная не автомат?
Ежели ну прям аппаратного функционала надо,ок! Для этого придумали ПЛИС. Опять же ручками надо настроить,ручками)
Наш диалог напомнил мне тут тему одну в разделе КУНСТКАМЕРА. Там человечик негодовал не найдя на Ардуино Уно пина для форсажа(видимо джойстик делал).
Если бы нужно было всё готовое,не было б ни МК,ни кирпичей,ни конструктора лего.
 
6 Янв 2020
122
-4
@avan,

И чем вам функция собственноручно созданная не автомат?
Вы так ничего и не поняли.
Любая написанная (неважно каким местом) функция занимает процессор, его время.
А автомат - нет, пока не закончит своё автоматическое действие.
А пока юзарт принимал бы АВТОМАТИЧЕСКИ свои 256 байт (да хоть бы и 16) - процессор успеет сделать что-то осмысленное и существенное даже при большой скорости приёма.