ПРОГРАММИРОВАНИЕ
Регистр cкорости передачи

При программировании последовательного порта используются регистры, описанные ниже.

Регистр скорости передачи (Baud Rate) устанавливает скорость передачи последовательного порта в бодах и источник тактовой частоты (clock source). Он содержит два байта, причем запись в регистр должна начинаться с записи младшего байта.

Старший бит регистра (CS) выбирает тактовый генератор. Младшие 15 битов представляют целое значение (BAUD_VALUE) без знака, которое определяет скорость передачи в бодах. BAUD_VALUE имеет максимальное значение, равное 32767, и может иметь минимальное значение, равное нулю, только когда используется внутренняя синхронизация в асинхронных режимах 1, 2 и 3. В остальных случаях минимальное значение BAUD_VALUE = 1.

Аббревиатура - BAUD_RATE
Размер - 2 байта
Находится по адресу 0Eh
Использовать для записи в окне HWindow 0

1514131211109876543210
CSB14B13B12B11B10B9B8B7B6B5B4B3B2B1B0

CS (CLOCK_SRC, Serial Port Cloc Baud Rate Register, источник синхронизации последовательного порта) - этот бит определяет внутренний (CS=1, вывод XTAL1) или внешний (CS=0, вывод T2CLK(P2.3)) источник синхронизации для последовательного порта.

B0...B14 (BAUD_VALUE) - эти биты составляют BAUD_VALUE. Младший байт загружается первым.

После сброса состояние регистра BAUD_RATE следующее:

1514131211109876543210
0000000000000000

Для определения скорости передачи используются следующие формулы (Fosc- частота на выводе XTAL1 в МГц):

- синхронный режим 0:

BAUD_VALUE=(Fosc/(Baud Rate x 2))-1

или T2CLK/Baud Rate

- асинхронные режимы 1,2,3:

BAUD_VALUE=(Fosc/(Baud Rate x 16))-1

или T2CLK/(Baud Rate x 8)

Значения скоростей передачи, используемые при частоте внутренней синхронизации на выводе XTAL1 - 16 MHz, приведены ниже.

Скорость передачиРежим 0Режимы 1,2,3
96008340H8067H
48008682H80CFH
24008D04H81A0H
12009A0AH8340H
300E82BH8D04H

Регистр буфера приемника

Аббревиатура - SBUF (RX)

Размер - 1 байт

Находится по адресу 07h

Использовать для записи в окне HWindow 15

Использовать для чтения в окне HWindow 0

76543210
        

Регистр буфера приемника последовательного порта содержит данные, получаемые из последовательного порта. Приемник последовательного порта использует двойную буферизацию и поэтому может начать прием второго байта данных до того, как из него будет прочитан первый байт. Данные удерживаются в сдвигающем регистре приемника до тех пор, пока не будет получен последний бит данных, затем байт данных загружается в SBUF(RX). Если данные из сдвигающего регистра загружаются в SBUF(RX) до того, как из SBUF(RX) будет прочитан предыдущий байт данных, установится бит ошибки переполнения (SP_STAT.2). Регистр SBUF(RX) всегда содержит последний принятый из последовательного порта байт данных. По сбросу SBUF(RX)=00000000.

Регистр буфера передатчика

Аббревиатура - SBUF (TX)

Размер - 1 байт

Находится по адресу 07h

Использовать для записи в окне HWindow 0

Использовать для чтения в окне HWindow 15

76543210
        

Регистр буфера передатчика последовательного порта содержит данные, которые готовы для передачи. В режимах 1,2,3 запись в SBUF(TX) начинает передачу. В режиме 0 запись в SBUF(TX) начинает передачу, только если отключен приемник (SP_CON.3=0). По сбросу SBUF(TX)=00000000.

Регистр управления

Программирование регистра управления последовательным портом устанавливает коммуникационный режим, разрешает или запрещает:
- работу приемника;
- контроль четности;
- передачу девятого бита данных.

Передатчик (TXD) совместно с портом P2 использует вывод P2.0, и поэтому, чтобы разрешить функцию передатчика, должен быть установлен пятый бит в регистре управления IOC1. В режимах 1,2,3 вывод TXD служит в качестве выхода передатчика последовательного порта, а в режиме 0 - в качестве вывода синхронизации. Для запрещения функции передатчика для вывода P2.0 надо очистить бит IOC1.5.

Приемник (RXD) совместно с портом P2 использует вывод P2.1, и поэтому, чтобы разрешить функцию приемника, должен быть установлен третий бит в регистре управления последовательного порта SP_CON. В режимах 1,2,3 RXD служит в качестве вывода приемника последовательного порта, а в режиме 0 - в качестве приемника или передатчика.

Для запрещения функции приемника для вывода P2.1 нужно очистить бит SP_CON.3 .

Аббревиатура - SP_CON

Размер - 1 байт

Находится по адресу 11h

Использовать для записи в окне HWindow 0

Использовать для чтения в окне HWindow 15

76543210
RRRTB8RENPENSER_MODESER_MODE

SER_MODE - эти два бита выбирают коммуникационный режим:

Бит 1Бит 0 
00Режим 0
01Режим 1
10Режим 2
11Режим 3

Выбор нового коммуникационного режима сбрасывает последовательный порт ввода/вывода и прекращает передачу и прием в канале.

PEN (Even Parity Enable, разрешение контроля четности) - в режимах 1 и 3 установка этого бита разрешает контроль четности. В режиме 2 этот бит должен быть очищен. Когда этот бит установлен, при передаче TB8 содержит значение бита контроля четности. При приеме, если принятый и вычисленный бит контроля четности не совпали, бит SP_STAT.7 устанавливается в 1.

REN (Receive Enable, разрешение приема) - установка этого бита разрешает функцию RXD для вывода P2.1/RXD. Когда этот бит установлен, переход сигнала с высокого уровня на низкий на выходе RXD в режимах 1,2,3 начинает прием. В режиме 0 для начала передачи этот бит должен быть очищен, а для начала приема этот бит должен быть установлен. Очистка этого бита останавливает процесс приема и запрещает дальнейший прием.

TB8 (Transmit Ninth Data Bit, девятый передаваемый бит данных) - это девятый бит данных, который будет передан в режиме 2 или 3. Этот бит очищается после каждой передачи, поэтому, если требуется, он должен быть установлен перед записью в SBUF(TX). Когда SPCON.2=1, ТВ8 содержит значение бита контроля четности.

R - зарезервированные биты, всегда должны быть очищены.

По сбросу состояние регистра SP_CON следующее: 00001011.

Регистр статуса

Аббревиатура - SP_STAT

Размер - 1 байт

Находится по адресу 11h

Использовать для записи в окне HWindow 15

Использовать для чтения в окне HWindow 0

76543210
RPE/RB8RITIFETXEOERR

R - зарезервированные биты, всегда должны быть очищены.

OE (Overrun Error, ошибка наложения) - этот бит устанавливается, если данные из сдвигающего регистра приемника загружаются в SBUF(RX) до того, как будет прочитан предыдущий принятый байт. Чтение SP_STAT очищает этот бит.

TXE (SBUF(TX) Empty, передатчик пуст) - этот бит =1, если буфер передатчика пуст и готов принять до двух байтов. Он очищается, когда байт записывается в SBUF(TX).

FE (Framing Error, ошибка кадра) - этот бит =1, если внутри принятого кадра не найден стоп-бит. Чтение SP_STAT очищает этот бит.

TI (Transmit Interrupt, флаг прерывания передатчика) - этот бит устанавливается в начале передачи стоп-бита. Чтение SP_STAT очищает этот бит.

RI (Receive Interrupt, флаг прерывания приемника) - этот бит устанавливается при приеме последнего бита данных. Чтение SP_STAT очищает этот бит.

Обратите внимание, что события приема/передачи устанавливают флаги RI и TI и соответствующие биты в регистрах захвата прерывания (INT_PEND), в то время как установка битов RI и TI программным способом не воздействует на биты регистра захвата прерывания и не вызывает прерывания. Аналогично чтение регистра SP_STAT очищает биты RI и TI, но не очищает соответствующие биты регистра захвата прерывания.

RPE/RB8 (Received Parity Error, ошибка четности при приеме/Received Bit 8, девятый принятый бит) - RPE=1, если проверка на четность разрешена (SP_CON.2=1) и произошла ошибка четности. RB8=1, если проверка на четность запрещена (SP_CON.2=0) и девятый принятый бит=1. Чтение SP_STAT очищает этот бит.

Обратите внимание, что чтение регистра SP_STAT очищает все флаги, за исключением TXE. По этой причине мы рекомендуем копировать содержимое регистра SP_STAT в промежуточный регистр и затем выполнять команды проверки разрядов типа JBC и JBS только на этом промежуточном регистре. Если выполнится больше одной команды проверки разрядов, могут быть возвращены неправильные значения битов.

Прерывания

Последовательный порт может быть сконфигурирован так, чтобы генерировать или одно прерывание последовательного порта (Serial Port Interrupt), или раздельные прерывания и по передаче (Transmit Interrupt), и по приему (Receive Interrupt).

Если прерывание последовательного порта замаскировано, а прерывания по приему и передаче разрешены, флаги RI и TI генерируют раздельные прерывания приема и передачи.

Если прерывание последовательного порта разрешено, а прерывания по приему и передаче запрещены, флаг RI и флаг TI генерируют одно и то же прерывание последовательного порта. Когда флаг TI генерирует прерывание, устанавливается бит 5 в регистре SP_STAT. Когда флаг RI генерирует прерывание, устанавливается бит 6 в регистре SP_STAT.

Чтобы разрешить индивидуальные прерывания по передаче и приему, установите нулевой TI_MASK и первый RI_MASK биты в регистре маскирования прерываний INT_MASK1 (см. Приложение). Чтобы разрешить прерывание последовательного порта, установите бит SER_MASK в регистре INT_MASK (INT_MASK.6) (см. Приложение).

Таблица 5.1

Мнемоника регистраНазваниеАдресОписание
INT_MASKМаска прерывания08HУстановка бита INT_MASK.6 разрешает прерывание последовательного порта INT06,800CH. Очистка бита INT_MASK.6 запрещает прерывание последовательного порта.
INT_MASK1Маска прерывания 113HУстановка бита INT_MASK1.0 разрешает прерывание передатчика (INT08,8030H). Очистка бита INT_MASK.0 запрещает прерывание передатчика.
Установка бита INT_MASK1.1 разрешает прерывание приемника (INT09,8032H). Очистка бита INT_MASK.1 запрещает прерывание приемника.
INT_PENDЗахват прерывания09HУстановка бита INT_PEND.6 индицирует захват прерывания последовательного порта (INT06). Бит сбрасывается при переходе к вектору по адресу 800CH.
INT_PEND1Захват прерывания 112HУстановка бита INT_PEND.0 индицирует захват прерывания передатчика (INT08). Бит сбрасывается при переходе к вектору по адресу 8030H.
Установка бита INT_PEND.1 индицирует захват прерывания приемника (INT09). Бит сбрасывается при переходе к вектору по адресу 8032H.

Фрагмент программы

Serial_Out:

jbc SP_STAT, 3, Serial_Out ; Тестирование третьего бита регистра состояния (Буфер пуст?)

stb data, SBUF ; ОК! Передаем байт

ret

<<< Содержание >>>