Вы находитесь на странице: 1из 12

6/2/1. Модуль USART. Общие положения.

Принцип работы в асинхронном


режиме. (“лохмачу бабушку”)

Открываю стр. 67 даташита PIC16F628A и предпринимаю попытку “кавалерийского


наскока”.
В ответ - мастерский “удар в челюсть” (внушает большущее и неописуемое уважение).
Да … Тяжелый случай (больно же!).
Нужно признать, что “противник” достойный, и с ним “этот номер не пройдет”.
Ничего не остается делать, как “разделять и властвовать” (за мной - “должок”. Верну
обязательно. И с “процентами”).
Необходимая, в этих случаях, “настройка внутренних функций” произошла.
Можно полноценно работать.
По “закону жанра”, прежде всего, необходимо выяснить, зачем вообще нужна вся эта
“свистопляска”, ведь какой-то практический смысл в этой “круговерти” нулей и единиц
должен быть?
Цитата: “USART это модуль последовательного ввода/вывода …”
Значит, речь идет о двух выводах порта, через которые осуществляется обмен
информацией (“ввод/вывод”) между ПИКом и внешним (по отношению к ПИКу)
устройством.
Следовательно, имеет место быть двунаправленный (см. “ввод/вывод”),
последовательный интерфейс, по которому, c теми или иными “заморочками”
(выяснится позднее), “транспортируются” (“туда-сюда”) байты данных (регистры общего
назначения ПИКов могут принимать, обрабатывать и “выдавать на гора” только слова
“объемом” в 8 битов).
Через один вывод порта, данные выводятся в некое внешнее устройство (передача,
одно направление движения данных), а через другой вывод порта осуществляется
прием данных, сформированных этим “неким внешним устройством” (прием, другое
направление движения данных).
Уже легче, так как нечто подобное (но не то же самое!) “мы уже проходили”:
вспомните про последовательный интерфейс I2C и работу ПИКа с м/схемой памяти
24С64А.
Это помогает, так как становится понятен “глобальный” принцип работы, который у
подавляющего большинства типов последовательных интерфейсов одинаков (стандарт):
слово данных передается (и принимается) младшим битом вперед, и между словами
существуют некие “разделители”, которые предотвращают “наезд” одного слова на
другое, соседнее слово.
А может быть, в данном случае, работа происходит по интерфейсу I2C?
“Лезу” в даташит.
Цитата: “USART использует стандартный формат NRZ: один стартовый бит, 8 или
9 битов данных (примечание: 9-й бит это одна из тех “заморочек”, которые упомянуты
выше) и один стоповый бит”.
Нет, это не интерфейс I2C.
Примечание: для работы по интерфейсу I2C используется модуль SSP (не путать с
CCP), который не входит в состав PIC16F628A.
Что такое формат NRZ?
Это один из нескольких форматов (не самый сложный) интерфейса RS232.
Каково основное предназначение интерфейса RS232?
Интерфейс RS232 изначально задуман как последовательный интерфейс, через
который компьютер “общается с внешним миром” (с периферийными устройствами,
которые поддерживают RS232).
Существуют и другие типы последовательных интерфейсов, которые не хуже (и даже
лучше) RS232, но RS232, как изначальный “монополист”, “подмял под себя всю эту
братию” по той простой причине, что менять его на что-то другое себе дороже станет.
Поэтому, любой компьютер, имеющий COM - порты, может работать по
последовательному интерфейсу RS232.
Значит, если ПИК работает по RS232 (для компьютера, ПИК является периферийным
или внешним устройством), то можно осуществить обмен информацией между
ПИКом и компьютером, причем, в обеих направлениях.

1
А вот это уже очень серьезно, так как возможности “связки” “ПИК/компьютер” более
впечатляющи, чем возможности “связки” “ПИК/все остальное”.
При этом, компьютер “приобретает” своеобразного “посредника” (ПИК) между ним и
“кучей” всевозможных устройств, которые можно “пристегнуть” к этому “посреднику”
(“измерялки”, “переключалки”, “считалки”, “звонилки”, “караулки”, “аварийки”, “бякалки”,
“убивалки”, “сторожилки” и т.д., и т.п.).
Сразу оговорюсь: для того чтобы имело место быть такое счастье (без кавычек),
нужно не только уметь составлять программы для ПИКов, но и уметь программировать
в Виндах.
И в самом деле, компьютер может осуществить обмен информацией с внешним
(периферийным) устройством только посредством программы, составленной в Виндах
(другие операционные системы я не беру в расчет) и обслуживающей тот порт, к
которому это внешнее устройство подключено.
Обе эти разновидности программ (если они составлены под один и тот же интерфейс)
работают в одной “связке”.
В основном, программы, составленные в Виндах (для “общения” с м/контроллерами), по
сравнению с теми “монстрами”, которые “ваяются” под решение “крутых” задач,
небольшие по объему и относительно простые.
При желании, освоить это дело вполне можно.
И еще одна особенность: программист, умеющий “ваять” программы в Виндах (какой
бы он не был “крутой”), но не имеющий понятий о конструировании устройств на
м/контроллерах, “это дело не потянет”.
В идеале, нужен человек, умеющий делать и то, и другое, а это достаточно большая
редкость.
Это первое.
Второе: кроме компьютеров, существуют различные устройства, которые поддерживают
RS232.
Значит, с помощью модуля USART, можно добиться от них “взаимности”.
В конце концов, можно, например, “соорудить связку” из нескольких PIC16F628A (или
из других типов ПИКов, имеющих модули USART), “общающихся” между собой по
интерфейсу RS232.
Итак, направление “вектора тяги” (с поправкой “плюс – минус два лаптя”), я надеюсь,
понятно.
Для определенности, далее, я буду ориентироваться на “связку” “компьютер – ПИК”.
Рассуждаем и “ветвимся” дальше.
Представьте себе, что ПИК работает на прием, и имеется внешний передатчик,
который “засылает” в ПИК массив байтов (или слов другого объема).
Во-первых (и это сразу приходит на ум), нужно как-то отделить байт от байта, так как,
в противном случае, приемник “словит” один “огроменный супербайтище”, и “все дело
будет загублено на корню”.
Следовательно, в начале каждого байта, должен быть некий идентификационный
признак его начала.
Стандартное его название - “стартовый бит”.
В начале стартового бита формируется переход от 1 к 0.
Если в начале каждого байта данных формировать одни только стартовые биты, то
ничего хорошего из этого не выйдет, так как, в случае, если бит №7 байта данных
=0, то следующего стартового перехода от 1 к 0 не сформируется.
Поэтому, в конце каждого байта данных, на “сигнальной проволочине”, нужно
“принудительно” выставить уровень 1 с тем, чтобы, в дальнейшем, на ней можно было
бы сформировать стартовый перепад от 1 к 0.
Вот теперь - порядок: все стартовые перепады в наличии и приемник, как минимум,
“сможет опознать” каждый стартовый бит (его нулевой уровень), что является условием
разрешения обработки байтов данных, следующих за стартовыми битами.
“Выставлением” этой единицы “рулит” бит со стандартным названием “стоповый бит”.
Проще говоря, уровень стартового бита всегда равен 0, а уровень стопового бита
всегда равен 1.
В части касающейся условий старта и стопа, это Вам ничего не напоминает?
Вспомните про I2C.

2
При работе по I2C, есть такое же условие старта, а после окончания прохождения
массива байтов, на “сигнальной проволочине” также выставляется единица.
Работа по интерфейсу RS232 даже проще работы по интерфейсу I2C, так как, между
стартом и стопом передается не массив байтов, а один байт.
А вдруг имеет место быть ошибка приема? Как, при работе по RS232, ее выявить?
Ответ: в слово, после бита №7, добавляется еще один бит с номером 8 (9-й бит), на
который “возлагается” функция проверки на четность (это что-то типа примитивного
способа вычисления контрольной суммы).
“Голову этим забивать” пока не стоит. Просто знайте, что такая возможность имеется.
Бог даст, и до этого доберемся.
В части касающейся передатчика, вырисовывается следующая очередность поступления
битов в сигнальную линию: стартовый бит - слово данных (младшим битом вперед) -
стоповый бит.
В такой же последовательности, происходит и обработка битов на приемной стороне.
Вот Вам и старт-стопный принцип обмена информацией в “чистом виде”.
Таким образом, формируется “пачка” битов, стандартное названик которой - кадр или
фрейм.
“Кадр” звучит более по-русски, значит это слово и буду применять.
Рис. 1 иллюстрирует принцип формирования кадра, в состав которого входит слово
“объемом” в 8 битов (без бита проверки на четность. Иногда его называют “битом
паритета”).

Модуль USART может обеспечить и асинхронный, и синхронный режим обмена


данными.
А вот компьютер, в части касающейся работы по интерфейсу RS232, может обеспечить
только асинхронный режим обмена данными.
Хотя стандарт RS232 предусматривает и асинхронный, и синхронный режимы обмена
данными, COM – порт компьютера (а через него и осуществляется обмен данными)
поддерживает только асинхронный режим обмена данными.
Режим синхронного обмена данными через COM – порт компьютера возможен, но для
его реализации нужно применить специальные адаптеры.
Таким образом, если речь идет о связке “компьютер – ПИК”, “центр тяжести смещается
в область” асинхронного режима обмена данными.
Значит, нужно присвоить асинхронному режиму обмена данными “статус” “важняка” и
изначально “рыть” в этом направлении.
“Рою”.
Асинхронным режим обмена данными назван потому, что формально, такты приемника
и передатчика “развязаны” друг от друга.
Проще говоря, в приемнике, отсутствует система фазовой синхронизации.
Но в случае совместной работы двух устройств, каждое из которых имеет свой
тактовый генератор, совсем уж без коррекции фазы (или “заморочки”, смысл которой, в
конечном итоге, сводится к коррекции фазы), не обойтись, так как, в противном
случае, будет полнейший “Гитлер капут”, связанный с тем, что из-за постоянно
накапливающихся, не корректируемых фазовых расхождений, в конечном итоге, как
минимум, будут считываться уровни не тех битов, которые нужно считать в текущих
циклах чтения (например, соседних битов), а как максимум - работа “связки” будет
просто “парализована”.
Так как же обеспечивается фазовая коррекция в цифровых системах, подобных
рассматриваемой?
Заметьте, я сказал “фазовая коррекция”, а не “фазовая синхронизация”.
Выгоднее считать, что это не одно и то же (“валить все в кучу” не нужно хотя бы по
причине необходимости разграничения функций).

3
С целью обеспечения упорядочения информации, связанной с фазой, выгодно считать,
что:
- в случае наличия фазовой синхронизации, речь идет о синхронном режиме работы,
- в случае наличия фазовой коррекции, речь идет об асинхронном режиме работы.
Причем, на этой стадии “въезда”, не стоит “ломать голову” над корректностью (или
нет) данных высказываний. Каждый из Вас это можно выяснить позднее (для себя).
Сейчас же, главное - каким угодно способом, “раздробить вражеские силы на части”.
Можно даже представить себе, что фазовая коррекция есть “недоношенный ребенок”
фазовой синхронизации, который (“ребенок”) из-за своей “ущербности” (родовая травма,
задержка в развитии и т.д., но “парень” работящий: с мозгами туговато, но “траншею в
миг выроет”), “не потянул” на “синхронный статус” (“заторчал в детстве”).
Задействую еще один образ.
“Сермяжную” суть (что-то про Остапа Бендера и компанию вспомнил) работы
“механизма” фазовой коррекции можно понять, если задействовать “буйную фантазию”
и представить себе серию “русских, народных пинков” (а с пинками у русских все ОК),
которые четко “отфутболивают” фазовый параметр в нужное место.
Согласитесь со мной, что это объяснение, не смотря на его “идиотизм”, все-таки, кое-
что проясняет.
Разберемся более детально.
“Сверхзадача” приемника состоит в безошибочном приеме байта данных.
Это означает то, что, на приемной стороне, нужно последовательно считать
надежно зафиксировавшиеся уровни текущих битов, и не абы как, а так, чтобы
момент считывания располагался внутри интервала времени прохождения того
бита, к которому этот момент считывания “жестко привязан”.
Стандартное название любой из этих последовательных процедур - “выборка”.
С “механизмом” выборок мы вплотную сталкивались при “разборках” с интерфейсом
I2C (в части касающейся ПИКа, работающего на прием).
Но там было проще, так как у “помощника” нет тактового генератора (тактовый
генератор ПИКа “рулит всем”) и фазу приемника (ведомого) корректировать не нужно.
Нужно только обеспечить выполнение простого условия (задержка), и необходимые,
стабильные, фазовые соотношения выставляются, как бы, в “автомате”.
В рассматриваемом же случае - совсем другая “опера”: и ведущий, и ведомый
(“мастер”, “помощник”) имеют свои такты.
???
Опять задействовую образ (зрительный), но на этот раз он совсем не “идиотский”.
Естественно, что показателем величины частотных расхождений двух сигналов является
разница их частот (“глубочайший”, по своей “детсадовской простоте”, вывод. Ирония
уместна).
Но фаза “привязана” к частоте (а вот это уже не “детский сад”), следовательно,
величина фазовых расхождений двух сигналов “привязана” к разнице их частот.
Все это прекрасно и академично (да вот только мозги как-то слабо “прошибает”), но
как, визуально (органом чувств с названием “глаза”) можно оценить динамику фазовых
расхождений (лучше один раз увидеть, пусть даже с погрешностью в плюс – минус “два
лаптя”, чем сто раз “изнасиловать мозги”)?
А очень просто.
Есть такая “штуковина” с названием “двухлучевой осциллограф”.
Подаете на один из его входов сигнал со стабильной частотой, например, от
кварцевого генератора, и синхронизируете осциллограф по этому сигналу (например,
верхняя осциллограмма).
На второй вход подаете сигнал с ГСС, частота которого близка к частоте кварцевого
генератора (нижняя осциллограмма).
А теперь медленно покрутите ручку точной настройки ГСС “туда – сюда” (относительно
частоты кварцевого генератора).
Вы увидите, что, в зависимости от знака расстройки и ее величины, направление и
скорость “бега” (движения) нижней осцилограммы относительно верхней, будет
меняться. Это я называю “бег фазы” (“фаза плывет”). Вы можете придумать этому
“явлению природы” свое название.
Наименьшие скорости “бега фазы” наблюдаются при настройке ГСС на частоты,
близкие к частоте кварцевого генератора.
4
При увеличении расстройки, она увеличивается тем больше, чем больше величина
расстройки.
В развитие темы, еще один образ.
Представьте себе часовой циферблат с одной минутной стрелкой, указывающей на
мгновенные значения величин фазовых расхождений.
Циферблат отградуирован в градусах (от 0 до 360 градусов).
В этом случае, скорость движения стрелки будет зависеть от скорости “бега” фазы.
Чем больше скорость “бега фазы” (то есть, чем значительнее частотные расхождения),
тем с большей скоростью стрелка будет “мотать круги” (работа по кольцу “в чистом
виде”), причем, стрелка может крутиться как в одном направлении, так и в другом
(зависит от знака расстройки частот).
Хорошенько отложите эти “картинки” у себя в памяти. Оoooчень полезные “картинки”.
Этих образов вполне достаточно для того, чтобы комфортно воспринять изложенную
ниже информацию.
Итак, для того чтобы “грубо” обеспечить минимальную скорость “бега фазы” (а
необходимость этого “на поверхности лежит”), нужно, чтобы скорость передачи была
как можно более близка к скорости приема (в идеале - равна, но это маловероятно).
Для этого нужно “привязаться” к каким-то одинаковым значениям скоростей передачи и
приема.
В реальности, имеет место быть “привязка” к стандартным скоростям в бодах, которые
“прописаны” в любом компьютере (их можно увидеть, например, в настройках модема).
Теперь можно сделать простой и незамысловатый, практический вывод (на уровне
“первоклассника”): чем меньше отличаются друг от друга скорости передачи
передатчика и приема приемником, тем лучше.
Итак, первичные условия нормальной работы системы фазовой коррекции (пока что
“виртуальной”) созданы.
Не буду “забивать Вам голову” ответами на вопрос типа “как это разработчики
докатились до жизни такой”, а сразу предоставлю конечный результат их работы,
причем, с той же целью (“незабивания головы”), я предоставлю его в виде общего
принципа фазовой коррекции, применяемого в асинхронных системах, подобных
рассматриваемой.
Сразу обращаю Ваше внимание на то, что “собака Баскервилей зарыта” в “механизме”
выборок, ведь именно от их положения (во времени) зависит, то ли будет “зер гут”, то
ли будет “Гитлер капут” (это все, что я знаю из немецкого языка и поэтому постоянно
этим хвастаюсь. Вы уж извините меня, грешника. Да, про “хенде хох” забыл).
Из этого следует вывод: фазовая коррекция есть процесс “фазового
отфутболивания” (вспомните про “пинки”) выборок в те “места” (на оси
времени), в которых имеет место быть их “привязка” к “закрепленным за ними”
битам.
За подобного рода фразы, спеца – японца, наверное, с работы бы уволили, но для
нашего брата это будет в самый раз.
После этого, “в буйной и разудалой головушке”, “на вскидку” (в соответствии со
стандартом), “всплывает” следующая “виртуальная осцилограмма” (мираж с техническим
уклоном): кадры, формируемые передатчиком (верхняя эпюра) “стоят на месте”.
Импульсная последовательность такта (или его “производная”) приемника (нижняя
эпюра), относительно кадров (верхняя эпюра), “плывет” (движется).
В момент осуществления фазовой коррекции (“пинка”), нижняя эпюра одномоментно
(скачком! Это цифровая, а не аналоговая техника! Кольца ФАП нет!) смещается
относительно верхней эпюры таким образом, что сразу же после этого смещения,
имеет место быть синхронизм, то есть, фронт/спад импульса нижней эпюры,
приходящийся на момент осуществления фазовой коррекции, расположится точно (или
почти точно) под фронтом/спадом импульса верхней эпюры.
А так как момент выборки “привязан” к фронту/спаду нижней эпюры, то, если
“подсуетиться”, выборку можно “загнать” примерно в середину интервала времени
прохождения бита кадра, к которому (биту) она (выборка) “привязана”.
Результат - безошибочное считывание бита, причем, бита своего, родного, а не какого-
то “залетного”/“шального” (например, соседнего). При этом нужно учитывать то, что,
после этого очень быстротечного “пинка” (каратэ вспомнил), “бег” фазы продолжается
(его никто не отменял), и фазовые расхождения опять начинают накапливаться.
5
Так как “бег” фазы равновероятно может происходить в обеих направлениях, то
разработчикам и не нужно “забивать себе голову” какими-то корректирующими
поправками, касающимися момента выборки, происходящей непосредственно после
фазовой коррекции.
При помощи достаточно “нехитрого приема” (ниже убедитесь сами), они просто
“принудительно загоняют” момент 1-й выборки в середину интервала времени
прохождения стартового бита (при условии равенства {или почти} скоростей приема и
передачи).
И правильно делают. Это самый оптимальный вариант.
“Ковыляю” дальше.
Предположим, что выборка произошла, и уровень “своего” бита безошибочно считался.
Но фазовые расхождения как накапливались до выборки (с момента предыдущей
фазовой коррекции), так они будут накапливаться и после выборки, вплоть до
следующей фазовой коррекции.
В этом и заключается основная специфика “пинкового режима работы” с “плывущей
фазой”.
В идеале, процедуры фазовой коррекции должны происходить в начале каждого бита
кадра (и это не трудно сделать), но эту задумку “режет” то, что числовое значение
байта данных может быть любым (.0 … .255).
А если принимается число 1111 1111, а тем паче 0000 0000?
К чему “привязывать” начало процедур фазовой коррекции (чем их запускать?), ведь
перепадов-то нет?
Вопрос: “Если перепады байта (слова) данных отпадают (“разброд и шатания” даром
не нужны), то тогда к чему “привязать” начало процедуры фазовой коррекции, если
речь идет об асинхронной работе”?
Ответ: к спаду (переходу от 1 к 0) стартового бита.
Почему?
Потому, что стартовый бит присутствует всегда, и в его начале (в начале каждого
кадра), 1 “железобетонно” меняется на 0.
Далее, могут быть всякие “разброды и шатания” (см. выше), но, в начале стартового
бита, переход из 1 в 0 “неизбежен как смена дня и ночи” (основа старт – стопного
принципа работы).
Братцы, так что же это получается? Конец “побитнофазокоррекционному счастью”?
Так точно. “Не долго птичка пела”…
Конечно же, можно корректировать фазу и побитно, но в этом случае, “минусы
перевешивают плюсы” (просто не выгодно).
Вот тебе и на … Но если это так, то за счет чего, через COM – порт, компьютер
работает и с мышкой, и с другой периферией?
Рассуждаю.
Получается то, что, в пределах одного кадра, происходит одна процедура фазовой
коррекции, которая запускается спадом (стробом) стартового бита.
После этой фазовой коррекции, фазовые расхождения постепенно накапливаются
вплоть до конца кадра.
Что касается байта данных, то, при таком “раскладе”, максимальная величина фазовых
расхождений будет присутствовать в момент последней выборки, то есть, выборки
уровня бита №7.
Единственный, разумный вывод из этого такой: для обеспечения безошибочной
выборки уровней всех битов байта (слова) данных, величина фазового смещения
момента выборки уровня последнего бита данных должна быть меньше
критической.
Критическая величина фазового смещения (для случая 8-битного слова) есть
величина фазового смещения момента выборки уровня бита данных №7, относительно
момента выборки уровня стартового бита, после превышения которой начинается
“фазовый Гитлер капут”.
Получается что-то типа “ефрейторского зазора”, “потолок” которого превышать нельзя.
В противном случае, выборка, “привязанная” к биту данных №7, будет произведена не
во время его прохождения, а во время прохождения либо бита данных №6 (одно
направление “бега” фазы), либо стопового бита (другое направления “бега” фазы).

6
Так как направлений “бега” фазы два, то критическая величина фазового смещения
имеет знак (плюс или минус).
Еще один “напрашивающийся” вывод: для обеспечения эффективной работы подобного
рода систем фазовой коррекции, нужно, чтобы длительность стартового бита была
равна длительности бита данных (обеспечивается легко).
Не трудно догадаться, что момент выборки уровня стартового бита (а он “привязан” к
моменту фазовой коррекции) есть некая “начальная точка отсчета”, от которой
происходит “накопление” величины фазового смещения.
Величина фазового смещения напрямую зависит от скорости “бега” фазы, а проще
говоря, от величины расхождения скоростей приема и передачи.
Если это расхождение очень велико, то есть, речь идет о некой “суперкритической”
величине фазового смещения (сумма нескольких критических величин фазового
смещения), то “фазовая ошибка” может произойти, например, в момент выборки уровня
бита №1 и даже бита №0 (если вообще “не в …, не в Красную армию”).
По мере уменьшения величины расхождения скоростей приема и передачи, момент
возникновения “фазовой ошибки” будет дискретно (“скачками”) “отодвигаться” вправо (в
“район” битов данных более старших разрядов).
А вот когда эта “бяка” “покинет район” бита №7, то все это “сооружение” полноценно
заработает (байты данных будут считываться без ошибок).
Теперь на счет стопового бита.
В данном случае, считывать его уровень не нужно.
Что с него взять? “Обслуга”… Тупо выставил уровень единицы (обеспечил следующее
условие старта) и будь здоров. Большего и не требуется.
При потоковой работе, его длительность обычно равна длительности бита данных, а
после окончания передачи массива кадров, стоповый бит просто затягивается до
момента начала формирования следующего массива кадров (ждущий режим. Вспомните
I2C).
Таким образом, “важняком” асинхронного режима работы по интерфейсу RS232 (и
вообще, асинхронного режима работы как такового) является задача обеспечения как
можно более точного совпадения номиналов скоростей приема и передачи.
Это актуальная задача, от решения которой зависит очень многое.
Немного забегая вперед, скажу, что к решению этой задачи “подключены”
значительные “силы и средства” модуля USART.
Это, “в комплекте” с весьма впечатляющими “силами и средствами” компьютера,
обеспечивает надежное функционирование “связки” “компьютер/ПИК”.
А теперь, с учетом сказанного, можно более детально “поковыряться” в сути принципа
фазовой коррекции, используемой в модуле USART.

7
Верхняя эпюра - принятый приемником сигнал, нижняя эпюра - такт (или его
“производная”) приемника.
Итак, основное внимание - на стартовый бит, так как именно в его “епархии” делаются
“фазокоррекционные дела”, и от того, в каком месте стартового бита произойдет 1-я (в
пределах кадра) выборка, многое зависит.
Процедуру фазовой коррекции запускает спад (переход от 1 к 0) стартового импульса.
Примечание: если имеет место быть нулевой уровень бита №0, то фронт стартового
импульса сформирован не будет (ну и черт с ним).
По спаду стартового импульса, счетчик тактовых импульсов (или их “производных”),
входящий в состав приемника, сбрасывается на начало счета и тем самым
подготавливается к началу счета от предустановленного значения.
Этот сброс на начало счета и есть фазовая коррекция (“хитрая”, но об этом позже).
Счет происходит по спадам тактовых импульсов.
Так как такты приемника и передатчика “развязаны”, то, относительно спада стартового
импульса, начало счета будет задержано на время от нуля до величины периода
тактового сигнала (или его “производных”. Далее я не буду о них упоминать)
приемника.
Это есть один из двух источников погрешности, причем, данная погрешность имеет
место быть только в начале кадра, и ее величина не превышает периода такта.
Если период такта мал, то и максимальная величина такой погрешности тоже мала.
Таким образом, в начале каждого кадра, задается некая “начальная точка отсчета”, к
которой будут “привязаны” все выборки, производимые в пределах этого кадра.
Итак, фазовая коррекция произошла и начинается подсчет количества тактовых
импульсов, начиная с 1-го (то, что было “до того” - не важно. На рис. 2, см. значки
ХХХ…).
При этом, следует обратить внимание на то, что, при отсутствии сбросов на начало
счета, счетчик количества импульсов считает по кольцу.
Это предполагает наличие некого “периода счета”.
В данном случае (см. рис. 2), он составляет интервал времени прохождения 15-ти
тактовых импульсов.
В зависимости от заданной скорости передачи/приема (и от других параметров),
количество этих импульсов может быть больше или меньше.
В модуле USART, этим “рулит” так называемый генератор скорости обмена
(стандартное название BRG).
Упомянутый выше счетчик количества импульсов, входит именно в его состав.
Генератор скорости обмена может создавать импульсные последовательности, со
стандартными скоростями обмена данными, от источников нестандартных частот
(имеются ввиду кварцы различных номиналов).
Генератор скорости обмена настолько “крут”, что он позволяет получить дробные
коэффициенты деления, а это обеспечивает высокую точность “привязки” номинала
скорости, формируемой этим генератором, к требуемому (заданному), стандартному
номиналу скорости обмена данными (в бодах), причем, при использовании кварцев
различных номиналов.
Хотя генератор скорости обмена и есть “ответственная штучка”, но “лезть” в его
“потроха”, лично я, не вижу практического смысла (себе дороже станет).
Главное - понять его основную функцию и освоить его настройки (об этом – позже).
Этого вполне достаточно для полноценной работы с генератором скорости обмена.
Если сформулировать основную функцию генератора скорости обмена максимально
упрощенно, то она, в конечном итоге, сводится к определению целого числа тактовых
импульсов, формируемых при том или ином номинале выбранной скорости, сумма
периодов которых, как можно более точно, “укладывается” в “эталонный” интервал
времени “прохождения” одного бита, то есть, в тот интервал времени “прохождения”
одного бита, который (интервал) в точности (по нулям) соответствует выбранной
скорости.
В рассматриваемом случае (см. рис. 1), это 15 импульсов.
Примечание: если “лезть” в конкретные “прибамбасы” и “навороты” генератора скорости
обмена (довольно-таки “крутые”), то велика вероятность “бардальеро”, а также и “увода
в сторону” от сути.
Этим, конечно же, можно заняться, но только не сейчас.
8
Естественно, что при таком “раскладе” будет существовать разница
(ошибка/погрешность) между “эталонной”, стандартной скоростью и скоростью,
сформированной генератором скорости обмена под этот “эталон”, но она мала и
поэтому вполне приемлема.
Эта ошибка имеет знак (плюс/минус) и расчитывается (есть формулы) под конкретные
номиналы кварца и скорости.
При этом, задача конструктора заключается в ее минимизации, что, кстати, не так уж
и сложно (об этом - далее).
Теперь “вернусь к своим котлетам”.
Спад стартового импульса сбросил счетчик импульсов генератора скорости обмена на
начало счета (а проще говоря, в ноль).
После этого, в приемнике, начинается подсчет количества тактовых импульсов с целью
определения момента выборки.
Пока оставлю это “на потом”, а сейчас нужно разобраться с “механизмом” выборки.
Отдельная выборка (любая) уровней бита происходит по результатам 3-х запросов.
Считанные, в результате этого, 3 уровня, анализируются так называемым
мажоритарным детектором.
А это еще что за “зверь”?
Как это частенько бывает, название грозное, а “зверь” - далеко не “лев рыкающий”.
Это что-то типа мажоритарного, 3-входового, логического элемента м/схемы 561ЛП13
(564ЛП13).
Логика работы мажоритарного детектора:
1. 0 на его выходе появляется тогда, когда на его входах присутствуют 2 (в любом
порядке) или 3 нуля.
2. 1 на его выходе появляется тогда, когда на его входах присутствуют 2 (в любом
порядке) или 3 единицы.
После последнего, 3-го запроса, результат такого детектирования (выборка)
считывается с выхода мажоритарного детектора, и он считается принятым уровнем
бита.
Зачем нужен такой “крутенький” способ выборки?
А он полезен при повышенном уровне коротких импульсных помех.
При их отсутствии, после 3-х запросов, на входах мажоритарного детектора будут
присутствовать либо три нуля (выборка нуля), либо три единицы (выборка единицы).
Если помехи есть, и одна из них искажает результат одного из трех запросов, то, не
смотря на это, выборка будет произведена без ошибки.
А теперь посмотрим, в каком “месте” производится эта “мажоритарная выборка”?
В данном случае, она производится в интервале времени формирования тактовых
импульсов с №№7,8,9 (их назначает разработчик).
Следовательно, в соответствии с указанной выше “мажоритарной логикой”, выборка, как
таковая, произойдет во время прохождения тактового импульса с №9, то есть,
приблизительно в середине интервала времени прохождения стартового бита, что и
требуется.
Каков критерий выбора номеров “мажоритарных”, тактовых импульсов и кто “рулит”
мажоритарным детектором?.
Критерий таков: правый импульс этой “тройки” должен располагаться приблизительно в
середине интервала времени прохождения стартового бита.
Всем, что “пристегнуто” к мажоритарному детектированию, “рулит” генератор скорости
обмена (мажоритарный детектор не входит в его состав).
Генератор скорости обмена, в соответствии с выбранной скоростью (с произведенными
настройками), определяет как моменты трех запросов, так и момент считывания
результата мажоритарного детектирования.
При этом, конструктор отдыхает. Ему нужно только произвести правильную настройку
генератора скорости обмена, а остальное “он сделает сам”.
Итак, спад (строб) стартового импульса обеспечил выборку уровня стартового бита
приблизительно в середине интервала времени его прохождения.
Ноль стартового бита считался.
Но ведь этот ноль является “технологическим” в том смысле, что это не уровень бита
байта (слова) данных, и “закладывать его на хранение” в некий регистр данных не
нужно.
9
Зачем нужно считывание уровня стартового бита?
А затем, чтобы приемник модуля USART “догадался”, что, после прохождения спада
стартового импульса, принят именно стартовый импульс, а не что-то другое.
После того, как приемник модуля USART “догадается”, что принято условие старта, его
автоматика разрешает обработку (считывание уровней) бита (слова) данных.
Если произошла ошибка (считан единичный уровень), то считывание байта (слова)
данных запрещается.
Предположим, что все ОК (считался 0).
Далее требуется последовательно считать все уровни битов байта (слова) данных,
начиная с бита №0.
А фазовой-то коррекции, в пределах интервалов времени прохождения этих битов, нет!
Она была только в начале кадра.
Значит, при таком “раскладе” (см. выше), нужно “смириться со своей судьбинушкой” и
“уповать” на то, что, на момент выборки уровня бита №7 (или №8, если он
используется), критическая величина фазового смещения не будет превышена.
Каков “механизм” выборок уровней битов байта (слова) данных?
А он очень простой: счетчик количества тактовых импульсов просто “гоняет по кольцу”
(в данном случае, “тупо” отсчитывает по 15 тактовых импульсов), и запросы уровней
“тупо” производятся во время прохождения все тех же тактовых импульсов с №№7,8,9.
Так как “бега” фазы никто не отменял, то фаза может “плыть” как в направлении
слева направо, так и в направлении справа налево (вспомните “картинку” на экране
осциллографа).
Скорость этого “бега” зависит от степени расхождения скоростей приема и передачи.
Ну и пусть себе “бежит” на здоровье, лишь бы, в “границах” текущего кадра, не была
превышена критическая величина фазового смещения.
Если это условие отсутствия фазовой ошибки соблюдается в “границах” одного кадра,
то оно будет соблюдено и в “границах” массивов кадров любого объема, так как
фазовая коррекция производится в начале каждого кадра.
Таким образом, в “границах” текущего кадра, начиная от момента фазовой коррекции
(от “начальной точки отсчета”), происходит накопление фазовых расхождений, а в
начале следующего кадра, это накопленное фазовое расхождение сбрасывается, после
чего оно опять начинает накапливаться и т.д., “до посинения”.
Теперь давайте разберемся с тем, что изображено на рис.2.
На этом рисунке изображен случай равенства скоростей приема и передачи.
В этом случае, ошибка выборки (см. Т1 … Т5) не превысит одного периода тактовой
частоты приемника и будет колебаться в интервале от 0 до этого значения.
На рис. 2 это хорошо видно (см. то, что закрашено зеленым цветом).
Таким образом, имеет место быть случай, когда “бега” фазы нет, а фазовые
расхождения не накапливаются, а колеблются в небольших пределах.
Но такой случай очень редок. Почти всегда скорости приема и передачи отличаются.
Как симитировать такой случай?
А очень просто: в простейшем случае, при неизменном номинале скорости передачи,
формируемой в компьютере (неизменной, верхней эпюре), нужно изменить количество
импульсов в кольце счета счетчика импульсов, входящего в состав генератора скорости
обмена модуля USART.
Еще проще: в данном случае, нужно вместо 15-ти импульсов, сделать, например, 14
(одно направление “бега” фазы) или 16 (другое направление “бега” фазы).
Для конкретики, к последнему (16 импульсов) и “привяжусь”.
Получается вот что:

10
На рис. 3, совершенно четко прослеживается процесс накопления фазовых
расхождений, интенсивность которого связана с величиной скорости “бега” фазы (см.
постепенно увеличивающуюся ширину зеленых секторов).
Чем больше расхождение скоростей приема и передачи, тем больше скорость “бега”
фазы и величина накопленных фазовых расхождений.
Скорость “бега” фазы можно оценить по разнице ширины двух соседних, зеленых
секторов.
Примечание: если речь идет о понятии “скорость бега фазы”, то удобнее представить
себе “осциллографическую картинку”, а если речь идет о понятии “накопление фазовых
расхождений”, то удобнее пользоваться эпюрами.
Обращаю Ваше внимание на то, что “бег” фазы и колебания фазы (см. выше)
происходят в комплексе (это и есть 2 источника ошибок/погрешностей).
При более – менее значительном расхождении скоростей приема и передачи,
тенденцию накопления фазовых расхождений определяет “бег” фазы.
Если, за время прохождения кадра, не произошло превышения критической величины
фазового смещения, то байт данных будет принят без ошибок.
При обработке следующего кадра, все повторяется. И т.д.
Как Вам такой способ фазовой коррекции?
Лично мне, нравится.
Сколько раз с ним сталкиваюсь, столько раз и умиляюсь.
Теперь давайте расставим все точки над “i” в понятии “фазовая коррекция”.
Атрибутом фазовой коррекции, в ее стандартном понимании, являются “скачки” фазы
такта (или его “производной”) приемника ведомого устройства относительно такта (или
его “производной”) передатчика ведущего устройства.
В данном случае, таких “скачков” нет.
Означает ли это то, что фазовой коррекции нет?
Нет, не означает.
Почему?
Потому, что речь идет о косвенном (опосредованном) способе фазовой коррекции.
Она осуществляется не с помощью “скачков” импульсной последовательности такта
(или его “производной”) приемника ведомого устройства относительно такта (или его
“производной”) передатчика ведущего устройства, а с помощью коррекции процедуры
подсчета импульсов (сброс на начало счета. По сути своей, это тот же “скачек”).
Результаты их подсчетов определяют моменты выборок уровней битов кадра.
А ради этого и “кровь льется”.
Главная задача решена, только не “в лоб”, а через “задний проход” (изощренно).
Таким образом, имеет место быть разновидность фазовой коррекции, которую я
“обозвал” косвенная, фазовая коррекция.
Только учтите, что такого определения Вы нигде не встретите. Это моя фантазия.
И наконец (“на закуску”), давайте разберемся с “глобальным бардальеро”, связанным
со словом “асинхронный”.
“Асинхронный” значит несинхронный.
По крайней мере, так это слово воспринимается и трактуется большинством авторов,
которые пытаются описать процессы, происходящие при асинхронной работе модуля
USART с компьютером (и других, подобных систем).
Но ведь слово “несинхронный”, де-юре, предполагает полную “развязку” между тактами
приемника и передатчика (имеется ввиду, например, передатчик компьютера и
приемник модуля USART или наоборот).
Но в этом случае, “как не крути и не верти”, приемник, как минимум, должен
периодически производить фазовую коррекцию!!!
Без этого будет неизбежный “Гитлер капут”, так как, если, в процессе работы, фазу
периодически не “отфутболивать” к “начальной точке фазового отсчета”, то превышений
критической величины фазового смещения долго ждать не придется, причем, они будут
достигаться периодически и не контролируемо.
Пример?
Перечитайте то, что написано выше.
Как это “состыковать” со словом “асинхронный”?
Лично для меня, тайна сия велика есть.

11
На мой взгляд, в данном случае, более уместно слово “псевдоасинхронный” или
“квазиасинхронный”.
С достаточно высокой степенью вероятности, предполагаю, что сей “разнобой”
порождает в умах не только начинающих, но и давно начавших, грандиозный
понятийный “бардак” (конфликт).
Кстати, на мой взгляд, это одна из главных причин того, что “въезд” в “асинхронные
дела” происходит так туго.
Даже “крутые” спецы “зацикливаются” на стандартном понятии “асинхронный”,
сознательно или бессознательно боясь вступить с таким “крутым” авторитетом в
прямой конфликт. Это “сильно тормозит процесс познания”.
В подобных рассмотренному случаях, буквальные трактовка и понимание слова
“асинхронный”, вольно или не вольно, свидетельствует о поверхностном суждении, а
поверхностное суждение всегда маскируется (Чем? Домыслите сами).
Среди большого количества информации по модулю USART, я так и не нашел
внятного и хотя бы более – менее детального объяснения его работы в асинхронном
режиме.
В лучшем случае - короткие и туманные фразы о накоплении фазовых расхождений, а
каков “механизм” их накопления, и каким образом модуль USART “умудряется
работать” в асинхронном режиме - молчек.
Прошу принять это к сведению.
Таким образом, в результате “русского бунта - беспощадного и кровавого”, “родилась”
“связка” из двух понятий: “псевдоасинхронный” и “косвенная, фазовая коррекция”.
На мой взгляд, оперирование этими понятиями, при условии понимания их сути, очень
“облегчит жизнь” (и не только в отношении модуля USART).
И еще пара замечаний.
1. Описанная выше система косвенной, фазовой коррекции, является очень
малоинерционной.
И в самом деле, для сброса счетчика количества импульсов в ноль, много времени не
нужно (перепад).
Если не брать в расчет эти мизерные интервалы времени, то такого рода фазовую
коррекцию можно считать безинерционной (большой плюс).
2. Модуль USART позволяет выставить и нестандартные скорости, но при работе в
“связке” с компьютером, этот вариант не подходит, ведь компьютер поддерживает
только стандартные скорости.
Поэтому, изначально, скорость обмена данными нужно выбирать из списка стандартных
скоростей, поддерживаемых компьютером, а потом выставлять в модуле USART эту
скорость.

По дальнейшей стратегии “въезда”: “бабушку” конечно “лохматить” нужно, но только с


умом, по принципу “взлохматил - причесал”.
В противном случае, ее можно “залохматить до смерти”, а это не умно и аморально.
Так как, в этом подразделе, “бабушку” я основательно “взлохматил”, то в следующем
подразделе, буду ее “причесывать”.

"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru

12