AVR для начинающих. Урок 6. Прерывания.

Автор: | 05.08.2016

Прерывание — сигнал, сообщающий о наступлении какого либо события (Переполнение счетчика таймера, завершение преобразования АЦП и т.д.). При этом выполнение текущей последовательности команд прерывается, и управление передается обработчику прерывания, который в свою очередь корректно реагирует на событие и обрабатывает его, после чего управление передается в прерванный код.

Прерывания позволяют своевременно обрабатывать события периферийных устройств, таких как таймеры, АЦП, приемопередатчики и так далее.

Рассмотрим слегка измененный пример из предыдущего урока:

В основном цикле программы, контроллер занят изменением значения переменной i. Однако, при возникновении сигнала от TIMER 1 о переполнении регистра TCNT1, основной цикл программы прерывается, и управление передается обработчику прерываний. Затем, по окончанию обработки прерывания от таймера, управление возвращается основному циклу программы. То есть контроллер продолжает арифметические действия с переменной I, до возникновения следующего сигнала таймера.

Читайте также  COM порт Windows. SerialPort. C#.Продолжение.

Таблица возможных прерываний микроконтроллера AtMega8:

Прерывания можно разделить на внешние и внутренние.

Внутренние прерывания — обработчики сигналов поступающих от внутренней периферии контроллера (Таймеры, АЦП, UART и т.д.).

Внешние прерывания — обработчики сигналов поступающих от внешних устройств. Именно внешние прерывания позволяют реализовать счетчики импульсов, измерять частоту чего либо, а так же быстро реагировать на события внешних периферийных устройств.

То есть внешние прерывания происходят при изменении логического уровня на определенных ножках контроллера.

Очень часто возникает необходимость быстрой обработки нажатия кнопки. Никто не захочет нажимать и держать кнопку в ожидании реакции контроллера. Решить эту проблему позволяют внешние прерывания INT0, INT1, возникновение которых возможно при изменении логического уровня ножек PD2,PD3 микроконтроллера AtMega8.

Как обычно, начнем с рассмотрения регистров отвечающих за конфигурацию внешних прерываний.

GICR:

Биты INT0 и INT1, разрешают внешние прерывания INT0 и INT1.

  • При записи 1 в соответствующий бит — прерывание разрешено.

  • При записи 0 — прерывание запрещено.

MCUCR:

  • Биты ISC11,ISC10 задают условие возникновения сигнала INT1

  • Биты ISC01,ISC00 задают условие возникновения сигнала INT

Рассмотрим следующий пример обработки сигнала с кнопки прерыванием INT1.

Соберем следующую схему:

Не забудьте подключить кварц или другой источник импульсов к входам XTAL1,XTAL2.

Код прошивки на C:

Код прошивки на ASM:

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

Вопросы как обычно оставляйте в комментариях.

До новых уроков!

Другие уроки цикла.


Любое копирование, воспроизведение, цитирование материала, или его частей разрешено только с письменного согласия администрации MKPROG.RU. Незаконное копирование, цитирование, воспроизведение преследуется по закону.

AVR для начинающих. Урок 6. Прерывания.: 8 комментариев

  1. Марат

    DDRC |=(1<<PC0);//Настройка ножек МК
    DDRD &=~(1<<PD3);
    PORTD |=(1<<PD3);

    в этой части программы DDRD &=~(1<<PD3), разве этот контакт не должен быть настроен на ввод, к нему ведь подкл. кнопка?

  2. Айрат

    21 строчка на ассемблере ldi r17, дальше константа должна быть или нет?

  3. Георгий

    Хотелось бы увидеть полностью исправленный код прошивки на C. Интересно, что в Proteus код работает, а в железе на ATmega16 -нет.

    1. DamiKK Автор записи

      Fuse биты выставлены нормально?
      Proteus достаточно хорошо моделирует работу контроллера,скорее всего проблема в железе

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *