Урок 2. Порты ввода/вывода
Здравствуйте. Как видно из заголовка, сегодня мы рассмотрим порты
ввода/вывода МК. Давайте зададимся вопросом, а на кой черт вообще эти порты
нам нужны? А нужны они для того, чтобы наш МК помимо выполнения задачи внутри
себя, смог об этом поведать миру. Почему я вывел в отдельный урок только
порты ввода/вывода? А вот почему:
1. Каждый из портов является 8-ми битным регистром ввода/вывода, способный
как выводить, так и получать данные по 1 байту за один раз. Для этих целей на МК
предусмотрено по 8 ножек на порт.
2. Каждый порт имеет альтернативные функции. Такие как счетчики, компараторы,
входы(АЦП), входы внешнего прерывания, UART и так далее.
Вот это и есть, основные причины по которым мне кажется лучше изучить порты
более подробно в одном уроке.
Давайте сначала рассмотрим порты по прямому назначению, а именно попробуем
ввести данные из вне и вывести наружу. Смотрим на рисунок ниже.
Рисунок 1. Порт PBx.
Что тут я пытаюсь изобразить. А вот что. У МК есть на борту три регистра которые
отвечают за работу порта ввода/вывода. Называются они так DDRx, PORTx и PINx.
Как видно из рисунка, регистр DDRx управляет направлением порта на вход или на
выход. Если установить разряд регистра в "1", то разряд этого порта будет
работать на выход. Если сбросить в "0", то разряд будет работать на вход.
Запутано, да? Все очень просто, если мы захотим выводить данные, ну к
примеру вывести в третий разряд порта В "1", то нам нужно в регистре DDRB
присвоить значение "1" в третьем разряде и в регистр PORTB тоже записать "1"
в третий разряд. А при записи данных в МК значение регистра DDRx должно быть
равно "0". Отсюда: DDRx = 1 выводит данные, DDRx = 0 читает. Если не понятно
не расстраивайтесь, когда начнем программить, все встанет на свои места.
Как вы уже заметили регистр PORTx нужен для вывода данных, а PINx для ввода.
С прямыми обязанностями портов мы разобрались, теперь давайте пробежимся по
альтернативным.
Ну на мой взгляд один из интересных альтернатив - это минимум два разряда
выполняющую функцию UART. UART - это COM-порт. Да да тот самый что мы видим
сзади нашего системного блока. Только он не совсем COM. Видите ли что, у COM
порта компьютера физические уровни совсем не те что требуются для работы МК.
+12 и -12 вольт просто убьют МК. А как же быть? Да все просто. Для этих целей
давно были придуманы микросхемы сопряжения уровней. Самая распространенная на
мой взгляд - это MAX232. Но мы отошли от сути дела. UART - это универсальный
асинхронный приемо/передатчик. Те два разряда о которых я говорил, называются:
TXD и RXD. TXD - нужен для передачи данных, а RXD для приема. Мы об этом
поговорим чуть позже, а сейчас достаточно лишь того что я рассказал.
Следующий альтернативой может быть внешние прерывания. Внешние прерывания
очень полезная штука. Что это такое? Ну к примеру у нас работает какой-то узел
с таймером или еще с чем, не суть важно. И вот нам требуется узнать о
каком-нибудь предельном изменении, которое узел генерит например единицей.
То есть всегда висит ноль, а при наступлении события выставляет 1. Можно конечно
читать постоянно порт, но при этом остальная программа будет простаивать, так
как мы постоянно ждем 1 от узла. Это не хорошо. Проще повесить событие на ножку
с внешним прерыванием и заниматься своими делами, а когда узел выдаст нам 1, то
МК остановит программу и побежит обрабатывать прерывание. После выполнения
обработчика прерывания, МК вернется к основной программе и продолжит ее
выполнять с того места где он остановился до обработки прерывания. Вот такая
полезная штука внешние прерывания.
Так же на борту МК есть прекрасная вещь компаратор. Компаратор это
сравниватель. Он сравнивает величины напряжений и в зависимости от того
какое из них выше другого, выставляет на выходе либо 1, либо 0.
Также как альтернатива, есть АЦП. Правда не во всех МК. Ну про АЦП я
рассказывать не буду, тут и так все понятно.
Ну вот вроде и все. Это конечно не все функции которые есть в МК, но этого
на первое время достаточно.
Если что-то не понятно, пишите и я постараюсь ответить на ваши вопросы.
<-Назад Вперед ->