Портами называют отдельные выводы или группы выводов, через которые информация поступает в микроконтроллер и из микроконтроллера. Количество портов ввода/вывода зависит от модели микроконтроллера. Данные через порт передаются и принимаются параллельно. Стандартный параллельный порт микроконтроллера AVR имеет восемь выводов (разрядов, линий). У микроконтроллера АТ90S8535 (ATmega8535) четыре двунаправленных восьмиразрядных параллельных порта ввода/вывода. Они обозначаются латинскими буквами A, B, C, D. Каждой линии (разряду) порта соответствует определенный вывод микроконтроллера.
Любой порт микроконтроллера можно сконфигурировать как вход или как выход. Кроме того, как вход или выход можно сконфигурировать отдельно и независимо от других любую линию (разряд) порта. Линии портов кроме линий общего назначения часто выполняют функции ввода/вывода внутренних устройств микроконтроллера, например, таймера.
При работе с параллельным портом ввода/вывода используются три регистра, которые находятся в пространстве регистров ввода/вывода памяти данных. Это: регистр вывода данных – PORT, регистр выбора направления передачи данных – DDR, регистр входных данных – PIN.
Регистр PIN обеспечивает возможность только чтения, а регистры PORT и DDR – возможность чтения и записи. Регистр PIN не является физическим регистром, а только виртуальным. При обращении к этому регистру на внутреннюю шину данных поступает логическая информация, которая в этот момент находится на выводах порта.
Для того чтобы вывести данные из микроконтроллера их следует поместить в регистр PORT, а сам порт или отдельные линии порта настроить на выход. Для того, чтобы ввести данные в микроконтроллер, следует опросить регистр PIN.
Регистры порта А: PORTA, $1B($3B); DDRA, $1A($3A); PINA, $19($39).
Регистры порта B: PORTB, $18($38); DDRB, $17($37); PINB, $16($36).
Регистры порта C: PORTC, $15($35); DDRC, $14($34); PINC, $13($33).
Регистры порта D: PORTD, $12($32); DDRD, $11($31); PIND, $10($30).
После обозначения порта указан относительный адрес порта в пространстве регистров ввода/вывода памяти программ, а в скобках указан физический адрес порта в общем пространстве памяти программ.
Для программирования определенной линии порта на вход необходимо в регистре направления передачи данных порта DDR установить в 0 бит с номером этой линии. Для программирования определенной линии порта на выход необходимо в регистре направления передачи данных порта DDR установить в 1 бит с номером этой линии.
При включении питания микроконтроллера по умолчанию все линии автоматически программируются на вход.
Исходное состояние битов 7…0 всех регистров PORT и DDR после включения питания – 0. Исходное состояние битов 7…0 всех регистров PIN после включения питания определяется внешними сигналами (входы отключены от питания и нуля).
Для выполнения работы необходимо знать структуру и функционирование микроконтроллера AT90S8535 (ATmega8535), методы адресации и систему команд.
Программирование порта ввода/вывода заключается в записи определенного числа в соответствующий этому порту регистр DDR. Для записи данных, которые в микроконтроллере представляют целые числа, в область регистров I/O (а именно там находятся регистры DDR) используются два варианта.
Первый вариант: воздействовать на каждый бит регистра DDR по отдельности, используя команды «установить бит в регистре I/O» (SBI) и «очистить бит в регистре I/O» (CBI).
Второй вариант: поместить в регистр DDR такое число, чтобы отдельные биты приняли нужные значения.
На практике в основном используется второй вариант, т.к. он более универсален, а в случае программирования более двух линий используется меньше команд.
Например, необходимо настроить на вход линии С0, С1, а на выход линию С6.
Последовательность команд при первом варианте:
CBI DDRС,0 ;Запись 0 в бит 0 регистра DDRC
CBI DDRС,1 ;Запись 0 в бит 1 регистра DDRC
SBI DDRС,6 ;Запись 1 в бит 6 регистра DDRC
При втором варианте необходимо вначале определить, какое число будет записано в регистр DDR. Для этого рекомендуется изобразить регистр DDR в виде таблицы с восемью ячейками (каждая ячейка представляет отдельный бит), и проставить в каждой ячейке необходимые значения битов, как это показано ниже
С7 С0
|
1 |
|
|
|
|
0 |
0 |
Остальные линии порта, кроме С0, С1, С6 не задействованы. Если к ним ничего не подключено, то их состояние безразлично. Но т.к. в лабораторном стенде ко всем выводам что-то подключено, то не используемые линии необходимо запрограммировать на вход. Таким образом, состояние регистра DDRC должно быть следующим:
С7 С0
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
Двоичное число, которое должно быть записано в регистр 0100000. Для более рационального способа записи обычно двоичные числа переводятся в шестнадцатеричную форму т. к. перевод двоичного числа в шестнадцатеричное занимает меньше времени, чем перевод из двоичного в десятичное.
01000000 2 = 40 16. Напрямую данные в регистры I/O записать нельзя, поэтому данные сначала помещают в один из регистров общего назначения R16...R31, а потом перемещают в регистр DDRC.
Последовательность команд при втором варианте:
LDI R16,$40 ;Записать число 40 16 в регистр R16
OUT DDRC,R16 ;Переместить число 40 16 из регистра R16 в DDRC.
Как видно, при втором варианте программирования используется меньше команд. Следует отметить, что команды SBI и CBI доступны только для 32 регистров I/O с младшими адресами. Для программирования 32 регистров I/O со старшими адресами используется второй способ, а для работы с отдельными битами можно использовать, как промежуточный, бит Т регистра STATUS.
Для тренировки в программировании портов предлагается следующий шаблон текста программы. Вместо многоточия необходимо вставить команды для программирования портов в соответствии со своим вариантом.
.include "8535def.inc" ; подключить файл описания AT90S8535
.cseg ; определение начала сегмента программы (кода)
.org 0 ; определение вектора прерывания по сбросу и подаче питания
rjmp programma ; переход на метку programma
.org $30 ; определение начального адреса программы
programma:
…
…
…
rjmp programma ; перейти на метку programma
Похожие материалы
... ППЗУ при помощи программатора табулированных значений функции , при помощи которых определяем знак нелинейного воздействия. Словесный алгоритм функционирования микроконтроллерного регулятора: 1. Инициализация и настройка МК на ввод сигналов x1 и x2. Порт B на вывод. 2. Измеряем текущее значение x2 3. Проверяем условие 4. Измеряем ...
0 комментариев