Программирование AVR Введение во встраиваемую электронику, часть 4 Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Введение во встраиваемую электронику, часть 4 Печать
Добавил(а) microsin   

Продолжение переводов руководства для начинающих от SparkFun [1]. Эта часть посвящена обмену данными с помощью последовательного интерфейса UART.

Предыдующая часть: Введение во встраиваемую электронику, часть 3 (варианты тактирования микроконтроллера, подключение кварцевого резонатора, программирование фьюзов).

ATmega168 обладает богатой встроенной в ядро аппаратурой. Давайте освоим последовательную передачу данных. У нас уже есть макет работающей системы (микроконтроллер, запущенный на частоте 16 МГц), собранный на breadboard. Мы закачали WinAVR, научились пользоваться компилятором, прошивать программу в память микроконтроллера, попробовали управлять портами на примере мигания светодиодом LED. Настало время передать данные в компьютер и обратно.

Я не особо крутой кодер. Мне просто нужно, чтобы оператор printf() делал то, что он обычно должен делать. Я не использую аппаратный отладчик (наподобие JTAGICE mkII [2] или AVR Dragon), и отлаживаю свои программы с помощью операторов printf. Конечно, такая отладка имеет свои ограничения, но для 90% приложений это работает очень хорошо.

[RS-232]

Сначала окунемся немного в историю интерфейса RS232 (именно его может реализовать встроенный в AVR аппаратный интерфейс UART). Что такое RS232? Это просто имя для стандарта, который был широко известен среди нескольких поколений компьютеров. Первые компьютеры имели последовательные порты, которые использовали RS232, и даже сейчас компьютеры имеют последовательные порты (или как минимум порты USB, которые через специальный переходник USB <--> COM работают как обычный порт RS232). Много лет назад, как и сейчас, последовательные каналы связи были нужны для передачи данных в устройства наподобие принтеров, джойстиков, мышей, модемов, сканеров и т. п., и даже для передачи данных в другой компьютер. Самый простой путь реализовать последовательный интерфейс - передать серию единичек и нулей в компьютер и из него. Получается схема передачи данных точка-точка. С обеих сторон последовательного интерфейса - например, с одной стороны компьютер, с другой стороны принтер - используется заранее обусловленная скорость передачи данных 'bits per second' (bps, бит в секунду). Компьютер передавал бы блок данных принтеру на скорости 9600 bps, и принтер прослушивал бы этот поток 0 и 1, и ожидал бы появление каждого нового бита каждые 1/9600 = 104 мкс (104 микросекунды, 0.000104 секунды). Так как компьютер использует заранее известную скорость, принтер сможет понять и прочитать этот поток данных. На рисунке показана стандартная цоколевка коннектора COM-порта компьютера (это и есть RS-232), расположенного на задней стенке системного блока. Показан вид снаружи, со стороны штырей (разноцветными галочками обозначены соединения RS-232, которые мы будем использовать, остальные сигналы нам не понадобятся).

rs232-pinout

Давайте переключимся теперь в наши дни. Сейчас электроника несколько изменилась. Раньше использовались довольно мощные, высоковольтные устройства. Стандарт RS232 диктует использовать для передачи 1 и 0 уровни напряжения -12V и +12V. Современная электроника не работает с такими высокими положительными и отрицательными напряжениями. В действительности все логические уровни нашей ATmega168 составляют 0V и 5V, и все входные и выходные сигналы должны лежать в этом диапазоне напряжений. Как же сделать, чтобы 5V микроконтроллер смог работать с напряжениями +/-12V интерфейса RS232? Эта проблема решается применением специальной микросхемы, которая чаще всего известна как MAX232 (название очень напоминает RS232, верно?).

MAX232

Микросхема MAX232 изначально была разработана компанией Maxim. Это преобразователь уровней цифровых сигналов. Микросхема преобразует сигналы +/-12V интерфейса RS232 в сигналы 0/5V, которые может воспринять ATmega168. Микросхема также увеличивает уровни выходных сигналов ATmega168, чтобы они соответствовали уровням +/-12V протокола RS232, чтобы компьютер мог понять ATmega168, и наоборот. Чтобы наш ATmega168 мог передать последовательные символы данных в компьютер, мы должны передать эти сигналы через схему на MAX232, в результате чего компьютер получит сигналы RS232 с уровнями +/-12V. Не беспокойтесь о том, что микросхема преобразователя уровней промаркирована как 'ICL232' или 'ST232' - это просто аналоги MAX232. Имя MAX232 стало нарицательным, точно таким же как "ксерокс" и "кока-кола". Все эти преобразователи уровней RS232 работают примерно одинаково, и часто даже имеют одинаковую цоколевку выводов и похожую схему включения (может варьироваться напряжение питания 3.3V или 5V, а также номиналы конденсаторов вольтдобавки).

Вот типичная схема включения MAX232, которую мы соберем на плате breadboard:

UART-MAX232

Для генерации повышенных напряжений MAX232 использует 3 конденсатора вольтдобавки (C5, C6, C7), их нужно подключить к микросхеме. Также обязательно нужен конденсатор фильтра питания C8 (так называемый развязывающий конденсатор) - он сглаживает пульсации, и должен быть установлен максимально близко к микросхеме MAX232 (подключен к выводам VCC и GND проводами минимальной длины). Для генерации повышенных напряжений MAX232 использует быстро переключающиеся ключи, которые генерируют значительные импульсы тока. Эти импульсы тока образуют провалы и выбросы в напряжении питания, и C8 помогает их уменьшить. Будет ли работать микросхема MAX232 и без конденсатора C8? Да, будет. Но попробуйте-ка обойтись без этого конденсатора... Наступит такой день, когда что-то перестанет работать, и Вы не будете знать почему. Может быть, ошибка в коде? Или что-то коротит? Может, не контачит? Или все-таки мало поставлено развязывающих конденсаторов?

Развязывающий конденсатор предназначен для быстрой подачи дополнительной энергии, когда от тока нагрузки проседает питающее напряжение - примерно так же, как срабатывает UPS (источник бесперебойного питания), когда сетевого напряжения для питания компьютера недостаточно. Чем дальше находится от микросхемы развязывающий конденсатор, тем выше может быть уровень пульсаций на микросхеме - так как провода имеют собственное сопротивление и индуктивность. Хорошая практика разработки электронных схем - всегда ставить как минимум один конденсатор 0.1uF рядом с микросхемой, и подключать его к выводам её питания максимально короткими и широкими проводниками. Хорошо подойдет расстояние полдюйма и меньше; на плате breadboard это обеспечить довольно трудно, и расстояние будет больше. Конечно, фильтрующие конденсаторы не будут так же хорошо работать, как на хорошо разведенной печатной плате, но их наличие на breadboard не помешает.

JP2 это коннектор DB9 мама. Он так называется 'DB9' потому, что имеет 9 контактов универсального стандартного коннектора RS232. Вам понадобится стандартный "прямой" кабель папа-мама, чтобы соединить коннектор, подключенный к коннектору DB9 breadboard, с компьютером (у компьютера коннектор папа). Окончание 'папа' кабеля имеет металлические штыри, а окончание 'мама' имеет гнезда в черной (или белой, или синей) пластмассе, которые принимают подключение штырей. Если Вы рассмотрите близко соединители папа и мама, то заметите возле их контактов цифровую нумерацию штырьков и гнезд.

RS232-straight-cable DB9-male-pins-numbering

Что это все для нас дает? ATmega168 передает 5V сигнал TX в микросхему MAX232. MAX232 преобразует 5V сигнал TX в сигнал с уровнями +/-12V RS232, который компьютер может принять через свой порт DB9 на задней стенке системного блока (или порт DB9 может быть на переходнике USB <--> COM). Обычно это выглядит сначала несколько уродливым. Но такая связь безусловна необходима, она будет использоваться почти в каждом приложении, которое Вы будете разрабатывать.

Прим. переводчика: в Arduino этот канал последовательного обмена данными через UART используется не только для отладки операторами printf, но и для загрузки кода в память микроконтроллера (с помощью бутлоадера UART).

UART-loop-back

Действительно, в современных компьютерах порты RS-232 больше не устанавливают, потому что этот интерфейс считается устаревшим. Вместо него для подключения любых периферийных устройств повсеместно используют интерфейс USB. Поэтому Вы можете приобрести преобразователь USB <--> RS-232, и подключить к своему компьютеру, после чего операционная система Windows обнаружит и установит обычный COM-порт. На фото показан обычный вид такого преобразователя.

USB-RS-232

Кроме того, Вы даже можете обойтись без микросхемы MAX232, если примените переходник USB <--> RS-232 TTL. На ebay, dealextreme и aliexpress такие переходники стоят еще дешевле (примерно 2..3 доллара). Прогуглите ключевые слова usb rs232 ttl converter site:ebay.com и увидите множество предложений по продаже. На фото показаны для примера два таких переходника. Один сделан на микросхеме FT232R, другой на CP2102.

USB-RS232-TTL-FT232R USB-RS232-TTL-CP2102

После того, как Вы все соединили наподобие того, как показано на фото, нужно запустить программу терминала на компьютере. Если Вы работаете под Windows, то у Вас есть программа Hyperterminal, которая обычно доступна через меню Пуск -> Все программы -> Стандартные -> Связь. Те, кто работает в Linux и MacOS, наверняка тоже знают, как запустить программу терминала.

Все терминальные программы выполняют одну и ту же базовую функцию: обеспечивают обмен данными через последовательный канал связи. Все, что Вам нужно - всего лишь указать несколько простых правил, чтобы микроконтроллер мог успешно связаться с компьютером. Давайте посмотрим, как это делается на примере скриншотов программы Hyperterminal, иллюстрирующих создание нового соединения:

UART-hyperterminal-conn-setup1

Здесь нужно указать имя соединения, оно может быть произвольным.

UART-hyperterminal-conn-setup2

На следующем экране нужно выбрать COM-порт, который используется. Предположим, что это COM1.

UART-hyperterminal-conn-setup3

Здесь нужно задать параметры соединения (9600bps 8-N-1 without flow control).

Самые главные настройки здесь 9600bps и 8-N-1. Это означает, что обмен данными будет вестись со скоростью 9600 бит в секунду, и каждый фрейм будет передан в виде 8 бит данных, без четности, и будет использоваться 1 стоп-бит. Тип настройки фрейма 8-N-1 самый распространенный. Если Вам нужны подробности, то обратитесь к Википедии и прочтите, что такое бит четности (parity), что стоп-бит бывает длиной 1.5 бита, и что бывают фреймы длиной до 5 бит. Но обычно ничего другого, отличающегося от 8-N-1, в мире микроконтроллеров не используется.

Прим. переводчика: на Windows в качестве терминальной программы можно использовать множество программ: TerraTerm, SecureCRT, putty и многие другие. Настройка "without flow control" означает без управления потоком данных, т. е. для подтверждения приема и передачи не будут использоваться ни аппаратные, ни логические сигналы. Подробнее, что это значит, лучше осведомиться в Википедии.

Отлично, у Вас есть открытое окно гипертерминала с настроенным соединением, в котором Вы можете печатать символы, набирая их на клавиатуре (при этом вводимые символы по каналу связи будут отправляться в порт DB9 RS232). Также у Вас есть MAX232 (или подобная эквивалентная микросхема) которую Вы установили на макет и подключили к ней питание. Перед тем, как соединить MAX232 с микроконтроллером, следует проверить её работу. Самый простой способ - замкнуть накоротко друг на друга сигналы TX и RX (т. е. выводы 11 и 12 микросхемы MAX232). Такое тестовое соединение называется 'loop-back' (толстый желтый провод на фото выше).

После установки перемычки 'loop-back' подключите MAX232 кабелем к компьютеру, включите питание на breadboard, и нажмите клавишу 'A', находясь в фокусе окна программы гипертерминала. Это нажатие преобразуется в код символа A, и затем будет передано в виде единичек и нулей через последовательный порт, и затем через перемычку 'loop-back' вернется обратно в компьютер и будет отображено в окне терминала в виде введенного символа 'A'. Символ A будет закодирован 8 битами '01000001' в битовом представлении, что равно 65 в десятичном и 41 в шестнадцатеричном виде. Эти нолики и единички пройдут весь путь через MAX232, установленную на Вашей плате, сигнал будет преобразован с уровней RS232 в уровни TTL на замкнутых выводах 11 и 12 (R1OUT желтой перемычкой замкнут на T1IN), затем обратно будут преобразованы из уровней TTL в уровни RS232 и попадут обратно в компьютер. Все, что Вы ввели на клавиатуре, должно появляться на экране терминала, это и есть суть теста loop-back. Если снять перемычку, то вводимые на клавиатуре символы не будут отображаться на экране терминала. Все получилось? Отлично. В будущем, когда нужно будет проверить канал связи таким способом, просто замкните сигналы TX и RX на другом конце линии.

Прим. переводчика: чтобы передача данных успешно заработала, необходимо выход передатчика компьютера TX соединить со входом приемника R1IN MAX232, и вход приемника компьютера RX соединить с выходом микросхемы T1OUT MAX232.

Все в порядке, MAX232 работает корректно. Теперь подключите выводы цепи TX и RX к ATmega168, микросхема MAX232 теперь будет подключена к микроконтроллеру (см. полную схему макета ниже).

UART-full-sch

Вы можете заметить, что на схеме магически появился конденсатор C9 рядом с ATmega168. Это развязывающий конденсатор по питанию для ATmega168 номиналом 0.1uF. Этот конденсатор нужно установить как можно ближе к выводам VCC (ножка 7 микроконтроллера) и GND (ножка 8) ATmega168, чтобы снизить шум по питанию, который создает ядро ATmega168. Повторюсь - без этого конденсатора все тоже наверняка будет работать, но я хочу приучить Вас всегда ставить развязывающие конденсаторы во избежание глюков и неприятностей.

UART-breadboard-maket

На фото показано соединение ATmega168 с MAX232 желтым и красным проводами. Внимательный читатель заметит, что на фото вместо MAX232 стоит на самом деле SP3232 (EBCP). Это микросхема компании Sipex, продвинутый аналог MAX232. Заметили цифру 3 перед 232? Оригинальные MAX232 рассчитаны на напряжение питания 5V и логические уровни 5V. Поскольку цифровые схемы на микроконтроллерах имеют тенденцию использования низких напряжений питания 3.3V, то производители микросхем переработали MAX232 на более эффективную версию, которая при малом напряжении питания 3.3V также может генерировать 12V уровни RS232. Напряжение 3V отражено в названии SP3232. Микросхема SP3232 может успешно принимать 3V сигналы и успешно конвертировать их в уровни RS232.

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

Следующая часть: Введение во встраиваемую электронику, часть 5 (компилирование с помощью AVR-GCC, работа с последовательным портом через printf).

[Ссылки]

1. Beginning Embedded Electronics site:sparkfun.com.
2. Atmel AVR JTAGICE mkII.

 

Добавить комментарий


Защитный код
Обновить

Top of Page