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