_Pasha 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба А зачем два байта 0хF0? Почему нельзя сделать так: 1.Включаем передатчик. 2.Ждём пока линия устаканится... (согласно DS). 3.Пауза длительностью 1 байт (что бы все приёмники закончили принимать (если начали) возможный мусор). 4.Передаём пакет. Вспомнилось еще про <BREAK> Очень удобен для frame sync, жаль только, что надо во фрейме либо явно длину пакета указывать либо два брэка делать, в начале и конце, что сильно избыточно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Почему нельзя сделать так: Почему нельзя? Можно конечно. Но обычно сделать паузу сложнее/накладнее, чем передать пару байт преамбулы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Я так понимаю, нет возможности (скорее - желания) у программера просто ПОДОЖДАТЬ несколько коррелируется со связями на плате, когда нет возможности убрать звон и приходится такт-два добавлять к задержкам Или я в другое уполз? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Ну, для отсчёта паузы обычно нужен таймер, а их всегда жалко:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Ну, для отсчёта паузы обычно нужен таймер, а их всегда жалко:) Жалко... Кто их даст?! Своих кормить нечем, а тут протоколы всяки :) Что до преамбулы - не пойму, чем может два подряд 0xF0 помочь? они что, frame error как-то помогают спровоцировать? Там нулей должно быть побольше... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Ну, для отсчёта паузы обычно нужен таймер, а их всегда жалко:) ну тогда мы приплываем где-то ко второму листу обсуждения и вопрос, собственно, сводится к одному - как понять, что первый байт - самый первый меня, например, F0 тоже не вдохновил никак Удержать линию в любом уровне (желательно - неактивном для приемника, но стабильном) - пожалуйста все равно с компа не получится (хотя.. RTS/CTS) управлять активностью передатчика ТС, бейте индуса по маковке :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Что до преамбулы - не пойму, чем может два подряд 0xF0 помочь? А вы нарисуйте картинку, станет понятно. 0xF0 - это пять нулей, затем 5 единиц. Если мы поймаем старт-бит за 8..5 бит до начала 0xF0, то получим стоп-бит в первых пяти нулях и framing error, если за 4..1 бит, то 5 eдиниц будут стопом. Таким образом, второй 0xF0 ловится всегда целым. и вопрос, собственно, сводится к одному - как понять, что первый байт - самый первый Дык, вот F0F0 как раз отлично подходит:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба А вы нарисуйте картинку, станет понятно. 0xF0 - это пять нулей, затем 5 единиц. Если мы поймаем старт-бит за 8..5 бит до начала 0xF0, то получим стоп-бит в первых пяти нулях и framing error, если за 4..1 бит, то 5 eдиниц будут стопом. Таким образом, второй 0xF0 ловится всегда целым. Дык, вот F0F0 как раз отлично подходит:) мы ждем уровня? или отрицательного фронта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 17 октября, 2012 Опубликовано 17 октября, 2012 (изменено) · Жалоба А вы нарисуйте картинку, станет понятно. 0xF0 - это пять нулей, затем 5 единиц. Если мы поймаем старт-бит за 8..5 бит до начала 0xF0, то получим стоп-бит в первых пяти нулях и framing error, если за 4..1 бит, то 5 eдиниц будут стопом. Таким образом, второй 0xF0 ловится всегда целым. Убедили. Изменено 17 октября, 2012 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Дык, вот F0F0 как раз отлично подходит:) Правильно ли я понимаю: Передатчик в начале всегда добавляет два байта F0. Приёмники постоянно ждут F0, а следующий за F0 байт (если он не равен F0) считают первым? Если так, то блок данных не может начинаться с F0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 17 октября, 2012 Опубликовано 17 октября, 2012 (изменено) · Жалоба Правильно ли я понимаю: Передатчик в начале всегда добавляет два байта F0. Приёмники постоянно ждут F0, а следующий за F0 байт (если он не равен F0) считают первым? Если так, то блок данных не может начинаться с F0. Имеется в виду прием, называемый эскейп-последовательностью. Например, в WAKE И кстати, непонятно, чем 0xC0 так приглянулось :) Изменено 17 октября, 2012 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=AK= 12 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Почему нельзя сделать так: 1.Включаем передатчик. 2.Ждём пока линия устаканится... (согласно DS). 3.Пауза длительностью 1 байт (что бы все приёмники закончили принимать (если начали) возможный мусор). 4.Передаём пакет. Пауза перед началом пакета нужна не только для того, чтобы UARTы закончили прием мусора. Она еще служит сигналом сброса. В Мобасе в начале пакета выдерживается пауза 3.5 байт-интервалов. А в самом пакете пауза между байтами не должна превышать 1.5 байт-интервалов, если склероз не подводит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба А в самом пакете пауза между байтами не должна превышать 1.5 байт-интервалов, если склероз не подводит. Этож проц только и будет шо паузы считать! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=AK= 12 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Правильно ли я понимаю: Передатчик в начале всегда добавляет два байта F0. Приёмники постоянно ждут F0, а следующий за F0 байт (если он не равен F0) считают первым? Если так, то блок данных не может начинаться с F0. В моем случае приемники ничего особенного не "ждут". Они реагируют на байты входного потока определенным образом, примерно так: - Eсли байт равен 0xF0, то очищают приемный буфер - Если байт равен ESC-символу 0x1B, то он выбрасывается, а на следующий за ним символ реакция такая: -- если второй байт равен 0х01, то в приемный буфер записывается символ 0x1B -- если второй байт равен 0х02, то в приемный буфер записывается символ 0xF0 -- если второй байт равен 0х03, то прием пакета (фрейма) заканчивается, проц начинает разбираться с содержимым приемного буфера - Если ничего из вышеописанного, то входной символ просто записывается в приемный буфер При передаче в самом пакете данных символы 0xF0 заменяются на пары 0x1B, 0х02, а символы 0x1B - на пары 0x1B, 0х01. Перед началом пакете передается пара символов 0xF0, 0xF0, а по окончании передачи пакета - пара 0x1B, 0х03. Этож проц только и будет шо паузы считать! Делается по прерываниям и много процессорного времени не отнимает. Но приходится использовать два таймера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба В Мобасе в начале пакета выдерживается пауза 3.5 байт-интервалов. Не в начале, а в конце, иначе как слейвы узнают, что пакет пришел? Делается по прерываниям и много процессорного времени не отнимает. Но приходится использовать два таймера. Не два, а один, с тиком 50мкс. Минимальный Т35 чудесным образом равен 35, Т15 = 15 тикам. Это, как Вы знаете, про FreeModbus, но не думаю, что другие решения более разумны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться