Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа SDK11.doc
Скачиваний:
96
Добавлен:
01.05.2015
Размер:
1.24 Mб
Скачать

1.2. Система прерываний

Процессор AduC812 поддерживает 9 источников прерываний с 2 уровнями приоритета. Конфигурирование и контроль системы прерываний осуществляется через 3 регистра специальных функций.

Регистр IE (SFR адрес A8h ) – регистр разрешения прерываний. Все биты регистра устанавливаются и сбрасываются пользователем.

Таблица 7. Регистр разрешения прерываний IE.

Бит

Обозн.

Описание

7

ЕА

0 – запрещены, 1 – разрешены прерывания от всех источников

6

EADC

0 – запрещены, 1 – разрешены прерывания от АЦП

5

ЕТ2

0 –запрещены, 1 – разрешены прерывания от Таймера 2

4

ES

0 – запрещены, 1 – разрешены прерывания от UART

3

ЕТ1

0 – запрещены, 1 – разрешены прерывания от Таймера 1

2

ЕХ1

0 – запрещено, 1 – разрешено внешние прерывание 1

1

ET0

0 – запрещены, 1 – разрешены прерывания от Таймера 0

0

EX0

0 – запрещено, 1 – разрешено внешние прерывание 0

Регистр IP (SFR адрес B8h) – регистр приоритета прерываний. Все биты регистра устанавливаются и сбрасываются пользователем. После включения питания по умолчанию содержит 00h. Назначение битов регистра приведены в таблице 8.

Таблица 8. Регистр приоритета прерываний IР.

Бит

Обозн.

Описание

7

PSI

0 – высокий, 1 – низкий приоритет прерывания от SPI/I2C

6

PADC

0 – высокий, 1 – низкий приоритет прерывания от АЦП

5

РТ2

0 – высокий', 1 – низкий приоритет прерывания от Таймера 2

4

PS

0 – высокий, 1 – низкий приоритет прерывания UART

3

РТ1

0 – высокий, 1 – низкий приоритет прерывания от Таймера 1

2

РХ1

0 – высокий, 1 – низкий приоритет внешнего прерывания 1

1

PT0

0 – высокий, 1 – низкий приоритет прерывания от Таймера 0

0

PX0

0 – высокий, 1 – низкий приоритет внешнего прерывания 0

Регистр IE2 (SFR адрес A9h) – регистр разрешения вторичных прерываний (таблица 9).

Таблица 9. Регистр разрешения вторичных прерываний IE2.

Бит

Обозн.

Описание

7-2

-

Зарезервированы для использования в будущем

1

ЕТ0

0 – запрещены, 1 – разрешены прерывания от монитора источника питания

0

ЕХ0

0 – запрещено, 1 – разрешено прерывания от SPI/I2C

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

Таблицы 10. Приоритет источников прерываний.

Источник

Приоритет

Описание

PSMI

1 (Наивысший)

Монитор источника питаная

IE0

2

Внешние прерывание 0

ADCI

3

Прерывание от АЦП

TFO

4

Прерывание от Таймера/Счетчика 0

IE1

5

Внешние прерывание 1

TF1

6

Прерывание от Таймера/Счетчика 1

I2CI+ISPI

7

Прерывание от I C/SPI

RI+TI

8

Прерывание от UART

TF2+EXF2

9 (Низший)

Прерывание от Таймера/Счетчика 2

Когда происходит прерывание, значение программного счетчика помещается в стек, а в сам счетчик загружается адрес соответствующего вектора прерывания. Адреса векторов указаны в таблице 11.

Прерывания ADuC812 имеют вектора в диапазоне 0003h-0043h, которые попадают в область младших адресов памяти программ. Это пространство соответствует 8Кб (0000h-2000h) Flash-памяти. Следовательно, пользователь, не имеющий возможности записи во Flash-память, не может подставить свои процедуры обработки прерываний (точнее, команды перехода к процедурам) по адресам, соответствующим векторам прерываний.

Таблица 11. Вектора прерываний ADuC812.

Прерывание

Наименование

Адрес вектора

Приоритет

PSMI

Источник питания ADuC812.

43Н

1

IE0

Внешнее прерывание INTO.

03Н

2

ADCI

Конец преобразования АЦП.

33Н

3

TF0

Переполнение таймера 0.

0ВН

4

IE1

Внешнее прерывание INT1.

13Н

5

TF1

Переполнение таймера 1.

1ВН

6

I2CI/ISPI

Прерывание последовательного интерфейса (I2C, SPI).

3ВН

7

RI/TI

Прерывание UART.

23Н

8

TF2/EXF2

Переполнение таймера 2.

2ВН

9

Проблема использования прерываний в пользовательских программах решается следующим образом:

  1. По адресам (0003h-0043h) векторов прерываний во Flash-памяти SDK-1.1 располагаются команды переходов на вектора пользовательской таблицы, размещенной в адресах 2003h-2043h.

  2. По адресам векторов пользовательской таблицы пользователем указываются команды переходов на процедуры обработки прерываний.

Переадресацию векторов прерываний иллюстрирует рис. 7.

Следующая программа – пример помещения собственного вектора в пользовательскую таблицу. Пусть требуется осуществить обработку прерываний от таймера 0 (прерывание 0Bh). В программу на языке Си можно вставить следующий код:

void T0_ISR(void) interrupt 1 // Обработчик прерывания от

// таймера 0

{

// Действия, выполняемые обработчиком

}

void SetVector(unsigned char xdata * Address, void * Vector)

// Функция, устанавливающая вектор прерывания Vector по //адресу Address

{

unsigned short xdata * TmpVector;/ Временная переменная

*Address = 0x02; //Первым байтом по указанному адресу за-

//писывается код команды передачи управления ljmp,равный 02h

TmpVector = (unsigned short xdata *) (Address+1);

*TmpVector = (unsigned short) Vector;

// Далее записывается адрес перехода Vector

// Таким образом, по адресу Address теперь располагается

// инструкция ljmp Vector

}

void main(void)

{

/*…*/

SetVector(0x200В, (void *) TO_ISR); // Установка вектора в // пользовательской таблице

ЕТ0=1; ЕА=1; // Разрешение прерываний от таймера 0

}

Рис. 7. Использование прерываний в SDK-1.1.

Компилятор С51 предоставляет возможность вызова функций при возникновении прерываний. Это дает возможность написания на языке С собственных обработчиков прерываний. Однако следует соблюдать осторожность в выборе номера прерывания и банка регистров. Компилятор автоматически генерирует вектор прерывания, а также код входа в обработчик и выхода из него. Атрибут interrupt, включенный в объявление функции, указывает на то, что данная функция обрабатывает прерывание. Кроме того, можно указать банк регистров для данного прерывания с помощью атрибута using.

unsigned int interruptcnt;

unsigned char second;

void timerO (void) interrupt 1 using 2

{

if (++interruptcnt == 4000)

{

/* count to 4000 */

second++; /* second counter */

interruptcnt =0; /* clear int counter */

}

}