Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
404
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

Таблица 1.9.4 – Продолжение

Биты

Конт.

Код

Функция

 

Описание

26–27

14

00

Port 0.29

 

 

 

 

01

AD0.2

Вход 2 АЦП 0

 

 

10

CAP0.3 (Timer 0)

Вход 3 устр. захвата таймера 0

 

 

11

MAT0.3 (Timer 0)

Выход 3 устр. совпадения таймера 0

28–29

15

00

Port 0.30

 

 

 

 

01

AD0.3

Вход 3

АЦП 0

 

 

10

EINT3

Вход 3

внешнего прерывания

 

 

11

CAP0.0 (Timer 0)

Вход 0

устр. захвата таймера 0

30–31

17

00

Port 0.31

Только выход

 

 

01

UP_LED (USB)

Выход индикатора связи через USB

 

 

10

CONNECT (USB)

Вых. программного подключения USB

 

 

11

 

 

1.10 Цифровые порты ввода-вывода

В данном разделе рассматривается основная функция портов — цифровой ввод-вывод. Для выбора основной функции достаточно оставить без изменений нулевой управляющий код, которой содержится в PINSEL0– PINSEL2 (раздел 1.9.3) по умолчанию.

Микроконтроллер поддерживает два режима управления портовыми линиями: низкоскоростной и высокоскоростной. Последний отличается сокращенным временем реакции на команду и расширенными возможностями управления. Осциллограммы сигнала на линии P0.9, управляемой в низкоскоростном и высокоскоростном режиме (рисунок 1.10.1) позволяют оценить разницу во времени реакции.

Рисунок 1.10.1 – Осциллограммы сигнала на линии P0.9, управляемой в высокоскоростном и в низкоскоростном режимах

37

Осциллограммы записаны при тактовой частоте МГц. Верхняя осциллограмма получена командами

FIO0SET=0x200; FIO0CLR=0x200;

А две нижние командами

IO0SET=0x200; IO0CLR=0x200;

Видно, что в низкоскоростном режиме задержки реакции при вводевыводе через порт зависят от делителя шины периферийных устройств: 1:1 или 1:4 ( МГц или МГц).

1.10.1 Управление портом через низкоскоростную шину

Направление ввода-вывода задается с помощью регистров IOxDIR, где x — номер порта (0 или 1). Линии, соответствующие единицам двоичного кода, записанного в IOxDIR, переводятся в режим вывода. Нулям соответствуют линии в режиме ввода. По умолчанию регистр содержит нулевое значение, и все порты находятся в режиме ввода.

Установка в единицу одной выходной линии порта или нескольких одновременно выполняется путем записи управляющего кода в регистр IOxSET. На линиях, соответствующих единицам двоичного кода IOxSET, установится уровень логической единицы. Линии порта, соответствующие двоичным нулям, не меняют состояния. Аналогично сброс в ноль линий порта осуществляется путем записи единиц в регистр IOxCLR. Такой способ удобен, если требуется изменить уровень нескольких линий, не меняя уровень остальных. Однако каждая такая операция установит на заданных линиях только высокий или только низкий уровень. Невозможно одной командой установить произвольное сочетание нулей и единиц.

Для вывода в порт произвольного двоичного кода одной командой служит регистр IOxPIN. После записи этого регистра на выходных линиях, соответствующих единицам установится высокий уровень, на линиях, соответствующих нулям — низкий. Для выборочного изменения нескольких линий применяют так называемое наложение маски (маскирование). Сначала выполняют логическое умножение регистра IOxPIN на число, содержащее нули в разрядах, соответствующих низкому логическому уровню. Затем применяют логическое сложение. Рассмотрим несколько примеров.

Пример 1. Вывод 8-разрядной константы в порт. Команда

IO0PIN=(IO0PIN & 0xFFFF00FF) | 0x0000A500;

дает результат

,

где x — неизменившиеся разряды.

Пример 2. Вывод 8-разрядной переменной в порт. Команда

IO0PIN=(IO0PIN & 0xFFFFС03F) | Port << 6;

дает результат

,

где P — 8-разрядное содержимое переменной Port.

38

Пример 3. Вывод одного бита в порт. Команда

IO0PIN=(IO0PIN & 0xFFFFFFBF) | Bit << 6;

дает результат

.

Имеется в виду, что переменная Bit принимает только два значения: 0 или 1, содержащееся в младшем разряде B.

Пример 4. Вывод произвольного бита переменной в порт. Команда

IO0PIN=(IO0PIN & 0xFFFFFFFD) | (Word & 0x1000) >> 11;

скопирует 12-ый разряд переменной Word в 1-ый разряд порта:

.

Фактически логика управления портом через регистры IOxPIN, IOxSET, IOxCLR соответствует работе D-триггера, включенного так, как показано на рисунке 1.10.2, а).

Чтение регистра IOxPIN дает двоичный код, соответствующий логическим уровням на контактах микроконтроллера (причем независимо от того, настроены они на ввод или на вывод). Выборочное считывание одного или нескольких бит выполняется с помощью логического умножения на маску.

Пример 5. Чтение состояния одной портовой линии

Bit=IO0PIN & 0x00000040;

дает результат

,

где бит равен 0 или 1 в зависимости от электрических уровнях на линии. Пример 6. Чтение байта из порта

Byte=IO0PIN & 0x0000FF00;

дает результат:

,

где x — нули или единицы в зависимости от электрических уровней.

IOxSET.x

S

T

Q

Px.x

 

 

 

 

IOxPIN.x

D

 

 

 

IOxCLR.x

R

 

 

 

FIOxMASK.x

FIOxSET.x

S

T

Q

Px.x

&

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

FIOxPIN.x

FIOxCLR.x

R

 

 

 

 

 

 

 

а)

б)

Рисунок 1.10.2 – Структурная схема выхода портовой линии: а) в низкоскоростном режиме, б) в высокоскоростном режиме

Перечислим регистры управления портами в низкоскоростном режиме. Регистр IOxDIR (IO0DIR, IO1DIR) устанавливает режим ввода или вывода через порт. Единица в разряде IOxDIR переводит соответствующую

линию порта в режим цифрового выхода, ноль соответствует режиму входа. Регистры IOxPIN (IO0PIN, IO1PIN) управляют электрическими

уровнями на портовых линиях, а также используются для чтения уровней, действующих на линиях. Запись числа в эти регистры приводит к установке уровней, советующих двоичному коду числа. Чтение регистров дает код, соответствующий логическим уровням на портовых линиях.

39

Регистр IOxSET (IO0SET, IO1SET). Запись числа в эти регистры приводит к установке высоких логических уровней на выходных линиях, соответствующих двоичным единицам в IOxSET. Портовые линии, соответствующие логическим нулям не меняют состояния.

Регистр IOxCLR (IO0CLR, IO1CLR). Запись числа в эти регистры приводит к установке низких логических уровней на выходных линиях, соответствующих двоичным единицам в IOxCLR. Портовые линии, соответствующие логическим нулям не меняют состояния.

1.10.2 Управление портом через высокоскоростную шину

Высокоскоростной режим включается установкой единиц в нулевом и первом разряде регистра SCS (рисунок 1.10.3). Нулевой разряд отвечает за режим порта 0, первый — за режим порта 1.

SCS – режим управления цифровыми портами ввода-вывода

 

 

 

 

 

15

8

7

4

3

2

1

 

0

 

 

 

 

 

 

 

 

 

M

 

M

 

 

 

 

 

 

 

1

0

 

 

 

 

 

 

O

 

IO

 

 

 

 

 

 

 

PI

 

 

P

 

 

 

 

 

 

 

G

 

 

G

 

 

 

 

 

 

Порт 1

 

 

 

Порт 0

Рисунок 1.10.3 – Схема регистра управления высокоскоростным обменом с цифровыми портами ввода-вывода

Логика управления портом в высокоскоростном режиме соответствует схеме на рисунке 1.10.2 б).

Регистры управления портом в высокоскоростном режиме подключены к шине данных ядра МК. Помимо сокращения времени реакции на команду в этом режиме доступно маскирование, а также обращение в формате байта и слова.

Использование регистров FIOxDIR, FIOxSET, FIOxCLR и FIOxPIN

полностью аналогично регистрам IOxDIR, IOxSET, IOxCLR и IOxPIN низкоскоростного режима.

К 32-разрядным регистрам FIOxDIR, FIOxSET, FIOxCLR и FIOxPIN,

можно обращаться в формате 16-разрядного слова и в байтовом формате. В таком случае к именам регистров добавляется еще один символ. Младшее слово обозначается буквой «L», старшее — буквой «U». Байты нумеруются цифрами от 0 до 3: FIOxSETL, FIOxCLRU, FIOxPIN0–FIOxDIR3.

Аппаратно поддерживается маскирование через регистр FIOxMASK, к которому также можно обращаться в формате байта и слова. Запись двоичных единиц в FIOxMASK блокирует изменение соответствующих портовых линий любыми командами (логический элемент «И» на рисунке 1.10.1, б).

Пример 1 из предыдущего раздела (вывод 8-разрядной константы) в режиме байтового доступа реализуется так:

FIO0PIN1=0xA5;

Пример 2 (вывод байтовой переменной):

FIO0MASKL=0xC03F;

FIO0PINL=(Port << 6);

Пример 3 (вывод младшего бита переменной в 6-ой бит порта):

40