МИКРОКОНТРОЛЛЕР AVR - Страница 86

МИКРОКОНТРОЛЛЕР AVR - МИКРОКОНТРОЛЛЕР AVR

Как было упомянуто выше, при выполнении любой команды вызова «call» в AVR происходит сохранение в стеке полного адреса возврата, даже если эта команда осуществляет короткий относительный переход к адресу подпрограммы. Для возврата из подпрограммы используется команда «ret» (команда 36.48). Команда «reti» (команда 36.49) выполняется так же, как и «ret», с той лишь разницей, что после возврата еще разрешаются прерывания. Далее в этом разделе мы еще вернемся к прерываниям, но я хочу обратить внимание на один малоизвестный вариант использования команды «reti» - ее применение в подпрограммах, для которых время является критическим параметром, например, при работе с термодатчиком DS1820. Если вы не хотите, чтобы тратилось время на обслуживание прерывания, то надо замаскировать прерывания при входе в подпрограмму, а при выходе из нее снова их разрешить.

Можно использовать команду «sei» для разрешения прерываний, а затем команду «ret» для возврата, однако обе эти команды заменяются одной - «reti». Микроконтроллеры AVR могут выполнять команды ветвления по значению определенных битов в регистре состояния SREG (команды 36.50 и 36.51). Поскольку номер бита и его значение должны быть указаны в коде команды, то диапазон возможных адресов перехода уменьшается до +/- 63 относительно текущего адреса. Это означает, что применение команд условных ветвлений весьма ограничено, хотя эту проблему можно решить так же, как в микроконтроллерах 8051 и 68НС05 при помощи ветвления к команде, которая затем выполнит необходимый безусловный переход. Например, переход на метку Label при значении флага нуля Z=l может быть реализован следующим образом:

Go to Top