Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

Шаг 5. Переходим непосредственно к разработке устройств и программ 311 От этого зависит, какой из видов прерываний будет активизирован. Для активизации того либо другого вида прерываний в регистр маски таймера (TIMSK) мы будем записывать разные значения маски. В стро ­ ках 141 — 145 как раз и выбирается это значение. Выбор сводится к про ­ верке номера режима. Если содержимое data равно 1, то выполняется строка 143, где в качестве маски выбирается число 0x40 (прерывание по совпадению). Выбранная маска записывается в регистр temp. Оператор безуслов ­ ного перехода г jmp в строке 144 передает управление по метке w2 для того, чтобы «перепрыгнуть» строку 145, где выбирается другое значение маски. Если код в регистре data не равен 1, то управление передается к строке 145, где в регистр temp записывается код 0x80. Маска 0x80 раз ­ решает прерывание по переполнению. Подробнее о настройке таймера смотрите в Шаге 6. В строке 146 выбранное значение маски записывается в регистр TIMSK. В строках 147 — 149 выполняется сброс таймера (в обе половины счет ­ ного регистра таймера записывается нулевое значение). С этого момента начинается отсчет времени задержки. В строке 150 сбрасывается в ноль регистр флага задержки (f lz). А в строке 151 производится глобаль ­ ное разрешение прерываний. На этом все настройки, необходимые для работы процедуры задержки, заканчиваются. Остается лишь ждать окончания заданного промежутка времени. Но прежде, чем начинать цикл ожидания, программа производит еще одну проверку номера режима (строки 152,153). Дело в том, что для режима номер 2 цикл ожидания организовывать не нужно. В этом случае цикл ожидания располагается вне подпрограммы wait , в теле самой про ­ граммы. Поэтому, если был задан режим номер 2, то работа подпро ­ граммы в этом месте должна заканчиваться. Оператор cpi в строке 152 проверяет содержимое регистра data, где хранится код номера режима на равенство цифре 2. Если код режима равен двум, то оператор условного перехода в строке 153 передает управ ­ ление на конец подпрограммы. В противном случае программа переходит к циклу ожидания. Цикл ожидания занимает всего две строки (154, 155). В строке 154 производится проверка содержимого регистра флага (f lz) на равен ­ ство единице. Пока счетчик находится в процессе счета и прерывание еще не сработало, то содержимое регистра f lz равно нулю, оператор в строке 155 передает управления назад на строку 154, и цикл продолжа ­ ется. Как только процедура обработки прерывания запишет в f lz еди ­ ницу, цикл завершается, и управление переходит к строке 156. В этой

RkJQdWJsaXNoZXIy MTExODQxMg==