09.07.2021, 18:23
|
|
Прописка
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
|
Re: ADUCM360 и RS485
optical illusion
"Мультипроцессорный режим", по-моему, не является синонимом 9-битного режима UARTа. Множество промышленных контроллеров общаются по шине RS485 с помощью протокола MODBUS в режиме 8 бит. Адресация информационного пакета к конкретному устройству выполняется на уровне протокола.
Последний раз редактировалось mike-y-k; 03.10.2022 в 11:21.
Причина: 7.15
|
|
|
|
09.07.2021, 18:55
|
|
Прописка
Регистрация: 17.08.2013
Сообщений: 287
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
j-Roger
В этом режиме есть специальный "флаг", когда этот флаг установлен МК ожидает передачу адреса. И когда приходит байт с признаком "адрес" - то происходит прерывание. В обычном режиме прерывание происходит только когда приходит байт, адреса нет совсем. Этот признак адреса передается 9 битом в "посылке". Поэтому и называют 9 битный режим. Передавать легко - можно запрограммировать бит четности, который идет сразу за 8 битом и все будет ОК. А вот как заставить UART делать прерывания при приеме адреса и не делать прерывания когда приходит обычный байт?
tsb
Мне то нужно сделать совместимость с другими МК, например с Силабсом, у которого есть этот мультипроцессорный режим. При чем тут MODBUS?
Последний раз редактировалось mike-y-k; 03.10.2022 в 11:24.
Причина: 6.6, 7.15
|
|
|
|
09.07.2021, 21:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,731
Сказал спасибо: 2,439
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: ADUCM360 и RS485
Можно просто игнорировать прерывание,если это не адрес.
Все проще.
|
|
|
|
10.07.2021, 12:26
|
|
Прописка
Регистрация: 17.08.2013
Сообщений: 287
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: ADUCM360 и RS485
baiderin
Не привычно как то думать про сотрудников Analog Devices, что они "неумные" и просто так засунули эту операцию в "приватный класс" (ради смеха?). Я в это не верю.
Люди на их форуме задают вопросы как подключить RS485 к этому МК, и им отвечают - читайте доки. Можно было просто сказать - "игнорируйте прерывание". Что проще этого?
Изначально, зачем то вводили режим "9 бит" в работу UART. Могли бы просто "игнорировать" прерывание, если 9 бит "не адрес".
Думаю, это работает, как то по другому.
Последний раз редактировалось mike-y-k; 03.10.2022 в 11:25.
Причина: 7.15
|
|
|
|
10.07.2021, 13:28
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,704
Сказал спасибо: 189
Сказали Спасибо 3,193 раз(а) в 2,070 сообщении(ях)
|
Re: ADUCM360 и RS485
optical illusion, откуда вообще этот проц взялся?? зачем он тебе нужен???
__________________
кагмаподэ магмаподэ
|
|
|
|
10.07.2021, 13:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,031
Сказал спасибо: 3,034
Сказали Спасибо 3,205 раз(а) в 2,175 сообщении(ях)
|
Re: ADUCM360 и RS485
Сообщение от optical illusion
|
Как видим нет 9 бит режима.
|
КМК, такое (MPCM) есть только в UART семейства MCS-51. В частности - Silabs. И то, "в старых" контроллерах обходились одним прерыванием на весь UART.
__________________
Экзорцист 40-го уровня.
|
|
|
|
10.07.2021, 13:47
|
|
Прописка
Регистрация: 17.08.2013
Сообщений: 287
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: ADUCM360 и RS485
индюк
Я отстал от "жизни"? В STM32 стали делать 24 битные АЦП? У них руки из правильного места уже "выросли"?
Последний раз редактировалось mike-y-k; 03.10.2022 в 11:26.
Причина: 7.15
|
|
|
|
10.07.2021, 14:17
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,704
Сказал спасибо: 189
Сказали Спасибо 3,193 раз(а) в 2,070 сообщении(ях)
|
Re: ADUCM360 и RS485
внешнюю поставь
__________________
кагмаподэ магмаподэ
|
|
|
|
10.07.2021, 15:53
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 723
Сказал спасибо: 363
Сказали Спасибо 803 раз(а) в 377 сообщении(ях)
|
Несколько слов по проекту СN0359.
Вот фрагмент схемы подключения RS485, никаких ноу-хау.
Несколько ключевых моментов.
Проект построен довольно красиво; работа основана на очереди сообщений. Сообщение содержит указатель на функцию-обработчик и список параметров. Пока в очереди есть сообщения, они извлекаются и выполняются их функции-обработчики.
Не прячу портянки кода под спойлер, ибо спойлер не всегда корректно работает.
Файл source\hal\drivers\uart.cpp
Вот фрагмент обработчика прерывания для приёма по UART.
При приеме символа LF производится обработка принятой строки
(в очередь сообщений ставится обработчик rx_line )
PHP код:
|
...
if ((pADI_UART-›COMIIR & COMIIR_STA_RXBUFFULL) == COMIIR_STA_RXBUFFULL)
{
if (p_rx_buf == rx_pingpong[0])
{
if (rx_length[0] ‹ SIZE(rx_pingpong[0]))
{
p_rx_buf[rx_length[0]++] = pADI_UART-›COMRX;
}
}
else
{
if (rx_length[1] ‹ SIZE(rx_pingpong[1]))
{
p_rx_buf[rx_length[1]++] = pADI_UART-›COMRX;
}
}
// если принят символ конца строки, то требуется ее обработка.
if (pADI_UART-›COMRX == '\n')
{
if (p_rx_buf == rx_pingpong[0])
{
p_rx_buf = rx_pingpong[1];
rx_length[1] = 0;
rd_count[1] = 0;
}
else
{
p_rx_buf = rx_pingpong[0];
rx_length[0] = 0;
rd_count[0] = 0;
}
app msg;
msg.argc = 0;
// ставим в очередь сообщений сообщение с
// функцией-обработчиком "rx_line"
msg.fun = rx_line; // ‹‹ обработчик сообщения
ts_post_message(msg);
}
}
...
|
Файл source\applications\uart_exec.cpp
Вот обработчик принятой строки (тот самый rx_line )
Если в принятой строке распознаётся команда, то она выполняется
(в очередь сообщений ставится обработчик распознанной команды, согласно массиву command_table )
PHP код:
|
...
struct command command_table[] = {{"poll", cmd_poll},
{"setvolt", cmd_voltage},
{"setfreq", cmd_frequency},
{"setk", cmd_cellconstant},
{"setcof", cmd_coefficient},
{"setstm", cmd_setuptime},
{"sethtm", cmd_holdtime}};
int rx_line(int argc, char *argv[])
{
char line[128];
rewind(stdin);
// читаем в буфер строку из входного потока (это UART)
fgets(line, 128, stdin);
char *p;
decltype(flash_file::rs485_address) rs485_address, address = -1;
flash_file * p_flash_file;
// позиционируемся на адрес узла в файле конфигурации
fseek(p_flash, (int) (&p_flash_file-›rs485_address) - (int) (p_flash_file), SEEK_SET);
// читаем адрес узла из конфигурационного файла в переменную
fread(&rs485_address, sizeof(flash_file::rs485_address), 1, p_flash);
// позиционируемся на первую лексему во входной строке
p = strtok(line, ", \t\r\n");
// интерпретируем первую лексему во входной строке как адрес узла (вероятно, это диктуется протоколом обмена)
sscanf(p, "%i", &address);
// если адрес во входной строке совпадает с адресом из файла конфигурации,
// то это пакет "для нас", обработаем его
if (address == rs485_address)
{
p = strtok(nullptr, ", \t\r\n");
for (int i = 0; i ‹ SIZE(command_table); ++i)
{
if (!strcmp(p, command_table[i].cmd))
{
app msg;
msg.fun = command_table[i].fun; // ‹‹ обработчик сообщения
msg.argc = 1;
msg.argv = new char*[1];
msg.argv[0] = new char[strlen(command_table[i].cmd) + 1];
strcpy(msg.argv[0], command_table[i].cmd);
for (p = strtok(nullptr, ", \t\r\n"); p != nullptr; p = strtok(nullptr, ", \t\r\n"))
{
char **old_argv;
old_argv = msg.argv;
msg.argv = new char*[msg.argc + 1];
for (int j = 0; j ‹ msg.argc; ++j)
{
msg.argv[j] = old_argv[j];
}
msg.argv[msg.argc] = new char[strlen(p) + 1];
strcpy(msg.argv[msg.argc], p);
delete[] old_argv;
++msg.argc;
}
// ставим в очередь сообщений сообщение с
// функцией-обработчиком, указанным для
// принятой команды (массив "command_table" выше )
post_message(msg);
break;
}
}
}
}
...
|
P. S.
Тут не пахнет никакими 9-битами, нужно курить формат посылок в доках и разбираться с этим.
На беглый взгляд: каждый принимаемый информационный пакет должен начинаться с адреса узла в кодировке ASCII. Тупо принимаем все пакеты. Если адрес "наш", обрабатываем команду; если нет - игнорируем.
Ну а все классы-наследники CDialog нужны лишь для интерактивного энкодерно-"менюшного" конфигурирования с последующим
сохранением настроек в файле конфигурации.
Это C++, ардуины вроде тут ни при чём.
Всё, ушёл пить пиво
Сообщение от optical illusion
|
На форуме ADI люди спрашивали - их куда то послали "почитать".
|
optical illusion, вот тут есть неплохое курево ( на случай, если Вы ещё не пробовали ).
Краткое резюме ))
Сообщение от optical illusion
|
Подскажите, кто ни будь приделывал RS485 к ADUCM360?
|
В частности, это сделано фирмой Аналоговые девицы в упомянутом Вами проекте.
Было интересно и познавательно ознакомиться с проектом.
Сообщение от optical illusion
|
Ну он, как оказалось, странно заточен под Ардуино
|
С++. Ардуино - это аппаратная платформа, язык программирования - это язык программирования.
Никакой связи между платформой и ЯП нет.
Сообщение от optical illusion
|
И судя по всему, в том примере нет исходников той части где производится обработка прерывания во время работы UART с RS485. Или я не нашел.
|
Сообщение от optical illusion
|
Где бы посмотреть как работает железо UART ADUCM360 в режиме RS485?
|
См. посты #21 и #22 темы и ( если, конечно, Вам нужно ) изучайте файлы проекта и доки. В доках и исходниках всё есть!
Сообщение от optical illusion
|
то место которое меня интересует находится в закрытом классе.
|
Эти классы Вам (пока) не нужны, разве что для иллюстрации принципов ООП в действии. Там не приватный класс, а приватный метод класса. Означает (по умыслу разработчика), что класс сам знает, как работать со своими внутренними данными, а для пользователя класса предоставлен интерфейс, вот им и нужно пользоваться. Инкапсуляция-с . Классы ‹bla_bla_bla›Dialog используются в проекте лишь для настройки параметров данного экземпляра устройства.
Вопрос: а что Вам конкретно нужно по теме?
Без конкретики получится 9-битный сферический конь в вакууме и 388 страниц темы ни о чём
Последний раз редактировалось mike-y-k; 03.10.2022 в 11:29.
Причина: 6.6
|
|
|
|
10.07.2021, 22:51
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,058
Сказал спасибо: 2,563
Сказали Спасибо 11,890 раз(а) в 5,964 сообщении(ях)
|
Re: ADUCM360 и RS485
Сообщение от j-Roger
|
С++. Ардуино - это аппаратная платформа, язык программирования - это язык программирования.
Никакой связи между платформой и ЯП нет.
|
Есть еще подход с соответствующей прослойкой. Этот подход не предполагает разбирательств "а шо там в нутре и как оно работает". Главное в подходе - "вот тут пни, а вот тут ткни".
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:41.
|
|