Sibprompost.ru

Стройка и ремонт
4 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Прерывания от таймеров счетчиков avr

Введение

Таймер-счетчик является одним из самых ходовых ресурсов AVR микроконтроллера. Его основное назначение — отсчитывать заданные временные интервалы. Кроме того, таймеры-счетчики могут выполнять ряд дополнительных функций, как то — формирование ШИМ сигналов, подсчет длительности и количества входящих импульсов. Для этого существуют специальные режимы работы таймера-счетчика.

В зависимости от модели микроконтроллера количество таймеров и набор их функций может отличаться. Например, у микроконтроллера Atmega16 три таймера-счетчика — два 8-ми разрядных таймера-счетчика Т0 и Т2, и один 16-ти разрядный — Т1. В этой статье, на примере ATmega16, мы разберем как использовать таймер-счетчик Т0.

Используемые выводы

Таймер-счетчик Т0 использует два вывода микроконтроллера ATmega16. Вывод T0 (PB0) — это вход внешнего тактового сигнала. Он может применяться, например, для подсчета импульсов. Вывод OC0 (PB3) — это выход схемы сравнения таймера-счетчика. На этом выводе с помощью таймера может формировать меандр или ШИМ сигнал. Также он может просто менять свое состояние при срабатывании схемы сравнения, но об этом поговорим позже.

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

Регистры таймера-счетчика Т0

Хоть это и скучно, но регистры — это то, без чего невозможно программировать микроконтроллеры, конечно, если вы не сидите плотно на Arduino. Так вот, таймер Т0 имеет в своем составе три регистра:

— счетный регистр TCNT0,
— регистр сравнения OCR0,
— конфигурационный регистр TCCR0.

Кроме того, есть еще три регистра, относящиеся ко всем трем таймерам ATmega16:

— конфигурационный регистр TIMSK,
— статусный регистр TIFR.
— регистр специальных функций SFIOR

Начнем с самого простого.

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

OCR0

Это 8-ми разрядный регистр сравнения. Его значение постоянно сравнивается со счетным регистром TCNT0, и в случае совпадения таймер может выполнять какие-то действия — вызывать прерывание, менять состояние вывода OC0 и т.д. в зависимости от режима работы.

Значение OCR0 можно как читать, так и записывать.

TCCR0 (Timer/Counter Control Register)


Это конфигурационный регистр таймера-счетчика Т0, он определяет источник тактирования таймера, коэффициент предделителя, режим работы таймера-счетчика Т0 и поведение вывода OC0. По сути, самый важный регистр.

Биты CS02, CS01, CS00 (Clock Select) — определяют источник тактовой частоты для таймера Т0 и задают коэффициент предделителя. Все возможные состояния описаны в таблице ниже.

Как видите, таймер-счетчик может быть остановлен, может тактироваться от внутренней частоты и также может тактироваться от сигнала на выводе Т0.

Биты WGM10, WGM00 (Wave Generator Mode) — определяют режим работы таймера-счетчика Т0. Всего их может быть четыре — нормальный режим (normal), сброс таймера при совпадении (CTC), и два режима широтно-импульсной модуляции (FastPWM и Phase Correct PWM). Все возможные значения описаны в таблице ниже.

Более подробно будем разбирать режимы в коде. Сейчас все нюансы все равно не запомнятся.

Биты COM01, COM00 (Compare Match Output Mode) — определяют поведение вывода OC0. Если хоть один из этих битов установлен в 1, то вывод OC0 перестает функционировать как обычный вывод общего назначения и подключается к схеме сравнения таймера счетчика Т0. Однако при этом он должен быть еще настроен как выход.
Поведение вывода OC0 зависит от режима работы таймера-счетчика Т0. В режимах normal и СTC вывод OC0 ведет себя одинаково, а вот в режимах широтно-импульсной модуляции его поведение отличается. Не будем сейчас забивать себе голову всеми этими вариантами и разбирать таблицы для каждого режима, оставим это на практическую часть.

Читайте так же:
Счетчик калорий myfitnesspal inc

И последний бит регистра TCCR0 — это бит FOC0 (Force Output Compare). Этот бит предназначен для принудительного изменения состояния вывода OC0. Он работает только для режимов Normal и CTC. При установки бита FOC0 в единицу состояние вывода меняется соответственно значениям битов COM01, COM00. FOC0 бит не вызывает прерывания и не сбрасывает таймер в CTC режиме.

TIMSK (Timer/Counter Interrupt Mask Register)

Общий регистр для всех трех таймеров ATmega16, он содержит флаги разрешения прерываний. Таймер Т0 может вызывать прерывания при переполнении счетного регистра TCNT0 и при совпадении счетного регистра с регистром сравнения OCR0. Соответственно для таймера Т0 в регистре TIMSK зарезервированы два бита — это TOIE0 и OCIE0. Остальные биты относятся к другим таймерам.

TOIE0 — 0-е значение бита запрещает прерывание по событию переполнение, 1 — разрешает.
OCIE0 — 0-е значение запрещает прерывания по событию совпадение, а 1 разрешает.

Естественно прерывания будут вызываться, только если установлен бит глобального разрешения прерываний — бит I регистра SREG.

TIFR (Timer/Counter0 Interrupt Flag Register)

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

Если в эти моменты в регистре TIMSK разрешены прерывания и установлен бит I, то микроконтроллер вызовет соответствующий обработчик.
Флаги автоматически очищаются при запуске обработчика прерывания. Также это можно сделать программно, записав 1 в соответствующий флаг.

TOV0 — устанавливается в 1 при переполнении счетного регистра.
OCF0 — устанавливается в 1 при совпадении счетного регистра с регистром сравнения

SFIOR (Special Function IO Register)

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

Сброс осуществляется при установке бита PSR10 (Prescaler Reset Timer/Counter1 и Timer/Counter0) в единицу.

Заключение

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

Таймеры счетчики микроконтроллеров AVR

В микроконтроллерах AVR может быть до 4х таймеров/счетчиков (ТС). Разрядность этих таймеров 8 или 16 бит (т.е. они могут считать до 2 8 =256 или до 2 16 =65536). Обычно их используют для точного формирования временных интервалов, подсчета импульсов на выводах микроконтроллера, формирования последовательности импульсов. Таймеры способны вырабатывать запросы на прерывания, при этом освобождая процессор от необходимости опроса состояния таймеров. В данной статье мы разберем работу таймеров и прерываний, которые они могут вырабатывать, на примере 16-ти битного таймера/счетчика1 (TС1) микроконтроллера ATmega8. Всего у этого МК три таймера — два 8ми битных (TС0, TС2) и один 16 битный (TС1). Взглянем на таблицу векторов прерываний МК mega8 — 7 прерываний связаны с таймерами микроконтроллера, из них 4 связаны с таймером/счетчиком1 (TС1). Давайте разберемся, что же может этот таймер, какие регистры им управляют и что в них нужно записать, чтобы настроить таймер как нам нужно. Для начала рассмотрим все регистры ТС1 и за что какой бит отвечает, а потом рассмотрим какие-нибудь простые примеры по настройке таймера. Начнем с регистров управления таймером.

Читайте так же:
Счетчик расходомеры дизельного топлива

TCCR1A — регистр управления A

Биты 7:6 — COM1A 1:0: контролируют поведение выхода OC1A (см. Таблицу 1).

Биты 5:4 — COM1B 1:0: контролируют поведение выхода OC1B (см. Таблицу 1).

Биты 3:2 — FOC1A, FOC1B: служат для принудительного изменения состояния выходов OC1A и OC1B.

Биты 1:0 — WGM11, WGM10: служат для настройки ТС1 для работы в качестве широтно-импульсного модулятора (ШИМ). В режиме ШИМ состояние выходов OC1A и OC1B будет отличаться. В этой статье не буду ничего писать про режим ШИМа, а то будет куча информации, которую трудно переварить. Что такое ШИМ опишу как-нибудь в другой раз.

TCCR1B — регистр управления В

Бит 7 — ICNC1: подавление дребезга на входе ICP1. Если бит установлен, то определение события на входе ICP1 происходит с задержкой в 4 машинных цикла (см. дальше по тексту).

Бит 6 — ICES1: выбор фронта срабатывания прерывания по захвату. Если установлен — на растущем фронте, если сброшен — на падающем фронте.

Бит 5 — не используется

Биты 4:3 — WGM1 3:2: для настройки ШИМа.

Биты 2:0 — CS1 2:0: выбор тактирования ТС1 (Таблица 2).

Ну, настроили мы таймер и что? А дальше с частотой, которую мы выбрали в регистре TCCR1B счетчик таймера начинает считать и записывать значение счетчика в регистры TCNT1H и TCNT1L — старший и младший байт счетного регистра. При достижении TCNT1 значения 2 16 счетчик переполняется и сбрасывается, и начинает счет заново. В этот регистр мы также можем записать какое-нибудь значение, с которого мы хотим, чтобы наш счетчик стартовал. Для 16-битной операции записи, старший байт должен быть записан первым. Младшийвторым. Для операции 16-битного чтения, младший байт должен быть прочитан первым, а содержимое старшего байта считывается вторым. Если мы настроили изменение состояния входа OC1A или OC1B, тогда значение счетного регистра сравнивается каждый раз со значением регистров OCR1A и OCR1B — регистры сравнения. Каждый из этих регистров состоит из двух байт (например, OCR1AH и OCR1AL). Мы можем записать в эти регистры нужное нам значение и по совпадению значения регистра счетчика с регистром сравнения будет происходить нужное нам изменение на выходах OC1A и OC1B. Также есть регистр захвата входа — ICR1 (ICR1H и ICR1L). Значение TCNT1 в этот регистр записывается при наступлении события на входе ICP1.

Счет и изменение состояния ножек МК это уже хорошо, но также этот таймер может при определенных событиях генерить прерывания. Как мы уже видели из таблицы векторов прерываний у ТС1 есть 4 вектора прерывания — прерывание по захвату, прерывание по совпадению А, прерывание по совпадению В, прерывание по переполнению (указаны в порядке уменьшения приоритета). Рассмотрим регистры, настраивая которые можно управлять прерываниями ТС1.

TIMSK — регистр маски прерываний таймеров/счетчиков

Бит 7 — OCIE2: прерывание по совпадению ТС2

Бит 6 — TOIE2: прерывание по переполнению ТС2

Бит 5 — TICIE1: прерывание по захвату ТС1

Бит 4 — OCIE1A: прерывание по совпадению A ТС1

Бит 3 — OCIE1B: прерывание по совпадению В ТС1

Бит 2 — TOIE1: прерывание по переполнению ТС1

Бит 1 — не используется

Бит 0 — TOIE0: прерывание по переполнению ТС0

Если соответствующий бит установлен в «1» и бит I (7-й бит) регистра состояний SREG установлен в «1», тогда соответствующее прерывание будет срабатывать.

Читайте так же:
Кнопка счетчик яндекс метрика

TIFR — регистр флагов прерываний таймеров/счетчиков

Флаги соответствуют прерываниям в регистре TIMSK. Устанавливаются в «1» при выполнении условий соответствующего прерывания. Вот и вся теория связанная с ТС1. Остальные таймеры настраиваются аналогичным образом. Теперь мы можем обобщить и записать какими возможностями обладает этот таймер:

  • Счетчик 16-ти битный (16 битный ШИМ)
  • Два независимых выхода, срабатывающих по совпадению
  • Один вход по захвату события (растущий или падающий фронт) и подавление дребезга на этом входе
  • Тактирование от встроенного тактового генератора или внешний источник тактирования таймера (T1)
  • 4 независимых прерывания

Есть и другие возможности, но о них не в этот раз. На рисунке отметил ножки связанные с таймерами/счетчиками МК.

Теперь давайте придумаем себе какие-нибудь условия работы TC1 и настроим его соответствующим образом, записав нужные значения в регистры таймера. Итак, наш МК тактируется от внешнего кварца с частотой 2.048МГц, мы хотим, чтобы на выходе OC1A был прямоугольный сигнал с периодом 1сек. Как мы дальше думаем? Нам нужно чтобы на выходе OC1A при достижении какого-то значения в счетчике менялся уровень на противоположный каждые 0.5сек. Чтобы уровень менялся на противоположный в регистр TCCR1A нужно записать 0x40 (см. таблицу 1). Теперь посчитаем до какого значения должен считать счетчик. Т.к. время 1сек довольно большая то выберем делитель тактовой частоты 1024, и запишем соответственно в регистр TCCR1B значение 0x05 (см. таблицу 2). Теперь наш таймер считает с частотой 2048000/1024=2000Гц, т.е. за 1сек ТС1 досчитает до 2000, а нам нужно значение до которого он досчитает за 0.5сек. Это значение равно 2000/2=1000 (0x03E8). Именно это значение запишем в регистр OCR1A.Теперь ТС1 досчитает до 1000, его значение совпадет с OCR1A и он изменит состояние выхода OC1A на противоположное и пойдет считать дальше, что нам совсем не нужно. Чтобы этого не произошло запустим прерывание по совпадению А (TIMSK=0x10) и в обработчике будем сбрасывать регистр TCNT1. Вот собственно и все настройки. Эта программа в WinAVR будет выглядеть вот так

Прерывания от таймеров счетчиков avr

В этой статье будет рассмотрено использование таймеров в МК и способ подсоединения кнопок к нему.Сначала немного теории.

В МК ATMega16 есть три таймера/счетчика – два 8-битных (Timer/Counter0, Timer/Counter2) и один 16-битный (Timer/Counter1). Каждый из них содержит специальные регистры, одним из которых является счетный регистр TCNTn (n – это число 0, 1 или 2). Каждый раз, когда процессор выполняет одну команду, содержимое этого регистра увеличивается на единицу (либо каждые 8, 64, 256 или 1024 тактов). Потому он и называется счетным. Помимо него, есть еще и регистр сравнения OCRn (Output Compare Register), в который мы можем сами записать какое-либо число. У 8-битного счетчика эти регистры 8-битные. По мере выполнения программы содержимое TCNTn растет и в какой-то момент оно совпадет с содержимым OCRn. Тогда (если заданы специальные параметры) в регистре флагов прерываний TIFR (Timer/Counter Interrupt Flag Register) один из битов становится равен единице и процессор, видя запрос на прерывание, сразу же отрывается от выполнения бесконечного цикла и идет обслуживать прерывание таймера. После этого процесс повторяется.

Ниже представлена временная диаграмма режима CTC (Clear Timer on Compare). В этом режиме счетный регистр очищается в момент совпадения содержимого TCNTn и OCRn, соответственно меняется и период вызова прерывания.

Это далеко не единственных режим работы таймера/счетчика. Можно не очищать счетный регистр в момент совпадения, тогда это будет режим генерации широтно-импульсной модуляции, который мы рассмотрим в следующей статье. Можно менять направление счета, т. е. содержимое счетного регистра будет уменьшаться по мере выполнения программы. Также возможно производить счет не по количеству выполненных процессором команд, а по количеству изменений уровня напряжения на «ножке» T0 или T1 (режим счетчика), можно автоматически, без участия процессора, менять состояние ножек OCn в зависимости от состояния таймера. Таймер/Счетчик1 умеет производить сравнение сразу по двум каналам – А или В.

Читайте так же:
Подключение мойки с счетчиком

Далее представлена функциональная схема таймера/счетчика0:

Для запуска таймера нужно выставить соответствующие биты в регистре управления таймером TCCRn (Timer/Counter Control Register), после чего он сразу же начинает свою работу.

Мы рассмотрим лишь некоторые режимы работы таймера. Если вам потребуется работа в другом режиме, то читайте Datasheet к ATMega16 – там все подробнейше по-английски написано, даны даже примеры программ на С и ассемблере (недаром же он занимает 357 страниц печатного текста!).

Теперь займемся кнопками.

Если мы собираемся использовать небольшое количество кнопок (до 9 штук), то подключать их следует между «землей» и выводами какого-либо порта микроконтроллера. При этом следует сделать эти выводы входами, для чего установить соответствующие биты в регистре DDRx и включить внутренний подтягивающий резистор установкой битов в регистре PORTx. При этом на данных «ножках» окажется напряжение 5 В. При нажатии кнопки вход МК замыкается на GND и напряжение на нем падает до нуля (а может быть и наоборот – вывод МК замкнут на землю в отжатом состоянии). При этом меняется регистр PINx, в котором хранится текущее состояние порта (в отличие от PORTx, в котором установлено состояние порта при отсутствии нагрузки, т. е. до нажатия каких-либо кнопок). Считывая периодически состояние PINx, можно определить, что нажата кнопка.

ВНИМАНИЕ! Если соответствующий бит в регистре DDRx будет установлен в 1 для вашей кнопки, то хорошее нажатие на кнопку может привести к небольшому пиротехническому эффекту – возникновению дыма вокруг МК. Естественно, МК после этого придется отправить в мусорное ведро…

Перейдем к практической части. Создайте в IAR новое рабочее пространство и новый проект с именем, например, TimerButton. Установите опции проекта так, как это описано в предыдущей статье. А теперь наберем следующий небольшой код.

Давайте посмотрим, как это работает. В функциях init_timern задаются биты в регистрах TCCRn, OCRn и TIMSK, причем такой способ может кому-нибудь показаться странным или незнакомым. Придется объяснить сначала, что означает запись «(1 © KERNELCHIP 2006 — 2021

Микропроцессоры и микроконтроллеры

Функционирование таймеров Т0 и Т2

В состав каждого из идентичных таймеров Т0 и Т2 входят по три регистра из пространства ввода-вывода: счетный регистр TCNT0 (TCNT2), регистр управления TCCR0 (TCCR2) и регистр сравнения OCR0 (OCR2). Кроме того, таймер Т2 содержит регистр ASSR для управления его модулем (коэффициентом счета) в асинхронном режиме.

Таймер Т0 может работать в режимах 8-разрядного счетчика, счетчика внешних событий, ШИМ и формирователя сигналов. Таймер Т2 поддерживает режимы 8-разрядного счетчика, ШИМ, формирователя сигналов и часов реального времени.

Основное средство управления таймерами Т0 и Т2 – регистры TCCR0 и TCCR2. Назначение его разрядов и принципы управления представлены в табл.27.3

Принципы управления таймерами Т0 и Т2 через регистры TCCR0(2)

Принудительное изменение состояния вывода OCх в режимах Normal и CTC (зависит от битов COMх0 и COMх1)

Выбор режима работы таймера-счетчика

Описание режима работы

Читайте так же:
Какие штрафы за отмотку счетчиков

Normal (суммирующий счетчик)

Phase correct PWM

CTC (сброс при совпадении)

Режим работы блока сравнения. Определяет состояние вывода OC0 (ОС2) при наступлении события «Совпадение». Для режимов Normal и CTC доступны такие состояния

Описание состояния вывода OCх

Таймер отключен от вывода OСх

Изменение на противоположное

Вывод сбрасывается в «0»

Вывод устанавливается в «1»

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

Примечание: «х» – номер таймера: 0 или 2

Работа таймеров Т0 (Т2) в режиме Normal

В этом режиме таймер T0 (T2) функционирует как суммирующий счетчик импульсов с частотой, определяемой по табл.27.4. При переходе регистра TCNT0 (TCNT2) через значение $FF счет продолжается с состояния $00, и возникает прерывание, которое фиксируется во флаге TOV0 (TOV2). Кроме того, при равенстве счетного регистра TCNT0 (TCNT2) и регистра сравнения OCR0 (OCR2) устанавливается флаг прерывания OCF0 (OCF2), а также будет изменяться состояние вывода OC0 (OC2) в соответствии с настройками согласно табл. 27.3. Все указанные прерывания будут обрабатываться, если они разрешены через биты регистра TIMSK (табл.27.1).

Выбор источника тактового сигнала для таймеров Т0 и Т2

CSх2

CSх1

CSх0

Источник тактового сигнала

Для таймера Т0

Таймер-счетчик Т0 остановлен

Системный тактовый сигнал CLKsys

Внешний вывод Т0, счет по спаду импульса (1→0)

Внешний вывод Т0, счет по фронту импульса (0→1)

Для таймера Т2

Таймер-счетчик Т2 остановлен

Системный тактовый сигнал CLKsys (при AS2=0) или

Дополнительный кварцевый резонатор (при AS2=1)

CLKsys / 8 (при AS2=0) или CLKosc / 8 (при AS2=1)

CLKsys / 32 (при AS2=0) или CLKosc / 32 (при AS2=1)

CLKsys / 64 (при AS2=0) или CLKosc / 64 (при AS2=1)

CLKsys / 128 (при AS2=0) или CLKosc / 128 (при AS2=1)

CLKsys / 256 (при AS2=0) или CLKosc / 256 (при AS2=1)

CLKsys /1024 (при AS2=0) или CLKosc /1024 (при AS2=1)

Примечание: «х» – номер таймера: 0 или 2

Работа таймеров Т0 (Т2) в режиме CTC

В этом режиме, называемом «сброс при совпадении», таймер работает как суммирующий счетчик на регистре TCNT0 (TCNT2). Но граница счета определяется содержимым регистра OCR0 (OCR2). При достижении этого состояния счет продолжается с $00 и устанавливается флаг прерывания TOV0 (TOV2). Поскольку это состояние соответствует ситуации «Совпадение», то будет также устанавливаться флаг OCF0 (OCF2) и изменяться состояние вывода OC0 (OC2) в соответствии с настройками согласно табл. 27.3. Для генерации сигнала с заданной частотой делается настройка COMх1=0 и COMх0=1, а частота генерируемого сигнала FOC0(2) определяется соотношением:

где N – коэффициент деления предделителя (табл.3.7).

Работа таймеров Т0 (Т2) в режиме FastPWM

Режим FastPWM (быстродействующий ШИМ), позволяет генерировать высокочастотный широтно-модулированный сигнал. Суммирующий счет производится на регистре TCNT0 (TCNT2). Ширина очередного импульса будет определяться текущим содержимым регистра сравнения OCR0 (OCR2). Важно, что изменять содержимое этого регистра можно без остановки таймера, при этом помехи от переключения не возникают.

Состояние счетчика TCNT0 (TCNT2) изменяется циклически от $00 до $FF, при этом по переполнению формируется флаг прерывания TOV0 (TOV2), а при равенстве счетного регистра TCNT0 (TCNT2) и регистра сравнения OCR0 (OCR2) устанавливается флаг прерывания OCF0 (OCF2). Состояние вывода OC0 (OC2) определяется содержимым разрядов COMх1 и COMх0 согласно табл.27.5.

Частота импульсов определяется соотношением

Настройка поведения вывода OC0 (OC2) в режиме FastPWM

COMх1

COM0х0

Описание состояния вывода OC0 (ОС2)

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector