203
Проблема использования прерываний в пользовательских программах
решается следующим образом:
1. По адресам (0003h-0043h) векторов прерываний во Flash-памяти
SDK-1.1
располагаются
команды
переходов
на
вектора
пользовательской таблицы, размещенной в адресах 2003h-2043h.
2. По адресам векторов пользовательской таблицы пользователем
указываются команды переходов на процедуры обработки прерываний.
Приведем пример помещения собственного вектора в пользовательскую
таблицу. Пусть требуется осуществить обработку прерываний от таймера 0
(прерывание 0Bh). В программу на языке Си (компилятор SDCC) можно
вставить следующий код:
// Обработчик прерывания от таймера 0
void T0_ISR(void) __interrupt (1)
{
// Действия, выполняемые обработчиком
}
//////////////////////// SetVector //////////////////////////
// Функция, устанавливающая вектор прерывания в пользовательской таблице
// прерываний.
// Вход: Vector
- адрес обработчика прерывания,
// Address - вектор пользовательской таблицы прерываний.
// Выход: нет.
// Результат: нет.
//////////////////////////////////////////////////////////////
void SetVector(unsigned char xdata * Address, void * Vector)
{
unsigned char xdata * TmpVector; // Временная переменная
// Первым байтом по указанному адресу записывается
// код команды передачи управления ljmp, равный 02h
*Address = 0x02;
// Далее записывается адрес перехода
Vector
TmpVector = (unsigned char xdata *) (Address + 1);
*TmpVector = (unsigned char) ((unsigned short)Vector >> 8);
++TmpVector;
*TmpVector = (unsigned char) Vector;
// Таким образом, по адресу Address теперь
// располагается инструкция ljmp Vector
}
void main(void)
{
/*…*/
// Установка вектора в пользовательской таблице
SetVector(0x200B, (void *) T0_ISR);
// Разрешение прерываний от таймера 0
ET0=1; EA=1;
/*…*/
Примеры программ для стенда SDK-1.1, демонстрирующие работу с
прерываниями, таймерами приведены в подразделе 6.4.