Для чего нужен таймер счетчик

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

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

Зная частоту тактового генератора fosc и коэффициент предварительного деления Kpre, легко определить частоту таймера по формуле:

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

Время одного тика таймера соответственно будет

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

Полное время счета таймера (время перебора всех допустимых значений двоичного счетчика) определится как

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

Например, если требуется реализовать задержку 1с на 8-разрядном таймере с коэффициентом предварительного деления Kpre=1 и тактовой частотой fosc=8 МГц, имеем

tic = 0,125 мкс;
Tcount = 0,125*2 8 = 32 мкс
1с/32мкс = 31250 повторений

Широтно-импульсная модуляция
Быстрый ШИМ

Период ШИМ определяется максимальным значением, до которого считает счетчик. В этот момент ШИМ-сигнал устанавливается в «1». При достижении счетчиком значения, поданного на второй вход цифрового компаратора, осуществляется сброс выходного ШИМ-сигнала.
Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

Фазовый ШИМ

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

Частотно-импульсная модуляция — сигнал переменной частоты и постоянной скважности, равной 2. При таком виде модуляции изменяется период сигнала, а длительность импульса всегда составляет половину периода.

Источник

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

Урок 10

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

Сегодня мы узнаем, что такое таймеры-счётчики в микроконтроллерах и для чего они нужны, а также что такое прерывания и для чего они тоже нужны.

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

И вот эти таймеры-счётчики постоянно считают, если мы их инициализируем.

Таймеров в МК Atmega8 три.

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

Два из них — это восьмибитные таймеры, то есть такие, которые могут максимально досчитать только до 255. Данной величины нам будет маловато. Даже если мы применим максимальный делитель частоты, то мы не то что секунду не отсчитаем, мы даже полсекунды не сможем посчитать. А у нас задача именно такая, чтобы досчитывать до 1 секунды, чтобы управлять наращиванием счёта светодиодного индикатора. Можно конечно применить ещё наращивание переменной до определенной величины, но хотелось бы полностью аппаратного счёта.

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

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

Теперь коротко о прерываниях.

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

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

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

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

Теперь давайте рассмотрим наш 16-битный таймер или TIMER1.

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

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

Мы видим там регистр TCNTn, в котором постоянно меняется число, то есть оно постоянно наращивается. Практически это и есть счётчик. То есть данный регистр и хранит число, до которого и досчитал таймер.

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

Например, занесли мы какое-нибудь число в регистр OCRnA и как только данное число совпало со значением в регистре счёта, то возникнет прерывание и мы его сможем обработать. Таймеры с прерываниями очень похожи на обычную задержку в коде, только когда мы находимся в задержке, то мы в это время не можем выполнять никакой код (ну опять же образно «мы», на самом деле АЛУ). А когда считает таймер, то весь код нашей программы в это время спокойно выполняется. Так что мы выигрываем колоссально, не давая простаивать огромным ресурсам контроллера по секунде или даже по полсекунды. В это время мы можем обрабатывать нажатия кнопок, которые мы также можем обрабатывать в таймере и многое другое.

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

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

Он состоит из двух половинок, так как у нас конотроллер 8-битный и в нем не может быть 16-битных регистров. Поэтому в одной половинке регистра (а физически в одном регистре) хранится старшая часть регистра, а в другом — младшая. Можно также назвать это регистровой парой, состоящей из двух отдельных регистров TCCR1A и TCCR1B. Цифра 1 означает то, что регистр принадлежит именно таймеру 1.

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

За установку режима отвечают биты WGM

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

Мы видим здесь очень много разновидностей режимов.

Normal — это обычный режим, таймер считает до конца.

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

CTC — это сброс по совпадению, как раз то что нам будет нужно. Здесь то и сравнивются регистры TCNT и OCR. Таких режима два, нам нужен первый, второй работает с другим регистром.

Все разновидности режимов мы в данном занятии изучать не будем. Когда нам эти режимы потребуются, тогда и разберёмся.

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

Код, как всегда, был создан из прошлого проекта. Для протеуса также код был скопирован и переименован с прошлого занятия, также в свойствах контроллера был указан путь к новой прошивке. Проекты мы назовем 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 ); // устанавливаем режим СТС (сброс по совпадению)

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

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

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

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

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

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;

// segchar(i);

// _delay_ms(500);

// butstate=0;

Теперь, собственно, тело функции-обработчика. Здесь мы будем вызывать функцию segchar. Затем будем наращивать на 1 переменную i. И чтобы она не ушла за пределы однозначного числа, будем её обнулять при данном условии

if ( i >9) i =0;

segchar ( i );

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

Теперь код будет вот таким

PORTD = 0b11111111;

sei ();

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

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

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

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

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

Всё у нас работает. Отлично!

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

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

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

Источник

Введение

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

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

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

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

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

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

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

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

OCR0

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

TCCR0 (Timer/Counter Control Register)

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

TIMSK (Timer/Counter Interrupt Mask Register)

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

TIFR (Timer/Counter0 Interrupt Flag Register)

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

SFIOR (Special Function IO Register)

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

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

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

Заключение

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

Источник

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

Регистры таймеров-счётчиков, функции, режимы, управление прерываниями
на примере МК Atmega8 (Atmega16)

Таймер микроконтроллера – это цифровой счётчик, осуществляющий подсчёт количества подаваемых на него импульсов.
Источником импульсов для таймера-счётчика могут служить: как тактовые импульсы от внутреннего генератора МК, так и импульсы, подаваемые непосредственно на вход таймера с внешнего источника.

В МК ATmega8 (Atmega16) есть три таймера: два 8-битных – Т0 и Т2, и один 16-битный – Т1. Счёт ведётся до 255 тактовых импульсов для 8-битных счётчиков и до 65535 импульсов – для 16-битного.
Далее, если не выполняется никаких программных действий, то происходит переполнение счётчика, он сбрасывается в 0 и всё повторяется бесконечное количество раз.

Для каждого таймера можно настроить делитель частоты тактовых импульсов, и, таким образом, заставить его тактироваться не только на основной частоте МК, но и на частотах, находящихся в пропорциях от 1:8 до 1:1024 по отношению к основной. Пропорция эта называется «prescaler» и прописывается в регистре TCCRx (Timer/Counter Control Register) посредством установки значений соответствующих битов.

На примере таймера-счётчика Т2, давайте посмотрим, как выглядит этот регистр TCCR2 и каково предназначение его битов. Итак:

1. Конфигурационный регистр TCCR2

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

Биты CS22, CS21, CS20 (Clock Select) – задают для таймера Т2 коэффициент предделителя.
Все возможные комбинации состояний этих битов описаны в таблице ниже:

CS22CS21CS20Описание
0 0 0 Источника тактирования нет, таймер остановлен
0 0 1 Тактовая частота МК
0 1 0 Тактовая частота МК/8
0 1 1 Тактовая частота МК/32
1 0 0 Тактовая частота МК/64
1 0 1 Тактовая частота МК/128
1 1 0 Тактовая частота МК/256
1 1 1 Тактовая частота МК/1024

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

WGM21WGM20Режим работы таймера/счётчика
0 0 Нормальный режим счётчика (normal)
1 0 Сброс таймера при совпадении регистров OCR2 и TCNT2 (CTC)
0 1 ШИМ с коррекцией фазы (Phase Correct PWM)
1 1 Быстрая ШИМ (Fast PWM)

Биты COM21, COM20 (Compare Match Output Mode) – определяют поведение вывода OC2.
Если хоть один из этих битов установлен в 1, то вывод OC2 перестаёт функционировать как обычный вывод общего назначения и подключается к схеме сравнения таймера счётчика Т2. При этом его необходимо настроить как выход. Рассмотрим различные комбинации этих битов:

COM21COM20Режим работы вывода OC2
0 0 Вывод ОС2 отключён от таймера/счётчика
0 1 Состояние вывода меняется на противоположное при совпадении
TCNT2 и OCR2 (только в режимах Normal и CTC)
1 0 На OC2 устанавливается «0» при совпадении TCNT2 и OCR2,
и устанавливается «1» при сбросе счётчика
1 1 На OC2 устанавливается «1» при совпадении TCNT2 и OCR2,
и устанавливается «0» при сбросе счётчика

Бит регистра TCCR2 – FOC2 (Force Output Compare) предназначен для принудительной установки логического уровня на выходе OC2. Он работает только для режимов Normal и CTC. При установке бита FOC2 в единицу состояние выхода меняется в соответствии со значениями битов COM21 и COM20.

Конфигурацию регистра TCCR удобно производить в двоичном коде, т. к. каждый разряд этого кода равен соответствующему разряду регистра. Например, запись:

означает, что у счётчика выбран режим СТС со сбросом таймера при совпадении регистров OCR2 и TCNT2. Тактовая частота Т2 – это рабочая частота МК, делённая на 1024. Состояние вывода ОС2 при совпадении меняется на противоположное.
А запись:

означает, что счётчик установлен в режим Fast PWM (быстрая ШИМ). Делитель частоты отключён – таймер тикает с тактовой частотой МК. Выход ОС2 установлен в состояние логического 0.

Далее опишем по порядку остальные регистры, относящиеся ко всем трём таймерам ATmega8, 16.

2. Счётный регистр TCNT2

TCNT2 – это такой же 8-битный регистр, как и TCCR2, только все разряды в нём отведены для числа, соответствующего количеству импульсов, посчитанному счётчиком. Когда таймер-счётчик работает, то по каждому импульсу тактового сигнала значение TCNT2 изменяется на единицу. В зависимости от режима работы таймера, счётный регистр может или увеличиваться, или уменьшаться.
Содержимое регистра TCNT2 можно как читать, так изменять посредством записи в него. Запись в регистр используется при необходимости задать его начальное значение.
Когда таймер работает, изменять его содержимое TCNT2 не рекомендуется, так как это блокирует схему сравнения на один такт.

3. Регистр сравнения OCR2

OCR2 – это также 8-ми разрядный регистр. Его значение в каждом цикле сравнивается со значением счётного регистра TCNT2, и в случае совпадения, заставляет таймер выполнять какие-либо действия, как то: вызывать прерывание, менять состояние вывода OC2 и т. д. в полном соответствии с командами программного кода прошивки.
Значение OCR2 можно как читать, так и записывать.

Далее поговорим о прерываниях, источником которых являются счётчики-таймеры.
Напомню, что прерывание представляет собой определённое событие, при наступлении которого приостанавливается выполнение основной программы и вызывается функция, обрабатывающая данное прерывание.

4. Регистр флагов разрешения прерываний TIMSK

TIMSK – это общий регистр для всех трёх таймеров Atmega8, 16.

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

Таймер-счётчик Т2 может вызывать прерывания при следующих условиях:
1. при переполнении счётного регистра TCNT2,
2. при совпадении значения счётного регистра со значением регистра сравнения OCR2.
При этом в регистре TIMSK для таймера Т2 зарезервированы два бита: TOIE2 и OCIE2. Все остальные биты относятся к другим таймерам.

TOIE2OCIE2Разрешение прерываний
0 0 Все прерывания запрещены
0 1 Разрешает прерывание по событию совпадение
1 0 Разрешает прерывание по событию переполнение
1 1 Разрешает прерывания по обоим событиям

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

sei(); //разрешение глобальных прерываний

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

Ещё один регистр, отвечающий за управление прерываниями – регистр TIFR.

5. Регистр флагов прерывания таймеров/счётчиков TIFR

TIFR также является общим регистром для всех трех таймеров-счётчиков Atmega8, 16.

Для чего нужен таймер счетчик. Смотреть фото Для чего нужен таймер счетчик. Смотреть картинку Для чего нужен таймер счетчик. Картинка про Для чего нужен таймер счетчик. Фото Для чего нужен таймер счетчик

TIFR – это регистр флагов. Когда срабатывает какое-то прерывание, то выскакивает статусный флаг, сигнализирующий о том, что произошло то или иное событие. Для таймера Т2 – этими событиями являются: переполнение счётного регистра TCNT2 или совпадение счётного регистра с регистром сравнения OCR2.
В эти моменты в регистре устанавливаются следующие флаги:
TOV2 – записывается 1 при переполнении счётного регистра,
OCF2 – записывается 1 при совпадении счётного регистра с регистром сравнения.
Если в эти моменты в регистре TIMSK разрешены прерывания, то микроконтроллер вызовет соответствующий обработчик.
Если прерывания запрещены, то флаг так и будет стоять до тех пор, пока программа не разрешит данный тип прерываний.
При входе в подпрограмму обработки прерывания, соответствующий прерыванию флаг регистра TIFR автоматически сбрасывается в состояние лог. 0.

Пример инициализации таймера-счётчика Т2, прописанный внутри функции main, может выглядеть следующим образом:

sei(); // Разрешение глобальных прерываний

TCCR2 = 0b00011101; /* 1. Режим СТС со сбросом таймера при совпадении регистров
OCR2 и TCNT2. 2. Тактовая частота Т2 – это рабочая частота МК, делённая на 1024.
3. Состояние вывода ОС2 при совпадении меняется на противоположное */

OCR2 = 112; // Сброс таймера произойдёт после того, как счётчик досчитает до 112

TIMSK |= (1 // В этот же момент произойдёт прерывание (по совпадению)

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

ISR (TIMER2_COMP_vect) // Если произошло прерывание по совпадению таймера Т2
<
// Действия, которые надо совершить
>

На следующих страницах рассмотрим примеры того, как можно реализовать генератор импульсов и ШИМ модулятор с использованием микроконтроллера Atmega8 (Atmega16).

Источник

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

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