Эффективное управление портами ввода/вывода tinyAVR

December 7, 2014 by admin Комментировать »

С этого раздела мы начинаем писать код на языке С. Начнем мы с портов ввода/вывода, которые являются самыми критичными аспектами управления. Это такие объекты, которые принимают ввод от пользователя и отображают результаты вашей программы. Остальная часть обработки находится внутри контроллера.

Микроконтроллеры AVR имеют множество портов ввода/вывода с именами PORTA, PORTB, PORTC и т. д. Число контактов каждого порта ввода/вывода не более восьми. Каждый порт имеет три связанных с ним регистра:

□              DDRx — регистр направления передачи данных;

□              PORT* — регистр вывода данных;

□              PIN* — регистр ввода данных,

где х — имя порта. Каждый из этих трех регистров 8-разрядный и предназначен для манипулирования восемью битами порта. Биты этих трех регистров (да и вообще всех регистров AVR) нумеруются от 0 (самый младший бит) до 7 (самый старший бит). DDRxr конфигурирует контакты как вход или выход (в зависимости от значения бита — 1 (выход) или 0 (вход)). Регистр PORT* используется для вывода (если контакт объявлен как выход) или для включения (1)/выключения (0) нагрузочных резисторов (если контакт объявлен как вход). Регистр PIN* служит для чтения значения логического уровня на контактах (если они объявлены как вход).

В компиляторе WinAVR GCC все периферийные регистры AVR доступны через макросы и пишутся заглавными буквами. Таким образом, следующие эквивалентные строки кода объявляют все контакты PORTB выходами:

DDRB =255; //В десятичной системе

DDRB = Oxff; // В шестнадцатеричной системе

DDRB = 0Ы1111111; // В двоичной системе

Обратите внимание, что для всех восьми контактов конкретного порта есть только один набор регистров, что создает определенную проблему в том случае, когда вы хотите работать с ними по отдельности.

Например, оператор:

PORTB = 0Ь00000010;

выставляет высокий уровень на контакте 1 порта PORTB. Теперь предположим, что мы хотим подать логическую 1 на контакт 3 того же самого порта. Вы можете написать:

PORTB = 0Ь00010000;      ,

но при этом на контакт 1 подается логический уровень 0 (а вы не собирались этого делать). Следовательно, должен быть способ отслеживания отдельных битов — и именно здесь в игру вступают операторы &, ~, |, л, « и ».

Источник: Гадре, Д., Занимательные проекты на базе микроконтроллеров tinyAVR / Дхананья Гадре, Нигул Мэлхотра: Пер. с англ. — СПб.: БХВ-Петербург, 2012. — 352 с.: ил. — (Электроника)

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты