|
Протокол передачи данных по одному проводу |
|
|
|
Nov 29 2011, 08:02
|
Гуру
     
Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484

|
Здравствуйте! Я сделал эл. схему и создал протокол передачи данных по одному проводу. По типу протокола 1-wire. Напряжение питания устройств на шине 15V. Высокий уровень> 10V. Низкий уровень < 5V. Расстояние между устройствами, ведущим и ведомым, несколько метров. Больше месяца намеренно не делаю никакого контроля достоверности информации передаваемой по шине, получил такую статистику: в среднем, раз в час происходит сбой достоверности преданных данных, почемут, особенно в ночное время. Данные в размере двух байт, передаются от ведущего к ведомому (двубайтная последовательность, адрес и команда) с частотой двух посылов в секунду. Ведомый принимает два байта и немедленно отвечает ведущему одним байтом, отвечает продолжая передачу ведущего. Тактовая частота последовательности передаваемых бит - 100 Гц. Нормальная ли это статистика ошибок для однопроводной шины по типу 1-wire? Грубо говоря, провод висит в воздухе и не будет экранирован. Планирую как-то ввести контроль достоверности, на стороне ведомого, для переданных мастером адреса ведомого устройства на шине и команды. На стороне мастера сделать проверку достоверности ответа ведомого. Если у кого-нить есть опыт, подскажите, как лучше в данной схеме реализовать контроль? Может просто ведущему дважды посылать запрос и сравнивать два ответа ведомого? Ведомому сравнивать два запроса ведущего? Как говорится, молния не попадает дважды в одно место.
|
|
|
|
|
Nov 29 2011, 09:50
|
Гуру
     
Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484

|
Цитата(kovigor @ Nov 29 2011, 12:03)  Как минимум нужно использовать контроль четности, а лучше - CRC8, как это сделано в тех же DS18B20. Еще можно для повышения помехоустойчивости увеличить ток в линии. Для контроля четности читать собственно нечего. Мастер передает байт идентификатор устройства и следом за ним байт команду. Суммировать эти два значения и сравнивать с третим байтом четности? В данный момент сделал двойную передачу мастером ID устройства и команду, если дважды ведомый принимает одинаковую команду, команда принимается ведомым. Если ведомый принял команду, то продолжает принятую от мастера последовательность двух байт, ответным байтом равным значению байта команды мастера. Мастер получив такой ответ от ведомого, фиксирует, что команда успешно принята ведомым. Что-то мне подсказывает, что данный способ надежней простого контроля четности. Как сделано в DS18B20 изучаю.
|
|
|
|
|
Nov 29 2011, 10:03
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Слесарь @ Nov 29 2011, 13:50)  Суммировать эти два значения и сравнивать с третим байтом четности? Нет, снабдить каждый байт своим битом четности, как это сделано в UART. Бит четности, кодирование по Хеммингу, CRC8 - обязательно должен быть механизм контроля корректности посылок. Цитата(Слесарь @ Nov 29 2011, 13:50)  Что-то мне подсказывает, что данный способ надежней простого контроля четности. Сложно, надумано и ненадежно. Почитайте у того же Тутевича про помехоустойчивое кодирование. Или хотя бы про код Хемминга у Калабекова. Это ведь не зря все придумали и обосновали: http://lord-n.narod.ru/walla.html
|
|
|
|
|
Nov 29 2011, 10:47
|
Гуру
     
Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484

|
Цитата(kovigor @ Nov 29 2011, 13:37)  А если из-за обрыва или КЗ на линии вы трижды получите вполне допустимые посылки вида "0xff" или "0x00", что вы станете делать ? Перед посылкой вида - идентификатор+команда, мастер закорачивает линию для сброса в течении 100 мксек. Ведомый зарегистрировав событие сброса, начинает прием данных вида - идентификатор+команда. Проверяет идентификатор (сравнивает со своим) и запоминает переданную за идентификатором команду. Снова ожидает событие сброса и повторения посылки вида - идентификатор+команда. Если дважды ведомый принял одинаковую команду, значит команда верна. Ведомый выполняет эту команду и отчитывается мастеру посылая ответный байт, код выполненной команды. Разве что-либо может быть надежней? Тактирует шину мастер(ведущий), ведомый передает данные по тактам ведущего, как и DS18B20
|
|
|
|
|
Nov 29 2011, 10:50
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(stells @ Nov 29 2011, 14:42)  прямой код и инверсный И кому это, простите, надо ? Теория помехоустойчивого кодирования давно разработана, подробнейшим образом расписана в литературе. Так нет же, надо изобретать велосипед, просто потому, что лень почитать книжку. Так ? Цитата(Слесарь @ Nov 29 2011, 14:47)  Перед посылкой вида - идентификатор+команда, мастер закорачивает линию для сброса в течении 100 мксек. Ведомый зарегистрировав событие сброса, начинает прием данных вида - идентификатор+команда. Проверяет идентификатор (сравнивает со своим) и запоминает переданную за идентификатором команду. Снова ожидает событие сброса и повторения посылки вида - идентификатор+команда. Если дважды ведомый принял одинаковую команду, значит команда верна. Ведомый выполняет эту команду и отчитывается мастеру посылая ответный байт, код выполненной команды.
Разве что-либо может быть надежней?
Тактирует шину мастер(ведущий), ведомый передает данные по тактам ведущего, как и DS18B20 Делайте. Игнорируйте разработанную до вас теорию, тысячекратно проверенную и десятилетиями используемую. Набивайте шишки. Только потом не жалуйтесь, что ничего не работает ...
|
|
|
|
|
Nov 29 2011, 12:53
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Слесарь @ Nov 29 2011, 12:02)  ....Нормальная ли это статистика ошибок для однопроводной шины по типу 1-wire?.... нет. для 1wire шины в пром зоне = одна, две ошибки на часы, дни работы - сто пудово... при правильном передатчике и приёмнике (аппаратной и программной части). интенсив где то 10-20 байт в секунду... мне кажется, что надо копать в сторону детекции уровней. т.е. тут предлагают увеличить токи - вот это мне кажется ближе(при исправной логике софта), к истине. в 1wire там всё таки ноль играет бОльшую роль чем может показаться. это и помехоустойчивость так же... удачи вам (круглый)
|
|
|
|
|
Nov 29 2011, 16:25
|
Гуру
     
Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484

|
Цитата(kovigor @ Nov 29 2011, 15:03)  Да, двойные ошибки так не обнаружишь, но ведь и ваша схема неидеальна. В обоих байтах нарушится первый разряд. Что тогда ? Или из-за обрыва вы примете одни нули или одни единички ? Вы попробуйте, вполне возможно вам контроля четности и хватит. А еще очень советую увеличить передаваемый в линию ток ... Если линия закорочена или оборвана, ничего не пойдет, необходимо вначале получить правильный ID устройства, это не 0ч00 и не 0XFF. Если нарушится первый разряд в обоих байтах дублированной команды, ведомому тогда вся надежда, что на стороне ведущего есть соответствующий обработчик. Ведомый то отсылает обратно код принятой команды, дабы ответить мастеру какая команда реально была выполнена. Если несоответствие, надо выходить в безопасный режим аварии или еще как реагировать, просто повторить команду. Цитата(kolobok0 @ Nov 29 2011, 15:53)  нет. для 1wire шины в пром зоне = одна, две ошибки на часы, дни работы - сто пудово... при правильном передатчике и приёмнике (аппаратной и программной части). интенсив где то 10-20 байт в секунду...
мне кажется, что надо копать в сторону детекции уровней. т.е. тут предлагают увеличить токи - вот это мне кажется ближе(при исправной логике софта), к истине. в 1wire там всё таки ноль играет бОльшую роль чем может показаться. это и помехоустойчивость так же...
удачи вам (круглый) Биты по шине передаются в точности как 1-wire, только у меня частота на порядок ниже, для поддержания тактовой частоты 1-wire контроллер приходится дополнять кварцем, как минимум 8 мГц. У меня сейчас используется внутренний генератор контроллера 4 мГц.
|
|
|
|
|
Nov 30 2011, 03:15
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Слесарь, где-то на форуме встречал утверждение, что разрабатывать свой протокол (канальный уровень модели OSI) еще вполне допустимо, хотя и готовых немеряно ( WAKE, SLIP, MODBUS...), но создавать свой физический интерфейс (нулевой уровень модели) нужно только тогда, когда есть весомые требования. Можно поинтересоваться, есть ли они у Вас? Почему бы не воспользоваться готовым 1-wire. Там и интерфейс и протокол.
По поводу контроля ошибок. Предлагаю crc8. Считается аналитически (медленно) и таблично (быстро). Если вероятность обнаружения ошибки не устраивает, есть crc16/32.
--------------------
Выбор.
|
|
|
|
|
Nov 30 2011, 07:37
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Слесарь @ Nov 29 2011, 20:25)  ...для поддержания тактовой частоты 1-wire контроллер приходится дополнять кварцем, как минимум 8 мГц. У меня сейчас используется внутренний генератор контроллера 4 мГц. это откуда вот такое(8мГц)? помню на 51 серии (выполнение команд = 2мГц) работает до сих пор на ура в нескольких странах мира... Можно и ниже 1мГц(но задачи в фоновом режиме - придёться извращаться, чтоб крутить)... мастер можно вплоть до 200 кГц думаю опускать. другое дело, что интенсив мелкий получится по данной шине... (круглый)
|
|
|
|
|
Nov 30 2011, 08:33
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Слесарь @ Nov 30 2011, 01:00)  у меня на компьютере Радио РК-86, при загрузке программы с магнитной ленты проверялась контрольная сумма байт загруженной программы, что удивительно, иногда контрольная сумма сходилась, а программа выдавала глюки, например подмена символов. Там, возможно, использовалась простейшая сумма по модулю "2", а не CRC
|
|
|
|
|
Nov 30 2011, 18:50
|
Гуру
     
Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484

|
Цитата(haker_fox @ Nov 30 2011, 06:15)  Слесарь, где-то на форуме встречал утверждение, что разрабатывать свой протокол (канальный уровень модели OSI) еще вполне допустимо, хотя и готовых немеряно ( WAKE, SLIP, MODBUS...), но создавать свой физический интерфейс (нулевой уровень модели) нужно только тогда, когда есть весомые требования. Можно поинтересоваться, есть ли они у Вас? Почему бы не воспользоваться готовым 1-wire. Там и интерфейс и протокол. Все равно приходится самому обработчик протокола писать, если это не под готовое ведомое устройство, то можно и свой пртокол, заодно на практике видно все слабые места в технике передачи данных. Собственно своего там мало, принцип синхронизации и выставления бит на шине, как и 1-wire. Питание только 12 ... 15V чтоб работало и от аккумулятора и от БП. Все устройства на шине самодельные. Цитата(kolobok0 @ Nov 30 2011, 10:37)  это откуда вот такое(8мГц)? помню на 51 серии (выполнение команд = 2мГц) работает до сих пор на ура в нескольких странах мира...
Можно и ниже 1мГц(но задачи в фоновом режиме - придёться извращаться, чтоб крутить)... мастер можно вплоть до 200 кГц думаю опускать. другое дело, что интенсив мелкий получится по данной шине...
(круглый) Тактирующий импульс 1-wire 6 мкс. с используемыми мной контроллерами и средой программирования при 4 мГц реализовать крайне сложновато. По крайней мере, мне не удавалось. Просто ставлю кварц 8 мГц.
|
|
|
|
|
Dec 1 2011, 08:12
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Слесарь @ Nov 30 2011, 22:50)  ...Тактирующий импульс 1-wire 6 мкс. с используемыми мной контроллерами и средой программирования при 4 мГц реализовать крайне сложновато.... да ладно сложно. 1) 6uS = это рекомендуемая задержка для мастера. минималка - 1uS. Из опыта скажу - что в пром зоне с минимальной задержкой - отлично дышит на дцать метров. 2) 1uS = это 4 такта МК(при тактовой 4МГц). значит имеем что Вы должны обеспечить задержку от 1*4 = 4 6*4 = 24 от 4 до 24 тактов. пуш-поп - это уже 4 такта. т.е. выставляете ноль на шину и деалеет любые подготовительные телодвижения. они занимают (как правило) не меньше чем требуется. далее выставляете еденичку и далее... в чём сложности? пояснить на пальцах можете? (круглый)
Сообщение отредактировал kolobok0 - Dec 1 2011, 08:14
|
|
|
|
|
Dec 1 2011, 13:48
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Слесарь @ Dec 1 2011, 16:43)  Надо изучать готовый алгоритм и писать обработчик. А можно самому придумать алгоритм и пасать обработчик. Я постоянно перед выбором, как поступить. Изучать обычно нет времени или лень, по этому зачастую выбор падает на придумывыние своего. Ага, поэтому конечный продукт получается сыроватым, работает через пень-колоду и проч. Быстрее, быстрее, еще быстрее, прыжками, через две ступеньки ... Читать некогда, учиться - тоже. Результат выходит соответствующий, спешка хороша при ловле блох. Лучше все-таки потратить какое-то время на самообразование, оно потом окупится многократно ...
|
|
|
|
|
Dec 1 2011, 14:08
|
Гуру
     
Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484

|
Это как существует задача, повесить на установку несколько датчиков и пару клапанов - моторов. Любой нормальный КИПовец зайдет в магазин КИПсервис и купит готовый универсальный контроллер, напишет программу на языке логики этого контроллера. Все сделает быстро и качественно. Но что поделаешь, мне лень изучать еще один язык логики прибора например ОВЕН, пойду тернистым путем паять свой прибор и писать обслуживающую прогу на привычном языке. Иначе я не работаю, надо обращаться к обычным КИПовцам или электрикам. Цитата(kovigor @ Dec 1 2011, 16:48)  Ага, поэтому конечный продукт получается сыроватым, работает через пень-колоду и проч. Быстрее, быстрее, еще быстрее, прыжками, через две ступеньки ... Читать некогда, учиться - тоже. Результат выходит соответствующий, спешка хороша при ловле блох. Лучше все-таки потратить какое-то время на самообразование, оно потом окупится многократно ... Ну так на ошибках тоже можно учиться, получилось плохо - переделываешь. Это творчество. Когда надо сделать сразу и правильно, надо обращаться к специалистам, кто специализируется в определенной теме. Просто иной род деятельности Цитата(МП41 @ Dec 1 2011, 13:04)  Вообще неплохо было бы посмотреть осциллографом что там в линии творится и свести физические причины возникновения ошибок к минимуму. Да. Надо посмотерть. Но боюсь мой осцилограф плохо будет отображать дискретный сигнал. Я настраивал протокол по логическому пробнику. Низкий и высокий уровни подбирал по мультиметру, подбором сопротивлений. Контроллер связан с сигнальной линией через транзисторные ключи. Сигнальная линия притянута сопротивлением 4,7 кОм к нестабильному питающему напряжения 12 ... 15v. От этого напряжения питаются устройства висящие паралельно на линии.
|
|
|
|
|
Dec 3 2011, 00:54
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (Слесарь @ Dec 3 2011, 02:21)  Я незнаю, подключаются ли по RS485 множество устройств паралельно? Конечно, как минимум 32 устройства. QUOTE (Слесарь @ Dec 3 2011, 02:21)  Тогда думаю лучше автомобильный CAN. Единственное, что нужны контроллеры этой шины. Если для 485-го годится контроллер USART, то для CAN нужен свой, совершенно другой аппаратный контроллер.
--------------------
Выбор.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|