Пн окт 25, 2010 15:34:17
Пн ноя 01, 2010 12:36:01
Пн ноя 01, 2010 13:00:57
Пн ноя 01, 2010 13:16:41
Вт ноя 02, 2010 10:42:26
Liv писал(а):Самое свежее описание протокола WAKE с примерами я выложил здесь: http://digit-el.com/files/open/wake/wake.html
В скором будущем планирую добавить туда новую реализацию WAKE на Си для микроконтроллеров, а также модули на С++ для PC с примером приложения.
Вт ноя 02, 2010 11:17:56
Вт ноя 02, 2010 12:08:41
Liv писал(а):Вообще, всё больше склоняюсь к тому, что в случае ошибки приема пакета подчиненное устройство просто должно молчать. Т.е. ничего не передавать в случае:
-> ошибки формата коды команды (старший бит = 1)
-> ошибки длины пакета
-> ошибки CRC
Liv писал(а):Использование коллективного вызова в сетях невозможно, так как ответ будт передавать все устройства сразу. Адрес 0 не передается в пакете, он предназначен для работы точка - точка. Можно реализовать еще один адрес коллективного вызова, например, 1. При обращении по этому адресу устройства не передают ответа. Очевидно, что так передавать можно только команды управления, а не запроса данных. Результат выполнения команды, как вариант, можно запросить отдельной командой у каждого устройства. Не знаю, стоит ли такое делать.
Liv писал(а):Появилась версия протокола с CRC-16. Планирую сделать единый исходник, в котором на этапе компиляции можно будет задавать CRC-8, CRC-16 или вообще без CRC. Вычисление CRC сильно тормозит обмен. Можно, конечно, CRC-8 сделать таблично, но иногда CRC вообще не нужно.
Liv писал(а):Формирование и разбор пакетов планирую вынести из обработчиков прерываний UART, так как длительные обработчики мешают основной задаче в некоторых критичных случаях.
Liv писал(а):А что Вы иеете в виду под асинхронными сообщениями?
Вт ноя 02, 2010 12:57:58
Pavel V. писал(а):В моей логике именно так и подразумевалось - для широковещательных запросов ответ не передается. Т.е. эти сообщения не имеют подтверждения.
Pavel V. писал(а):У меня сделано табличное вычисление CRC. Объем флеш-памяти в современных МК более чем достаточен для этого. Плюс, я вынес вычисление контрольной суммы из прерывания - как-то не правильно это.
Pavel V. писал(а):Я сейчас вообще делаю вариант с использованием кольцевого буфера, где в прерывании будет выполняться единственная задача - push или pop. А разбор пакета будет идти отдельным процессом (я использую scmRTOS в этом проекте).
Pavel V. писал(а):Когда подчиненное устройство может самостоятельно инициировать передачу пакета. Это позволяет избежать поллинга в ситуациях, когда необходим постоянный контроль какого-либо параметра. Но это, конечно, для сети не подходит, только для соединения точка-точка.
Вт ноя 02, 2010 14:04:06
Liv писал(а):У меня адрес 0 является, скорее, не широковещательным, а выделенным адресом для связи точка-точка. Нулевой адрес вообще не передается в пакете, что уменьшает избыточность при связи точка-точка. А вот широковещательного адреса, когда устройства не передают ответа, пока в WAKE нет, думаю добавить.
Liv писал(а):Я по своей бедности работаю с маленькими процессорами, поэтому табличное вычисление CRC не делал. Хотя в будущей реализации для AVR планирую добавить. Из прерывания тоже по максимуму всё вынесу.
Liv писал(а):Такой подход требует иной поддержки со стороны PC, нарушается вся структура. К тому же, как быть с коллизиями при полудуплексной связи, например, RS-485? Это весьма значительная часть применений протокола.
Вт ноя 02, 2010 15:47:19
И здесь здравствуйте!Liv писал(а):... табличное вычисление CRC не делал. Хотя в будущей реализации для AVR планирую добавить.
uint16_t calc_crc(void CRC_SPACE * array, CRC_LEN len)
{
uint8_t carry;
uint8_t CRC_SPACE *ptr = (uint8_t CRC_SPACE *) array;
uint8_t crcbuf_lo = 0;
uint8_t crcbuf_hi = 0;
while(len--) {
carry = crcbuf_hi ^ *ptr++;
carry = carry ^ (uint8_t) (carry >> 4);
crcbuf_hi = crcbuf_lo ^ (uint8_t) (carry << 4) ^ (uint8_t) (carry >> 3);
crcbuf_lo = carry ^ (uint8_t) (carry << 5);
}
return ((uint16_t) crcbuf_hi << 8) | crcbuf_lo;
}
+1Liv писал(а):При наличии уникального маркера начала пакета не видно необходимости в кольцевом буфере. Начало пакета всегда может помещаться в начало буфера.
С выносом из прерывания, на мой взгляд, тоже без фанатизма надо. Разбор SLIP-овской подстановки байтов вполне может сидеть в прерывании, использование не кольцевого буфера, а буфера пакета этому способствует. А уже потом отдавать наверх, пусть там CRC сверяют, то-сё.Liv писал(а):Анализ символа начала пакета - минимальная работа, вполне можно делать и в прерывании. Конец пакета тоже несложно определить в прерывании, и только после этого дать знать о приеме пакета процессу разбора. Хотя, конечно, можно и всю работу поручить процессу.
Вт ноя 02, 2010 16:17:28
Pavel V. писал(а):Адрес 0xFF - как в TCP/IP
Pavel V. писал(а):При первоначальной реализации, когда вычисление контрольной суммы производилось в прерывании, у меня наблюдались потери символов (при высокой скорости UART).
Pavel V. писал(а):Но как раз такой частный случай мне сейчас подвернулся Необходимо обеспечить очень быструю реакцию на событие, произошедшее на ведомом устройстве, и решение вопроса поллингом кажется некрасивым.
avreal писал(а):И здесь здравствуйте!
avreal писал(а):Может, ну его, табличное? ... «Быстрый нетабличный» для выглядит приблизительно так
avreal писал(а):Разбор SLIP-овской подстановки байтов вполне может сидеть в прерывании, использование не кольцевого буфера, а буфера пакета этому способствует.
avreal писал(а):В случае с вытесняющей ОС
Вт ноя 02, 2010 19:18:01
Ср ноя 03, 2010 00:31:03
Ср ноя 03, 2010 11:00:35
Ср ноя 03, 2010 11:12:54
YKolomiets писал(а):Интересуюсь протоколом от Liv (WAKE).
Прочитал много информации о RS-485.
У меня вопрос: Возможно ли общения устройств (кол. около 20 шт.) между собой а не по указке от MASTERA какое устройство может сейчас работать в сети?
На данный момент планирую организовать это таким способом:
Когда устройство готово передать пакет оно слушает сеть (линию). Как только сеть освободилась устройство, какое то время еще слушает сеть и только потом занимает сеть на передачу.
Ср ноя 03, 2010 12:42:08
YKolomiets писал(а):Возможно ли общения устройств (кол. около 20 шт.) между собой а не по указке от MASTERA
Ср ноя 03, 2010 14:46:31
Чт ноя 04, 2010 09:09:14
Поле арбитража CAN-кадра используется в CAN для разрешения коллизий доступа к шине методом не деструктивного арбитража. Суть метода не деструктивного арбитража заключается в следующем. В случае, когда несколько контроллеров начинают одновременную передачу CAN кадра в сеть, каждый из них сравнивает, бит, который собирается передать на шину с битом, который пытается передать на шину конкурирующий контроллер. Если значения этих битов равны, оба контроллера передают следующий бит. И так происходит до тех пор, пока значения передаваемых битов не окажутся различными. Теперь контроллер, который передавал логический ноль (более приоритетный сигнал) будет продолжать передачу, а другой (другие) контроллер прервёт свою передачу до того времени, пока шина вновь не освободится. Конечно, если шина в данный момент занята, то контроллер не начнет передачу до момента её освобождения.
Чт ноя 04, 2010 11:04:55
Чт ноя 04, 2010 11:57:19
YKolomiets писал(а):Спасибо большое за ссылку.
Перед тем как задавать вопросы эту ссылку я читал.
Объясните пожалуйста ситуацию: в сети CAN подключено 10шт. устройств. Из них 3шт. работают по контролю напряжения. Как получить данные одного из них?
В моем понимании устройство Х которое хочет получить данные от устройства У (таких устройств в сети еще 2шт. У1,У2) в поле кадра (DATA FIELD) должны присутствовать данные (команда, запрос) которые понимает только устройство У.