При коммутировании периферийных устройства с компьютером во многих случаях можно использовать современные микроконтроллеры. Например, необходимо снимать показания со множества датчиков и пересылать эти данные на компьютер. В этом случае на стороне датчиков используется простой микроконтроллер, снимающий с них информацию и передающий ее в компьютер для дальнейшей обработки.
Рассмотрим вариант соединения микроконтроллера с компьютером через канал RS-232 в соответствии со стандартом. Для разработки используем микроконтроллеры Atmel, в которых предусмотрена аппаратная функция UART (Universal Asynchronous Receiver and Transmitter – универсальный асинхронный приемопередатчик).
Напомним, что канал RS-232 предназначен для обмена информацией между двумя устройствами как в синхронном, так и в асинхронном режиме.
В компьютере для организации COM-порта используется только асинхронный способ передачи и лишь часть сигналов и функций, предусмотренных стандартом RS-232C.
В микроконтроллерах AVR с UART аппаратно-программными средствами поддерживаются только две линии: линия приема (RxD) и линия передачи данных (TxD).
Для связи компьютера с микроконтроллером будем использовать только общий провод и две сигнальные линии. По одной из них данные передаются от микроконтроллера к компьютеру, по другой – в обратном направлении.
Данные по каналу передаются последовательно, бит за битом. Информация передается группами битов. Для выделения группы перед ее началом передается стартовый бит, по окончании передачи группы – один или два стоповых бита, которым может предшествовать бит четности.
Будем считать, что передаваемая группа содержит стартовый бит, 8-битную информационную группу, бит четности и один стоповый бит.
И передающее, и принимающее устройства должны работать на одинаковой скорости, которая может быть выбрана из предусмотренного стандартом ряда.
Логическая единица передается по каналу RS-232 уровнем напряжения -3 … -12В относительно общего провода, логический нуль – уровнем напряжения +3 … +12В. Указанные уровни напряжений приведены ко входу приемника сигнала.
Уровни сигналов в диапазоне -3 … +3В попадают в зону нечувствительности и не воспринимаются приемником.
Компьютер снабжен необходимым преобразователем уровней, и на контактах его COM-портов уровни сигналов соответствуют требованиям стандарта RS-232.
На линиях RxD и TxD микроконтроллера уровни сигналов соответствуют уровням TTL-логики, поэтому для подключения микроконтроллера к каналу RS-232 требуется преобразователь уровней.
Линия TxD микроконтроллера подключается к линии RxD компьютера через преобразователь уровня, а линия TxD компьютера – к линии RxD микроконтроллера также через преобразователь уровня.
Подобные преобразователи уровней в интегральном исполнении выпускаются многими компаниями, например Analog Devices, Maxim.
Обычно в наименовании преобразователей присутствуют числа 232, 202, 242. Чаще встречаются микросхемы с двумя или четырьмя преобразователями.
Микросхемы преобразователей могут работать с конденсаторами емкостью 0,1 мкФ или с электролитическими конденсаторами емкостью 1 мкФ, обычно это определяется буквой, следующей за числом в наименовании микросхемы. Также выпускаются преобразователи, не требующие конденсаторов, но их цена несколько выше.
В компьютере для организации COM-порта используется либо 9-контактный (DB-9M), либо 25-контактный разъем (DB-25M), поэтому для изготовления кабеля надо подобрать подходящий к разъему COM-порта вашего компьютера разъем DB-9F или DB-25F.
Необходимо обратить внимание на частоту кварцевого резонатора ZQ1. Она равна 7,3728 МГц. Использование кварцевого резонатора с такой частотой позволяет точно устанавливать скорости передачи, рекомендованные стандартом RS-232.
Протокол обмена
Обычно программное обеспечение для компьютера и для микроконтроллера разрабатывают разные специалисты или группы специалистов.
Протокол обмена должен содержать всю необходимую информацию для разработки обеих программ так, чтобы независимо созданные программы, удовлетворяющие всем требованиям протокола, могли быть в кратчайший срок стыкованы друг с другом.
В протоколе должны быть учтены все тонкости совместной работы программ, а его положения – быть четкими и не допускать возможности различного толкования. В то же время нет смысла перегружать протокол, например, переписывая из стандарта RS-232 требования к электрическим параметрам сигнала.
Ниже приводится пример протокола обмена с поясняющими комментариями, достаточными для понимания смысла решения поставленной задачи.
Общие положения
Обмен информацией выполняется асинхронными сериями в соответствии с требованиями интерфейса RS-232. Электрические характеристики сигнала также должны соответствовать требованиям интерфейса RS-232C.
Данные передаются сообщениями. Сообщения состоят из 5…134 байт и требуют передачи не чаще одного раза в секунду.
Каждый байт сообщения, состоящий из 8 информационных бит, передается в составе группы из 11 бит. Группа начинается стартовым битом, затем передаются 8 информационных бит, за ними следуют бит четности и стоп-бит.
Параметры передаваемых групп:
- скорость передачи 115200 бит/с;
- 8 информационных бит;
- проверка на нечетность;
- стоп-бит.
Структура сообщения
Сообщения имеют следующий вид: 5A CMD <байты данных> СSH CSL, где 5А – стартовый байт, CMD – байт команды, <байты данных> – их количество зависит от байта команды, CSH и CSL – 2 байта контрольной суммы.
Контрольная сумма получается суммированием всех байтов сообщения в сумматоре длиной в 2 байта. В зависимости от команды старший байт контрольной суммы CSH может не передаваться.
Передаваемые сообщения
В тексте сообщений неизменяемые байты записаны в шестнадцатеричном формате, изменяемые – как подчеркнутые трехсимвольные переменные:
1. Команда ТЕСТ RS-232: 5А 20 00 00 00 00 7А.
2. Ответ на команду ТЕСТ RS-232: 5A 20 CRH CRL CSL, где CRH и CRL – два байта контрольной суммы содержимого памяти программ контроллера, а CSL – младший байт контрольной суммы команды.
3. Команда ПЕРЕДАТЬ БЛОК 128 байт в контроллер: 5A 21 00 00 B00…BFF CSH CSL, где B00…BFF – 128 байт данных, передаваемых из компьютера, а CSH и CSL – два байта контрольной суммы команды.
4. Ответ на команду ПЕРЕДАТЬ БЛОК: 5A 21 00 00 7B.
5. Команда ЗАПРОС БЛОКА 128 байт из контроллера: 5A 22 00 00 00 00 7C.
6. Ответ на команду ЗАПРОС БЛОКА: 5A 22 00 00 B0…BFF CSH CSL, где B00…BFF – 128 байт данных, передаваемых из ОЗУ контроллера, а CSH и CSL – два байта контрольной суммы команды.
7. Команда ОЧИСТИТЬ ОЗУ: 5A 23 00 00 00 00 7D.
8. Ответ на команду ОЧИСТИТЬ ОЗУ: 5A 23 00 00 7D.
9. Команда ЗАПОЛНИТЬ ОЗУ: 5A 24 FIL 00 00 CSH CSL, где FIL – байт, которым заполняется ОЗУ.
10. Ответ на команду ОЧИСТИТЬ ОЗУ: 5A 24 00 00 7E.
11. Сообщение контроллера об ошибках: 5A 0C ERR 00 CSL, где ERR – код ошибки (E0 – ошибка четности, если первый байт команды не 5A, E1 – ошибка контрольной суммы команды, E2 – неизвестная команда), а CSL – младший байт контрольной суммы.
И микроконтроллер, и компьютер проверяют поступающие сообщения, в том числе и на их длину. Проще проверять длину сообщений, когда для одного источника она одинакова. В нашем устройстве команды компьютера имеют длину в 7 байт, а ответы микроконтроллера – 5 байт. Исключения составляют сообщения, содержащие блоки данных. Их длина составляет 134 байта.
Программа для микроконтроллера
Как организовать прием команд, описанных в протоколе обмена? Предположим, все команды содержат одинаковое количество байт, например 7. Тогда после приема первого байта надо принять еще шесть байт, а затем начать обработку принятой последовательности.
Что произойдет при такой организации, если прием первого байта был вызван помехой? Микроконтроллер при этом просто зависнет, ожидая следующих шести байт, а часть следующей команды будет воспринята как продолжение предыдущей. Если длина команд различна, то, приняв первый байт, надо продолжать прием в течение времени, достаточного для приема самой длинной команды, предусмотренной протоколом обмена, а по истечении этого времени проанализировать принятую последовательность.
Поэтому для избежания этой коллизии имеет смысл организовать программу для микроконтроллера следующим образом: после необходимой инициализации программа будет выполнять бесконечный цикл, ожидая прерывания после приема первого байта данных по каналу RS-232. Обработчик прерывания окончания приема символа UART запустит таймер Т0 и вызовет выполнение подпрограммы приема последовательности байтов. Завершение счета таймера Т0 прекратит выполнение подпрограммы приема и инициализирует выполнение ряда подпрограмм анализа принятой последовательности, распознавания команды, ее обработки и передачи ответа микроконтроллером по каналу RS-232.