Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Работа с портами ввода/вывода



Порты ввода/вывода пожалуй важнейшая часть микроконтроллера, без неё всё остальное просто бессмысленно. Сколько бы не было у контроллера памяти, периферии, какой бы высокой не была тактовая частота - это всё не имеет значения если он не может взаимодействовать с внешним миром. А взаимодействие это осуществляется через эти самые порты ввода/вывода.

Каждому порту в МК AVR соответствуют минимум 3 регистра:

- DDRx – регистр направления данных (х – буква соответствующего порта, например DDRB – регистр направления данных Порта В). Этот регистр определяет, как должен быть сконфигурирован вывод порта – как вход или как выход. Если в бит этого порта записать 1, то соответствующий вывод порта будет работать как выход; если записать 0, то соответствующий вывод порта будет работать как вход. Например, если в регистре DDRB записано число 01000011, то это значит, что 0-й, 1-й, и 6-й выводы Порта В сконфигурированы как выходы, а остальные как входы.

- PORTx – выходной регистр порта х (например, PORTВ – выходной регистр Порта В). В биты этого регистра записывают те значения, которые хотят получить на выводах порта, при условии, что выводы сконфигурированы как выходы.

Если вывод сконфигурирован как вход, то при записи в соответствующий бит регистра PORTx 1 этот вывод становится «входом с подтяжкой», т.е. этот вывод через резистор примерно 100…150 кОм, находящийся внутри МК, подключается («подтягивается») к напряжению питания МК. Т.о., при отсутствии сигнала на этом входе будет уровень логической 1.

- PINx – выводы порта х (например, PINВ – выводы Порта В). Этот регистр содержит значения логических уровней, которые к настоящему времени присутствуют на физических (т.е. реальных) выводах порта. Этот регистр доступен только для чтения.

Рис. 1.5. Моделирование работы регистров портов ввода/вывода эмулятора AVR Studio 4

Побитовый доступ к регистрам ввода/вывода осуществляется путем добавления битов после имени регистра. Например, DDRB.1=0; PORTB.3=1; a=PINB.5.

Запись DDRB = 0xFF; означает, что все выводы порта B будут сконфигурированы на выход. Префикс 0x означает, что в данной записи используется шеснадцатиричная система счисления (иногда используют букву h – от англ. Hexadecimal). Для обозначения двоичной системы счисления используется префикс b (От англ. binary). Тогда вышеуказанная запись будет иметь вид – DDRB = 0b11111111;

Каждый бит регистров DDRx может быть установлен отдельно. Например, чтобы сконфигурировать отдельно вывод PD2 как выход, нам необходимо в соответствующий бит регистра DDRD записать 1. Для этого применяют следующую конструкцию.

DDRD |= 1< < 2;

1< < 2 - осуществляет сдвиг единички влево на 2 бита, то есть справа добавляются два нулевых бита и получается 100, а знак " |", стоящий перед знаком присваивания " =", осуществляет операцию побитного логического сложения.

При логическом сложении 0+0=0, 0+1=1, 1+1=1. Операцию логического сложения по-другому называют операцией ИЛИ (английское название OR).

Таким образом, к битам, хранящимся в регистре DDRD, прибавляется двоичное 100, представленное в 8-битном регистре микроконтроллера как 00000100, и результат записывается обратно в регистр DDRD.

Чтобы сконфигурировать отдельно вывод PD2 как вход, нам необходимо в соответствующий бит регистра DDRD записать 0. Для этого применяют следующую конструкцию.

DDRD & = ~(1< < 2);

В данном случае результат сдвига единицы на две позиции влево инвертируется с помощью операции побитного инвертирования, обозначаемой значком " ~ ".

Например, запись PORTC & = ~(1< < 2); будет аналогична записи PORTC = PORTC & ~(1< < 2); Порядок выполнения операций следующий:

Пусть в порт С записано число PORTC = 0 b 00011111;

1: (1< < 2) – сдвиг единицы влево на две позиции = 00000100;

2: ~(1< < 2) – инверсия предыдущего результата = 11111011;

3: PORTC & = ~(1< < 2); – конъюнкция предыдущего значения, записанного в порт С, и полученного результата, то есть (00011111) & (11111011) = 00011011;

Работа с памятью констант EEPROM

При программировании микроконтроллеров AVR иногда возникает потребность сохранять данные, которые после выключения питания или сброса контроллера не изменяли бы свое значение. Для этих целей в составе AVR есть энергонезависимая память данных EEPROM (Electrically Erasable Programmable Read-Only Memory — электрически стираемое перепрограммируемое ПЗУ).

EEPROM имеет адресное пространство отличное от адресных пространств ОЗУ и flash памяти, в котором можно читать и записывать одиночные байты. В зависимости от модели микроконтроллера EEPROM может иметь объем от 512 байт (как, например, в микроконтроллере atmega16) до нескольких килобайт. Гарантированное количество циклов перезаписи этой памяти составляет не меньше 100000.

Объявление переменных в EEPROM

Использование EEPROM начинается с объявления переменных, хранящиеся в этой памяти. Синтаксис объявления таких переменных отличается от объявлений обычных переменных (хранящихся в ОЗУ) только наличием ключевого слова. В зависимости от компилятора данное ключевое слово может быть разным.

Объявление переменной в EEPROM для IAR AVR и CodeVision AVR:

__eeprom int a; // целочисленная переменная

__eeprom int set[8]; //объявление массива челочисленных переменных

__eeprom int data[3] = {11, 3, 13}; //объявление массива и его инициализация

int __eeprom * pSetting; //указатель на 8-ми разрядную переменную в EEPROM, который сам хранится в RAM


Поделиться:



Последнее изменение этой страницы: 2019-10-05; Просмотров: 216; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.01 с.)
Главная | Случайная страница | Обратная связь