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

244 Микроконтроллеры AVR от азов программирования... Иногда в качестве такой заглушки применяют безусловный переход по нулевому адресу. Но удобнее всего использовать команду завершения про ­ цедуры обработки прерывания (reti). Если ненужное нам прерывание все же сработает, то оно тут же завершится, не нанеся никакого урона. Какие же вектора прерываний переопределяются в нашей программе? Во-первых, вектор нулевого адреса. По адресу 0x0000 (строка 11 про ­ граммы) помещается команда безусловного перехода по метке in it. В строке с этой меткой начинается основная процедура нашей программы. Как известно, нулевой адрес — это вектор начального сброса микрокон ­ троллера. Именно с этого адреса начинается выполнение программы после системного сброса. Безусловный переход с нулевого адреса позво ­ ляет «перепрыгнуть» таблицу векторов прерываний и разместить основ ­ ную программу за пределами этой таблицы. Второй переопределяемый вектор — это вектор прерываний по совпадению таймера/счетчика Т1. Его адрес равен 0x0004. Сюда мы помещаем команду безусловного перехода на метку prtiml (строка 15 программы). Именно с этой метки начинается процедура обработки дан ­ ного прерывания. По всем остальным адресам таблицы помещены команды reti. Сразу за таблицей векторов прерываний начинается модуль инициа ­ лизации. Подобный модуль нам не в новинку. Модуль инициализации обязательно входит в любую программу. Наша программа — это всего лишь новый вариант программы для уже знакомой нам схемы бегущих огней. Режимы работы большинства систем микроконтроллера не изме ­ няются. Поэтому модуль инициализации новой программы почти пол ­ ностью повторяет соответствующий модуль из предыдущего примера. В предыдущей программе (листинг 5.11) подобный модуль занимал строки 8 — 19. Но есть и отличия. В новой программе немного по-другому проис ­ ходит инициализация таймера/счетчика. Теперь таймер должен быть переведен в режим сброса при совпадении. Возможны два варианта реа ­ лизации такого режима: ♦ сброс при совпадении в канале А; ♦ сброс при совпадении в канале В. Для каждого из каналов имеется свой собственный регистр совпаде ­ ния. Не буду вдаваться в подробности. Просто скажу, что мы выберем канал А. Для того, чтобы перевести наш таймер/счетчик в выбранный нами режим, достаточно в регистр конфигурации таймера TCCR1B запи ­ сать код 0x0D (строки 38, 39). Этот код не только переводит таймер в выбранный нами режим, но и устанавливает коэффициент предвари ­ тельного деления, равный 1/1024. Подробнее о конфигурации таймера/счетчика смотрите в Шаге 6.

RkJQdWJsaXNoZXIy MTExODQxMg==