|
Чёй-то устал я сегодня. Скажу, что более-менее понял. Остальное - потом. от одного таймера Э не. Это у вас, ребята, один клонированный UART. GM: Всё не так Именно так. частоты генератора и приёмника не совпадают после записи последнего бита А куда девается стартовый и стоповый биты? И вообще, по-моему, Вы всё сильно усложняете. Зря всё-таки не хотите эпюры нарисовать. |
|
|
Gregory: А куда девается стартовый и стоповый биты? И вообще, по-моему, Вы всё сильно усложняете. Зря всё-таки не хотите эпюры нарисовать Можно и нарисовать. Прямая линия, на ней 10 последовательных отрезков одинаковой длины. Начало первого отрезка возьмём за начало отсчёта. В середине каждого отрезка можно поставить жирную точку, в этот момент будет считывание линии. Всё. RS232 - это последовательный асинхронный протокол, в котором переход 1-0 является началом передачи последовательности от 7,5 до 12 бит. Стоп-бит не является необходимым элементом, это просто дань устаревшим механическим оконечным устройствам, пережиток прошлого, так сказать. Например, в системе связи инмарсат до сих пор применяется 6-битный код, состоящий из старт-бита и 5-битного кода МТК-2. А стоп-бита там нет, да он им и не нужен. Ну насчёт усложнения спорный вопрос. Сравните хотя бы мой фрагмент кода, состоящий из 14 строк (плюс одна строка для управления светодиодом), который обеспечивает передачу от миди к ком, с вашим кодом для пика. Уверяю вас, вторая половина, передача от ком к миди вместе с циклическим буфером будет не больше. Стартовый бит считывается в первую очередь, стоповый тоже можно считать, кстати, ничего не меняя в программе, но не нужно. |
|
|
AHTOXA: это по меньшей мере некрасиво Не вижу тут ничего некрасивого. Я же говорю, что ещё в детали не вникал, а только в саму суть. А она ясна. чем 8 UARTов на 8 таймерах Да речь-то о том, что на одном таймере нельзя организовать абсолютно НЕЗАВИСИМЫЕ UART'ы. Самое большое, что получится, кратные частоты. Поэтому и спросил, что может, с помощью хитрых алгоритмов это обойти удалось. Понятно, что маленько доработав код (при чём, вроде, не так уж сильно он и увеличится), можно последовательно опросить несколько портов (сколько ног у МК хватит). Ув. Чаву, безусловно, огромное спасибо. Обязательно гляну его алгоритм чуть попозже.
|
|
|
Ну так, вроде все уарты до 38400 работают на кратных частотах: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400. И дальше тоже из этого ряда 57600=9600*3, 115200=9600*12. |
|
|
GM: RS232 Ну, мы вообще-то говорим про UART. Честно говоря, первый раз слышу такие данные, что Вы приводите. Стоп-бит, помимо своей непосредственной функции (исходя из названия), ещё служит некоторым "контролем", так как должен быть всегда 1. Кроме того, за счёт этого, как-раз и обеспечивается то самое старт-условие (1-0) о котором Вы сами упоминаете. Допустим, Вы не будете проверять правильность стопового бита (хотя выгода данного решения весьма сомнительна). Начинаем рисовать. Прямая линия, на ней 10 последовательных отрезков одинаковой длины Поскольку мы решили не проверять стоповый бит, то - девять. Вы предлагаете использовать два тика? Маловато будет. Объясняю (заодно и цифирины посчитаем). Поскольку данная конструкция осуществляет запуск механизма приёма не по перепаду 1-0, а по тикам, то возможны два крайних варианта (об этом, кстати, в статье говориться). Допустим самый благоприятный вариант. Первый тик приходится на самое начало стартового бита. Тогда выборки, действительно будут происходить в серединах битов. Через 8,5 битов можно считывать весь байт. Теперь смотрим, что будет, при расстройке частот. При скорости передатчика, большей, чем приёмника, каждый отрезок, на прямой, будет меньше идеального. При меньше, наоборот, больше. За единицу счёта принимаем длинну идеального бита. Тогда образцовая частота будет - 9, а разность частот может достигать +/- 1/2. Тогда, общая расстройка может достигать +/- (1/2) : 9 * 100% = 5,56% Обратимся ко второму крайнему случаю, когда "стартовый" тик попадает на середину бита. Выборка, тогда приходится на границу смены битов, что само по себе недопустимо, а уж расстройка частот, при таком раскладе, должна быть 0,00000%. Таким образом, минимально допустимое число тиков - 3. Расписывать подробно не буду. Рисуем линии, смотрим, подставляем в формулы. Получаем. Для первого варианта: +(2/3) : 9 * 100% = +7,41% и -(1/3) : 9 * 100% = - 3,7% Для второго варианта: +(1/3) : 9 * 100% = + 3,7% и -(2/3) : 9 * 100% = -7,41% Исходя из худших вариантов: +/- 3,7% Если же принимать ещё и стоповый бит (как собственно в девайсе и реализованно), то вместо 9, надо будет подставлять 10. Что получится, подсчитайте сами. Отсюда появляется двойка в знаменателе Ещё раз повторяю: "Мы говорим именно о взаимной расстройке частот", поэтому, ничего делить на 2 не надо. Сравните хотя бы мой фрагмент кода Не знаю я атмеловского АСМа.
|
|
|
Вопрос по проверке стоп-бита не такой простой, поскольку вы не устройство, принимающее решение, а простой конвертер скоростей. Ну проверили вы стоп-бит, он не 1, ваши действия? Есть три варианта. 1) Отбросить байт. (Хотя сам байт мог быть принят без ошибок. Кроме того, если байт первый в последовательности, то оставшиеся два-три байта тоже станут ненужными...) 2) Передать байт. (На одну ошибку стало меньше( 3) Разобраться с линией связи. (Заменить, переложить, перейти на новый протокол...)
|
|