Курс лекций. - Микропроцессоры


Реализация процедур и функций на языке ASM51 - часть 3


В этом примере подпрограмма вычисления синуса перед выполнением оператора возврата в основную программу должна поместить результат вычисления синуса в аккумулятор.

Подпрограмма - функция может возвращать и многобайтовые переменные, используя регистр - указатель R0 или R1. Однако для копирования этих переменных потребуется ещё одна подпрограмма копирования.

Реализация подпрограмм обработки прерываний на языке ASM51.

Как известно, подпрограммы обработки прерываний вызываются аппаратурой, поэтому эти подпрограммы не могут иметь параметров. Кроме того эти подпрограммы не могут быть подпрограммами-функциями. При возвращении из подпрограммы обработки прерывания должны быть разрешены дальнейшие прерывания, поэтому возврат из подпрограммы обработки прерывания может быть осуществлён только командой RETI.

Подпрограмма обработки прерываний не должна портить содержимое регистров, поэтому все регистры, которые используются подпрограммой обработки прерываний должны быть сохранены в стеке, а затем восстановлены из него. Пример подпрограммы обработки прерывания приведён на рисунке 6.

Рисунок 6. Пример подпрограммы обработки прерывания.

В приведённом примере директива CSEG AT 0BH использована для того, чтобы разместить подпрограмму обработки прерывания на вектор прерывания от таймера 0.

Достаточно часто требуется обработка прерываний от нескольких источников, поэтому подпрограммы относятся из области векторов прерывания. Для перехода на эти подпрограммы используются команды безусловного перехода. Пример такой подпрограммы обработки прерывания приведён на рисунке 7.

Рисунок 7. Пример подпрограммы обработки прерывания.

Если подпрограмма обработки прерывания использует несколько регистров, то на сохранение регистров в стеке и на восстановление их из стека тратится достаточно много времени. Микроконтроллеры семейства MCS-51 предлагают возможность использовать для подпрограмм прерываний отдельный банк регистров. В языке программирования ASM-51 то, что программа использует не нулевой банк регистров отображается при помощи директивы USING как это показано в примере на рисунке 8.

Рисунок 8. Пример подпрограммы обработки прерывания с использованием второго банка регистров.

[Назад] [Содержание] [Вперёд]




- Начало -  - Назад -  - Вперед -