Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





ГЛАВА 3
Знакомство с периферийными устройствами
"Периферийными" в структуре AVR называются все устройства, внешние по отношению к ядру и памяти. В "обычных" процессорах (т. е. предназначенных для работы в составе компьютеров) такие устройства, как правило, реализуют в виде отдельных микросхем (например, входящих в состав чипсетов). Общее для "микро-ЭВМ" и "обычных" вычислительных систем свойство периферийных устройств — их переменный состав, т. е. в разных системах (для МК— в разных моделях процессоров) те или иные компоненты могут отсутствовать.
Наиболее популярные периферийные устройства (таймеры, порт UART, аналоговый компаратор и сторожевой таймер) имеются практически во всех моделях, но это не значит, что вы их обязательно должны задействовать. Тем не менее их номенклатуру следует учитывать при выборе той или иной модели. Во-первых, наличие большого числа периферийных устройств, даже если они не задействованы, увеличивает общее потребление микросхемы, во-вторых, нет никакого резона ставить ATmega2560 в 100-выводном корпусе там, где достаточно ATmega8 в корпусе с 28-ю выводами. Кроме того, некоторые периферийные устройства приходится принимать во внимание, даже если они не используются: типичным примером может быть аналоговый компаратор, который по умолчанию всегда включен и потому может оказывать влияние на потребление в "спящем" режиме. Чтобы этого избежать, его следует специально выключать, лучше всего это делать всегда в самом начале программы "на всякий случай".

Все периферийные устройства адресуются через регистры ввода-вывода (РВВ, I/O registers), аналогичные портам ввода-вывода в архитектуре IBM PC. Отметим, что в PIC-архитектуре взаимодействие с периферийными устройствами организовано проще — там можно заносить данные непосредственно в порты, без промежуточного переноса значения РВВ в РОН (с помощью команд in и out). В AVR прямая модификация значений РВВ ограничена и обставлена рядом условий, но в целом это не приводит к значительным трудностям: программы для AVR в общем все равно получаются более эффективными. В этой книге в целях унификации изложения прямую модификацию РВВ (например, тот факт, что команды установки битов sbi/cbi работают с РРВ с адресами $20 и менее) мы будем использовать ограниченно (путаницы — какая команда с чем работает, а с чем нет — хватает и без того).

В отличие от "регистров ввода-вывода", в архитектуре AVR, как и в других архитектурах МК, термин "порты ввода-вывода" (I/O ports) обозначает параллельные порты для обмена данными с внешними устройствами. С них мы и начнем рассмотрение периферийных устройств.

Порты ввода-вывода
Портов ввода-вывода в разных моделях может быть от 1 до 7. Номинально порты 8-разрядные, в некоторых случаях разрядность ограничена числом выводов корпуса и может быть меньше восьми. Порты обозначаются буквами А, В, С, D и далее, причем необязательно по порядку: в младших моделях могут наличествовать, например, только порты В и D (как в ATtiny2313) или вообще только один порт В (как в ATtinyljt). Для сокращения числа контактов корпуса в подавляющем большинстве случаев внешние выводы, соответствующие портам, кроме своей основной функции (двунаправленного ввода-вывода) несут также и дополнительную.
Отметим, что никакого специального переключения выводов портов не требуется, просто, если вы, к примеру, в своей программе инициализируете последовательный порт UART, то соответствующие выводы порта (например, в ATmega8335 это выводы PD0 и PD1) будут работать именно в альтернативной функции, как ввод и вывод UART. При этом в промежутках между таким специальным использованием выводов они в принципе доступны, как обычные двунаправленные выводы. На практике приходится применять схемотехнические меры для изоляции функций друг от друга, поэтому злоупотреблять этой возможностью не рекомендуется: особенно это критично для выводов того порта (обычно это порт А), к которому подсоединены входы АЦП. Более того: при наличии АЦП не рекомендуется задействовать для выполнения логических функций другие выводы того же порта (которые в работе АЦП не участвуют), потому что это значительно увеличивает уровень помех (подробнее см. далее в этой главе, а также главу 10).

Выводы портов в достаточной степени автономны, и их режим может устанавливаться независимо друг от друга. По умолчанию при включении питания все дополнительные устройства отключены, а порты работают на вход, причем находятся в состоянии с высоким импедансом (т. е. высоким входным сопротивлением). Работа на выход требует специального указания, для чего в программе нужно установить соответствующий нужному выводу бит в регистре направления данных (этот регистр обозначается DDRX, где х— буква, обозначающая конкретный порт, например для порта А это будет DDRA). Если бит сброшен (т. е. равен лог. 0), то вывод работает на вход (установка по умолчанию), если установлен (т. е. равен лог. 1) — то на выход.
Для установки выхода в состояние 1 нужно отдельно установить, а для установки в 0 — сбросить соответствующий бит в регистре данных порта (обозначается PORTX). Направление работы вывода (вход-выход, регистр DDRX) И его состояние (0-1, PORTX) путать не следует.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru