Что такое прерывание в микроконтроллере

Что такое прерывание в микроконтроллере

Система прерываний включает в себя аппаратные и программные компоненты, которые позволяют реализовать механизм прерываний в микроконтроллере. Вариантов организации систем прерываний существует очень много, но можно выделить несколько основных способов, которые различаются объемом аппаратных компонентов и скоростью работы. Давайте рассмотрим каждый из них подробнее.

Одноуровневые прерывания

Чтобы система прерываний была более эффективной, при ее реализации используется подход, в соответствии с которым процессор, при возникновении прерывания, осуществляет аппаратный переход к подпрограмме, называемой обработчиком прерываний. Такой обработчик обычно находится по определенному адресу, который может быть либо в начале, либо в конце программной памяти.

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

Такой механизм выявления источника прерывания называется программным опросом или поллингом. Он заключается в том, что система последовательно проверяет все возможные источники прерываний и реагирует на тот, у которого флаг сигнализирует о событии. В зависимости от количества возможных источников этот процесс может занимать значительное время.

Хотя программный опрос является простым в реализации, он имеет недостаток в форме затрат времени на поиск источника прерывания и, следовательно, снижает отзывчивость системы на внешние события. Однако его преимущество заключается в простоте внедрения обработки прерываний.

Векторные прерывания

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

В общем случае вектор прерывания может быть любыми данными (адрес подпрограммы, адрес перехода, смещение относительно начала таблицы прерываний, специальные инструкции и т.д.), которые непосредственно позволяют перейти к процедуре обработки прерывания, не тратя время на поиск источника прерывания. Какие данные используются в качестве вектора прерывания и как они используются, зависит от конкретной реализации системы прерываний в процессоре.

Семейство PIC 18 поддерживает как одноуровневую (в режиме совместимости с PIC 16), так и двухуровневую систему прерываний. В режиме совместимости при возникновении прерывания процессор переходит к процедуре обработки прерывания по адресу 0x000008 и далее всё происходит аналогично PIC 16. В двухуровневой системе прерываний есть два вектора перехода: 0x000008 и 0x000018. Установка уровня для каждого источника прерывания выполняется программно, с помощью соответствующих флагов. Определение системы прерываний (одно- или двухуровневая) также определяется значением соответствующего разряда в регистре управления прерываниями.

В контроллерах семейства AVR реализована векторная система прерываний. При обнаружении прерывания процессор сразу переходит по вектору прерывания к процедуре обработки прерываний от этого источника. Векторы прерываний находятся в начальных адресах программной памяти и представляют собой команду перехода к обработчику прерывания. Количество векторов прерываний соответствует числу возможных источников прерываний, которые зависят от конкретного типа контроллера. Важно отметить, что флаги запроса на прерывание сбрасываются автоматически при переходе по вектору прерывания, и для этого не требуется выполнение каких-либо инструкций.

В контроллерах семейства MCS 51 также используется векторная система прерываний, но для каждого вектора прерывания зарезервирован относительно большой объем памяти (8 байт), что часто достаточно для обработчика. Флаги прерывания автоматически сбрасываются при переходе к обработчику прерывания, если у прерывания есть только один источник, а не сбрасываются, если у прерывания есть два и более источника. В последнем случае необходимо программно сбросить флаг, вызвавший прерывание, после выяснения причины прерывания (методом опроса). Векторы расположены в начальных адресах программной памяти.

Приоритетные прерывания

Значимость событий в системе обычно отличается. Некоторые события более важны и требуют мгновенной реакции, в то время как другие можно отложить на потом. Конечно, прерывания, связанные с этими событиями, должны иметь разные приоритеты. Когда возникает сразу несколько прерываний, процессор должен обработать прерывание с более высоким приоритетом. Это происходит на аппаратном уровне ядра процессора и называется последовательностью опроса прерываний.

При двухуровневой системе прерывания контроллеров PIC 18 прерывания с вектором 0 x 000008 имеют более высокий приоритет. В пределах одного уровня приоритет определяется программно, так же, как и у PIC 16.

В семействе AVR приоритет опроса прерывания жестко фиксирован и не может быть изменен. Чем меньше адрес вектора прерывания, тем выше приоритет опроса этого прерывания.

В семействе MSP 430 приоритет опроса также жестко фиксирован и неизменяем, но зависимость приоритета опроса прерывания обратная – чем выше адрес вектора прерывания, тем ниже приоритет опроса этого прерывания.

Вложенные прерывания

В контроллерах PIC 18 при двухуровневой системе прерывания возможно прерывание процедур обработки прерываниями низкого уровня приоритета прерываниемис высокимимо уровнями приоритета.

В семействе AVR в процедурах обработки прерываний глобальные прерывания автоматически запрещаютсяаютсяеся, и процедурама обработки прерывания не может быть прерванарвана. Тем не мнее, если это необходимоst.
озможностьоst., то можно в процедуре обработки прерывана изможет быть прервана любым прерыванием, дажеесли оно имеет меньгшиюручииый струкуюактуалнвщфьщий уровень уручилсуриветпрестороветаакоторраккомпаранысмлючстшщыеч то само та этапряка процедурав объектор процедуоя добожетствьщоя загможет быть бинаниюирюнамнойю с текущибгимкнробщаьобыье ууронныы лремиюровжрьпретекмроянняяобасуменени.

Ссылка на источник

Программирование микроконтроллеров. Прерывание

Что такое прерывание в микроконтроллере. Смотреть фото Что такое прерывание в микроконтроллере. Смотреть картинку Что такое прерывание в микроконтроллере. Картинка про Что такое прерывание в микроконтроллере. Фото Что такое прерывание в микроконтроллере

Для новичков интересной будет следующая тема — прерывание.

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

Рассмотрим микроконтроллер ATtiny13A от Атмел, как самый простой и доступный вариант. В качестве среды разработки используется CodeVisionAVR.

Если вкратце объяснить, то прерывание — это останов цикла программы по определенному событию, и выполнение кода внутри прерывания.

Здесь можно привести аналогию из повседневной жизни:
Офисный работник каждый день выполняет свою повседневную рутинную задачу, например, пишет отчеты или составляет графики. И тут звонит телефон — сработало прерывание для работника. Немедленно откладывается документация (в это время микроконтроллер готовит и сохраняет нужные данные и запоминает точку остановки), и перед рабочником разговариватель здесь же по телефону (микроконтроллер в это время исполняет выполнение кода, содержащегося в прерываниях). Дальнейшие шаги будет предпринимать сотрудник в зависимости от исходящего звонка. Но в конечном итоге он вернется к выполнению своей ужерной надоевшей работы (у микроконтроллера это выполнение основного цикла «while(1)»).

У микроконтроллера есть несколько различных прерываний, каждое из которых может срабатывать при определенных условиях. Когда имеется несколько прерываний, наступающих одновременно, необходимы правила выполнения, называемые приоритетом прерываний. Если происходят несколько событий одновременно, которые вызывают различные прерывания, будет выполнено прерывание с более высоким приоритетом. Приоритеты прерываниям определяются числом. Чем меньше приоритетное число, тем выше приоритет выполнения прерывания. Это на английском называется Interrupt Vectors — вектора прерываний.

Я, снова приведу аналогию из повседневной жизни:

Работник офиса каждый день выполняет свою рутинную задачу, осуществляет заполнение отчетности и составляет графики — это тот же деловой порядок. Внезапно звонит телефон и одновременно входит директор. Приоритет прерывания по телефону равен 3, а для директора — единице. Делается выбор в пользу внимания директору, а телефон в это время <<отправляют куда подальше>>, так что директор получает заслуженное внимание и делая указания своему подчиненному.

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

Вектора прерываний описаны в табличной форме Interrupt Vectors, ниже опишем, какой смысл они несут:

Что такое прерывание в микроконтроллере. Смотреть фото Что такое прерывание в микроконтроллере. Смотреть картинку Что такое прерывание в микроконтроллере. Картинка про Что такое прерывание в микроконтроллере. Фото Что такое прерывание в микроконтроллере

Самое главное прерывание нулевое — RESET. Адрес прерывания равен нулю в массиве векторов. Источник прерывания — сброс микроконтроллера от активной линии RESET, сбойной напряжения по питанию, если опция Brown-out Reset включена, и срабатывания сторожевого таймера. Все это понятно и не вызывает вопросов.

Вектор два: INT0 — прерывание, вызываемое сигналом на входе INT0. В ATTiny13 это пятый вывод PB0.
Настройка вывода INT0 может быть выбрана для вызова прерывания, обычно по заднему фронту сигнала, заднему спаду сигнала или при изменении. Подобное прерывание я использую для точного измерения длительности импульса, необходимого для выполнения алгоритма деления или умножения частоты.

Вектор три: PCINT0 — прерывание, вызываемое изменением состояния на линиях PB0 — PB5 (PCINT0 — PCINT5). С другими словами, все выводы микроконтроллера можно использовать для этого прерывания. Это одно из моих любимых прерываний, которое я использую, например, для пробуждения микроконтроллера из сна при изменении на входах.

Источник

Прерывания

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

Благодаря прерываниям, ЦПУ освобождается от выполнения работ, которые могут быть автономно выполнены отдельными модулями. Например, таймер-счетчик может отсчитать нужное количество тактов генератора и сгенерировать прерывание, вызвав подпрограмму для отчета временных интервалов. Аналогично, различные модули, такие как USART, SPI, TWI, ADC и т.д., могут уведомлять процессор о наступлении определенных событий (передача или прием данных, изменение состояния на линии и т.д.). В различных моделях AVR доступно от 4 до 56 источников прерываний.

Табл.5. Таблица векторов прерываний:

Номер

Адрес в памяти программ

Бит разрешение прерывания

Флаг прерывания

Описание события

Внешнее прерывание 0

Внешнее прерывание 1

Cовпадение TCNT2 и OCR2

Совпадение TCNT1 и OCR1A

Совпадение TCNT1 и OCR1B

Прерывание от модуля SPI

Получение байта по USART

Опустошение UDR в USART

Передача байта по USART

Завершение записи в EEPROM

Прерывание от компаратора

Прерывание от модуля TWI

Завершение выполнения spm

Для каждого обработчика прерывания жестко закреплен определенный адрес (вектор прерывания) в начале памяти программы. Адрес вектора прерывания, как правило, содержит инструкцию перехода, которая передает управление подпрограмме обработчика.

В моделях AVR с объемом FLASH до 8 килобайт, на каждый вектор прерывания выделяется 1 слово памяти программы, куда помещаются команды rjmp. Во всех остальных микроконтроллерах каждый вектор прерывания занимает 2 слова, а в качестве инструкции перехода используется jmp.

Управление прерываниями настраивается индивидуально. Специальные разряды соответствующих регистров векторов прерываний отвечают за разрешение каждого прерывания, и по состоянию флагов прерывания микроконтроллер может определить наступление события (см. табл.5). Например, если прерывание по переполнению таймера-счетчика 2 разрешено (установлен бит TOIE2 в TIMSK), и содержимое счетного регистра TCNT2 изменится от 0xFF до 0x00 в регистре TIFR, то аппаратным способом будет установлен флаг прерывания TOV2, и микроконтроллер вызовет подпрограмму по адресу 0x0004.

Основное управление прерываниями в AVR выполняется с помощью флага I в регистре SREG. Если I=0, то все прерывания, независимо от состояния битов разрешения, будут запрещены.

При возникновении прерывания, адрес текущей команды в основной программе копируется в стек, а также микроконтроллер аппаратно сбрасывает флаги I и источника прерывания в нулевое состояние. Обработчик прерывания должен заканчиваться командой возврата из прерывания (reti), после чего адрес возврата будет восстановлен в регистр PC и флаг I будет установлен.

Ниже приведен пример использования обработчика внешнего прерывания INT0.

Инструкция перехода, которая находится в нулевом адресе (вектор сброса для всех моделей AVR), передает управление в начало основной программы main, где происходит инициализация микроконтроллера. Условием возникновения прерывания выбрано изменение состояния вывода INT0 с логической «1» на «0» (нажатие кнопки). При возникновении этого события вызывается подпрограмма по адресу 0x0001 (вектор прерывания INT0) и затем обработчик service_INT0. В обработчике необходимо сохранить содержимое SREG и, при необходимости, остальных регистров, используемых в основной программе.

Может возникнуть ситуация, когда возникнут несколько запросов на прерывание одновременно (несколько флагов прерывания будут установлены одновременно). В этом случае будет вызван первый обработчик, адрес которого находится выше в таблице векторов прерываний. Например, если поступят запросы от АЦП (адрес 0x000E) и компаратора (адрес 0x0010), то первым будет обработан запрос от АЦП. Таким образом, каждое прерывание в AVR имеет свой неизменный приоритет, определяемый его положением в таблице векторов.

Здесь возникают две проблемы. Во-первых, обработка отдельных прерываний может занимать достаточно много времени, чрезмерно задерживая обработку других запросов. Во-вторых, прерывание с низким приоритетом может иметь большее значение для устройства. Оба этих случая можно решить, допустив вложенные прерывания. Для этого после сохранения контекста в обработчике прерывания необходимо установить флаг I вручную с помощью команды sei:

Однако использование вложенных прерываний может стать проблематичным при малом размере стека.

Перейти к следующему разделу: Порты ввода-вывода

Источник

AVR Урок 10. Таймеры-счетчики. Прерывания

Урок 10

Таймеры-счетчики. Прерывания

Данное занятие познакомит вас с понятием таймеров-счетчиков в микроконтроллерах и их назначением, а также с функциональностью прерываний и их применением.

Таймеры-счетчики представляют собой устройства или модули, которые постоянно считают что-либо, что следует из их названия. Они могут считать либо до заданного значения, либо до значения, которое ограничивается разрядностью счетчика. Счет происходит с определенной скоростью, а именно с тактовой частотой микроконтроллера, поделенной на коэффициенты делителя частоты, которые можно организовать в определенных регистрах.

Таймеры-счетчики начинают считать, если их инициализировать.

В микроконтроллере Atmega8 предусмотрено 3 таких таймера.

Что такое прерывание в микроконтроллере. Смотреть фото Что такое прерывание в микроконтроллере. Смотреть картинку Что такое прерывание в микроконтроллере. Картинка про Что такое прерывание в микроконтроллере. Фото Что такое прерывание в микроконтроллере

Два из них являются восьмибитными таймерами, которые могут досчитать до 255. Такое значение недостаточно для наших задач, даже если учесть максимальный коэффициент делителя частоты. В итоге счетчик не сможет досчитать до одной секунды, не говоря уже о половине секунды. Мы должны реализовать такой счет для управления индикаторным светодиодом полностью аппаратно. Можно, конечно, увеличить значение переменной до определенной величины, но хотелось бы полностью использовать аппаратный подсчет.

Есть и другой таймер – это полноправный 16-битный таймер. Он обладает не только 16-битной разрядностью, но также имеет и другие возможности, отсутствующие у остальных таймеров. Эти функции мы рассмотрим позднее.

Сейчас мы изучим и применим именно этот 16-битный таймер. После этого вы сможете самостоятельно изучить и работу двух других шаг за шагом, поскольку они гораздо проще. Однако в дальнейшем мы также будем изучать 8-битные таймеры, так как одного таймера недостаточно для выполнения сложных задач.

Приступим к краткому рассмотрению прерываний.

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

В нашем контроллере Atmega8 существует 19 видов прерываний. Все они представлены в таблице технической документации для данного контроллера.

Что такое прерывание в микроконтроллере. Смотреть фото Что такое прерывание в микроконтроллере. Смотреть картинку Что такое прерывание в микроконтроллере. Картинка про Что такое прерывание в микроконтроллере. Фото Что такое прерывание в микроконтроллере

Какие условия могут вызвать прерывания? Например, счет таймера достиг заданного значения или на шину поступил определенный байт и таким образом.

Сейчас наша задача — обработать прерывание с TIMER1 COMPA, которое находится в таблице, размещённой вверху на 7-й позиции и вызывается по адресу 0x006.

Теперь рассмотрим наш таймер TIMER1, который имеет 16 бит.

Вот его структурная схема:

Что такое прерывание в микроконтроллере. Смотреть фото Что такое прерывание в микроконтроллере. Смотреть картинку Что такое прерывание в микроконтроллере. Картинка про Что такое прерывание в микроконтроллере. Фото Что такое прерывание в микроконтроллере

Здесь есть регистр TCNTn, в котором число постоянно изменяется и увеличивается. Практически это счетчик, который хранит число, которого достиг таймер.

В регистры OCRnA и OCRnB (где n — номер таймера, в данном случае 1) мы записываем число, с которым будет сравниваться число в регистре TCNTn.

Например, когда число в регистре OCRnA совпадает со значением счетчика, возникает прерывание, которое мы можем обработать. Таймеры с прерываниями очень похожи на обычные задержки в коде, но во время задержки нам нельзя выполнять другой код. В то время, когда таймер считает, весь код в программе выполняется. Таким образом, мы не позволяем контроллеру простаивать в течение секунд или полусекунды. За это время мы можем обрабатывать нажатия кнопок и многое другое.

Еще есть регистр TCCR, который отвечает за настройку таймера.

Также у таймера есть несколько режимов, о которых мы узнаем позже.

У таймера два регистра: TCCR1A и TCCR1B. В одной половинке регистра хранится старшая часть регистра, а в другой — младшая. Можно также назвать это регистровой парой, которая принадлежит таймеру 1.

Регистр TCCR отвечает за установку делителя, чтобы таймер считал медленнее, и также за установку режима.

Биты WGM отвечают за установку режима.

Что такое прерывание в микроконтроллере. Смотреть фото Что такое прерывание в микроконтроллере. Смотреть картинку Что такое прерывание в микроконтроллере. Картинка про Что такое прерывание в микроконтроллере. Фото Что такое прерывание в микроконтроллере

Здесь представлены разные разновидности режимов.

Normal — это обычный режим, таймер считает полностью.

PWM — это ШИМ, таймер может играть роль широтно-импульсного модулятора. Эту технологию мы рассмотрим позже.

CTC – это режим сброса по совпадению, который идеально подходит для нашего случая. В этом режиме сравниваются значения регистров TCNT и OCR. Режимов CTC на самом деле два, нам нужен первый, а второй работает с другим регистром.

Мы не будем изучать все разновидности режимов в этом уроке. Если мы понадобимся эти режимы в будущем, мы разберемся с ними.

Давайте не будем тратить время на чтение документации и наконец-то попробуем записать что-то в регистры.

Код, как обычно, был создан на основе предыдущего проекта. Для протеуса мы также скопировали и переименовали код из прошлого урока, а в свойствах контроллера указали путь к новой прошивке. Наш проект мы назовем Test07.

Давайте, как обычно, скомпилируем код и запустим его в протеусе. Если все работает хорошо, мы можем добавить новый код.

Мы добавим еще одну функцию, так как на прошлом уроке мы уже научились их добавлять. Код новой функции будет находиться после функции segchar и до функции main. Мы будем вызывать функцию segchar изнутри нашей новой функции.

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

Главную функцию мы назовем timer_ini.

void timer_ini ( void )

Между нашими функциями и объявлением глобальных переменных и прототипов функций мы будем разделять двумя чертами. Компилятор будет игнорировать эти две черты, поскольку они являются комментариями. Это поможет нам видеть, где заканчивается одна функция и начинается другая.

Эта функция не принимает никаких аргументов и не возвращает никакого значения. Давайте сразу вызовем эту функцию внутри функции main().

unsigned char butcount=0, butstate=0;

timer_ini ();

Теперь мы начнем заполнять эту функцию кодом.

Начнем с регистра управления таймером TCCR1B. Мы будем использовать операцию «ИЛИ» для установки единицы в определенный бит регистра.

void timer_ini ( void )

TCCR1B = (1 WGM12 ); // устанавливаем режим CTC (сброс по совпадению)

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

Что такое прерывание в микроконтроллере. Смотреть фото Что такое прерывание в микроконтроллере. Смотреть картинку Что такое прерывание в микроконтроллере. Картинка про Что такое прерывание в микроконтроллере. Фото Что такое прерывание в микроконтроллере

Таймер также имеет регистр TIMSK, который отвечает за маски прерываний (Interrupt Mask). Этот регистр доступен для всех таймеров и позволяет установить бит OCIE1A, который включает прерывание TIMER1 COMPA.

Что такое прерывание в микроконтроллере. Смотреть фото Что такое прерывание в микроконтроллере. Смотреть картинку Что такое прерывание в микроконтроллере. Картинка про Что такое прерывание в микроконтроллере. Фото Что такое прерывание в микроконтроллере

TCCR1B = (1 WGM12); // устанавливаем режим СТС (сброс по совпадению)

TIMSK = (1 OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)

Теперь давайте поэкспериментируем с регистрами сравнения OCR1A(H и L). Для этого нам нужно будет немного посчитать. OCR1AH хранит старшую часть числа для сравнения, а OCR1AL — младшую.

Но прежде чем считать, давайте пока напишем код с произвольными значениями OCR1A и затем внесем корректировки, так как мы собираемся инициализировать делитель и он также будет использоваться для расчета необходимого времени счета. Без делителя таймер будет считать слишком быстро.

TIMSK = (1 OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)

OCR1AH = 0b10000000; //записываем в регистр число для сравнения

OCR1AL = 0b00000000;

TCCR1B = (); //установим делитель.

Пока необходимо установить делитель, так как он еще не рассчитан. Позже мы этим займемся.

В регистре OCR1A у нас находится число 0b1000000000000000, что соответствует десятичному числу 32768.

Микроконтроллер работает из расчета 8000000 Гц.

Делим 8000000 на 32768, получаем приблизительно 244,14. Вот с такой частотой и будет функционировать таймер, если мы не используем делитель. Числа будут меняться 244 раза в секунду, поэтому мы просто не увидим эти изменения. Поэтому нам нужно применить делитель частоты таймера. Выберем делитель 256. Он нам подходит, и к 1 Гц мы скорректируем число для сравнения.

Вот доступные делители для таймера 1:

Что такое прерывание в микроконтроллере. Смотреть фото Что такое прерывание в микроконтроллере. Смотреть картинку Что такое прерывание в микроконтроллере. Картинка про Что такое прерывание в микроконтроллере. Фото Что такое прерывание в микроконтроллере

В таблице отмечен нужный нам делитель. Нам нужно установить только бит CS12.

Так как у нас делитель частоты равен 256, мы разделим 8000000 на этот делитель и получим 31250. Это число мы занесем в TCNT. Таймер будет считать до этого числа, чтобы достичь 1 секунды. Число 31250 в двоичной системе равно 0b0111101000010010. Мы запишем это число в регистр, а затем применим делитель.

OCR1AH = 0b01111010; //записываем в регистр число для сравнения

Для переменной OCR1AL установлено значение 0b00010010;

Для переменной TCCR1B установлено значение 1 CS12 — это устанавливает делитель.

Действие данной функции завершено.

Теперь перейдем к следующей функции — обработчику прерывания от таймера при совпадении. Она определена следующим образом:

ISR ( TIMER1_COMPA_vect )

Внутри этой функции будет выполняться тело кода при совпадении чисел.

Нам понадобится еще одна переменная. Давайте объявим ее глобально в начале файла:

unsigned char i;

Соответственно, мы можем удалить такую же переменную из кода функции main().

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

while (1)

// for(i=0;i

// while (butstate==0)

// if (!(PINB&0b00000001))

// if(butcount

// butcount++;

// else

// butstate=1;

// else

// if(butcount > 0)

// butcount–;

// else

// butstate=1;

// else

// segchar(i);

// _delay_ms(500);

// butstate=0;

Теперь мы перейдем к телу функции-обработчика. Мы будем вызывать функцию segchar здесь. Затем мы увеличим переменную i на 1. Чтобы предотвратить выход переменной за пределы числа с одной цифрой, мы установим ее равной нулю при выполнении этого условия:

if ( i >9) i =0;

segchar ( i );

Также мы должны изменить код в начале функции main(). Заблокируем порт D, который отвечает за состояние сегментов, чтобы индикатор не светился при включении, так как он положительный. Затем мы приведем переменную i к нулевому значению, просто для поддержки порядка. Кстати, обычно неинициализированные переменные имеют значения равные нулю по умолчанию. Но мы все же инициализируем ее. И самое главное, чтобы работало прерывание от таймера, недостаточно включить его в инициализации таймера. Для работы всех прерываний нужно разрешить глобальные прерывания. Существует специальная функция sei () — Установить прерывание для этого.

Теперь наш код будет выглядеть следующим образом:

PORTD = 0b11111111;

sei ();

Также мы должны подключить файл библиотеки прерываний вначале файла.

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

//unsigned char butcount=0, butstate=0;

Соберем наш код и проверим его работоспособность сначала в Proteus. Если все работает нормально, проверим на реальной схеме.

Что такое прерывание в микроконтроллере. Смотреть фото Что такое прерывание в микроконтроллере. Смотреть картинку Что такое прерывание в микроконтроллере. Картинка про Что такое прерывание в микроконтроллере. Фото Что такое прерывание в микроконтроллере

Всё функционирует у нас. Великолепно!

Таким образом сработал секундомер. Однако, поскольку мы даже не имеем кварцевого резонатора, невозможно признать данный секундомер точным.

Тем несмотря на это, сегодня мы изучили множество нового. Мы усвоили прерывания и научились их обрабатывать, а также освоили работу с таймерами, настройку новых регистров микроконтроллера. Раньше мы работали только с портовыми регистрами. В результате мы добились значительного снижения нагрузки на арифметико-логическое устройство нашего микроконтроллера.

Покупку программатора можно совершить здесь (продавец надёжный) USBASP USBISP 2.0

Источник

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

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