Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

44 Часть /. Общие принципы устройства и функционирования Аtте/ АVR мально возможного в байтовой адресации значения $ FF) . Для регистров в этом до­ полнительном пространстве не работают многие удобные команды: in/out, sЬi /cЬi и т. п., и их можно адресовать только универсальным способом - как ячейки па­ мяти. Между тем в это пространство могут «переехать» не только регистры допол­ нительных по отношению к младшим моделям устройств, но и многих из привыч­ ного состава периферии: регистры управления UART, Timer l и Тimer2, TWI и т. д. Чтобы не создавать лишних сложностей при изучении ассемблера, мы не станем пользоваться такими моделями контроллеров, - как вы увидите, для львиной доли любительских задач они просто не потребуются. Но, конечно, далее (см. главу 6) я расскажу в подробностях, как и чем можно заменить привычные команды при переходе к более «продвинутым» моделям, чтобы вы не потерялись при возникно­ вении такой задачи, - ведь среди них, между прочим, и ардуиновская ATmega328 . В отличие от «регистров ввода/вывода», в архитектуре АVR, как и в других архи­ тектурах МК, термин «порты ввода/вывода» (1/0 ports) обозначает параллельные порты для обмена данными с внешними устройствами. С них мы и начнем рас­ смотрение периферийных устройств. Порты ввода/вывода Портов ввода/вывода в разных моделях может быть от 1 до 7 . Номинально все пор­ ты 8-разрядные, в некоторых случаях разрядность ограничена числом выводов корпуса и может быть меньше восьми. Порты обозначаются буквами А, В, С, D и далее, причем необязательно по порядку - в младших моделях могут наличест­ вовать, например, только порты В и D (как в ATtiny23 1 3) или вообще только один порт В (как в младших Tiny) . Для сокращения числа контактов корпуса в подавляющем большинстве случаев внешние выводы, соответствующие портам, кроме своей основной функции (дву­ направленного ввода/вывода) несут также и дополнительную. Отметим, что ника­ кого специального переключения выводов портов не требуется - просто, если вы, к примеру, в своей программе инициализируете последовательный порт UART, то соответствующие выводы RxD и TxD (в ATmega8 они совпадают с выводами PDO и PD l порта D) будут работать именно в альтернативной функции - как ввод и вы­ вод UART. При этом в промежутках между таким специальным использованием выводов они остаются доступны как обычные двунаправленные выводы. На прак­ тике при одновременном использовании приходится применять схемотехнические меры для изоляции функций друг от друга, поэтому злоупотреблять этой возмож­ ностью не рекомендуется, - особенно это критично для выводов того порта (обычно это порт А), к которому подсоединены входы АЦП. Более того - при на­ личии АЦП не рекомендуется задействовать для выполнения логических функций другие выводы того же порта (которые в работе АЦП не участвуют), потому что это значительно увеличивает уровень помех (подробнее об этом рассказано в этой главе далее, а также в главе 1 1 ) . Выводы портов в достаточной степени автономны, и их режим может устанавли­ ваться независимо друг от друга. По умолчанию при включении питания все до-

RkJQdWJsaXNoZXIy MTExODQxMg==