Таймер обратного отсчета на мк atmega8

Таймер на микроконтроллере atmega8

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

Компактные размеры

Видео проверки таймера

Сердцем данного таймера является очень популярный и уже не дорогой микроконтроллер Atmega8. Вы можете сказать, что для прошивки нам потребуется программатор которого нет, но это не так, для прошивки Atmega достаточно всего пять коротких 10-15 см. проводков подключенных через резисторы 150-200 Ом. напрямую к LPT порту по этой схеме.

Вот по этой причине, эти микроконтроллеры стали самыми популярными у радиолюбителей.

На этом рисунке Вы видите: Схему распиновки ножек МК для подключения и прошивки.

Пункт 1. Подготовим все необходимое для изготовления таймера.

Самые обязательные радиодетали схемы, остальное обычно можно подобрать у себя дома, самая маленькая микросхема, это часы DS1307.

Нам потребуются такие радиоэлементы:
• Микроконтроллер Atmega8
• Интегральные часы DS1307
• LCD жидкокристаллический индикатор
• Стабилизатор 7805
• Конденсатор 500-1000 Мф — 16 вольт.
• Реле или электронный ключ (в зависимости от нагрузки которая планируется подключаться).
• Резисторы сопротивлением 5,1ком — 3 шт., резистор переменный (по мануалу LCD дисплея).
• Кварц часовой 32768 Гц.
• Кнопки без фиксации — 4 шт.
• Батарейка таблетка на 3 вольта.
• Текстолит для платы.
• Небольшой трансформатор

6-12в.
• Коробка распаечная для корпуса.
+ Для программатора: резисторы 150-200 Ом. — 4 шт., разъем LPT порта (для удобства, не обязателен).

Обязательные инструменты каждого радиолюбителя:
• Паяльник для пайки микросхем, паяльник для пайки пассивных радиодеталей и проводов.
• Тестер для прозвонки дорожек и проверки радиодеталей.
• Олово, канифоль.
+ Принтер лазерный (для изготовления платы или другой способ).

Пункт 2. Приступим к изготовлению.

Таймер будем делать по этой главной схеме.

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

Лично я своем таймере применил вот такую схему БП и исполнительное устройство на транзисторе и реле.

Они более компактные (без радиатора), но менее мощные, чем простое реле.

В соответствии с главной принципиальной схемой + БП + ИУ и анализом монтажных габаритов вашей коробки для корпуса, а также размеров подобранных радио элементов, проектируем форму, размер и рисунок дорожек на плате. Для этого удобно пользоваться программой Sprint Layout.

Для моего устройства получилась вот такая простая плата.

400C вместо обычных

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

На готовую плату припаиваем детали согласно схеме, особое внимание обращаем при монтаже и пайке микросхемы часов и кварцевого элемента. Длина дорожек между ними должна быть минимальной, а лучше использовать микро кварц из наручных часов и припаять его непосредственно к ножкам МС часов. Все свободное пространство рядом с МС часов и кварца заполняем площадками корпуса (GND). Батарея необходима для поддержания часов в рабочем состоянии во время отключения от сети. Если по какой-то причине вы не стали устанавливать эту батарейку, то посадите плюсовой провод на корпус, иначе часы просто не пойдут.

Микроконтроллер прошиваем программатором или с помощью 5 проводков.

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

Пункт 3. Сборка.

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




Управление меню осуществляется четырьмя кнопками.

Меню состоит из трех пунктов, СLOCK -установка часов, TIMЕ — установка таймеров и RESET -сброс всех установленных таймеров.

Сначала заходим (*) в меню часов и выставляем точное время.

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

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

На видео в начале статьи можно посмотреть подробнее о меню.

Я применяю этот таймер для полива гидропоники.

Встроенные таймеры и счётчики 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 коэффициент предделителя.
Все возможные комбинации состояний этих битов описаны в таблице ниже:

CS22 CS21 CS20 Описание
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). Все возможные значения описаны в таблице ниже:

WGM21 WGM20 Режим работы таймера/счётчика
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. При этом его необходимо настроить как выход. Рассмотрим различные комбинации этих битов:

COM21 COM20 Режим работы вывода 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. Все остальные биты относятся к другим таймерам.

TOIE2 OCIE2 Разрешение прерываний
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).

Таймер времени

Таймер отсчета времени

В данной статье опубликована схема таймера обратного отсчета времени на 59 минут 59 секунд. Схема таймера времени собрана на микросхеме Atmega8. В данной статье представлено два варианта, печатная плата в DIP28 корпусе и печатная плата в TQFP32 корпусе микроконтроллера. Схемы одинаковые, отличаются только корпусом микросхемы, выбирайте и собирайте любую печатную плату.

Также хотел еще отметить, печатная плата разведена под дисплей 0802 на контроллере HD44780. Можно установить дисплей 1602, только придется переделывать печатную плату под него или крепить его навесным монтажом (забегу наперед, прошивки для 0802 и 1602 имеются).

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

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

Схема таймера

Схема таймера обратного отсчета времени в DIP28 корпусе.

Схема таймера обратного отсчета времени в TQFP32 корпусе.

Печатная плата таймера времени

Печатная плата таймера обратного отсчета времени в DIP28 корпусе.

Печатная плата таймера обратного отсчета времени в TQFP32 корпусе.

Алгоритм работы с таймером времени

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

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

Далее, нажимаем коротко на кнопку энкодера и переключаемся на настройку минут, настраиваем нужное количество минут.

Чтобы выйти из настройки времени, нажимаем длительно кнопку энкодера и ждем сообщения «Ок!«, отпускаем кнопку. Время в данной установке можно считать настроенным. Тоже самое делаем с оставшимися тремя установками времени.

3. Запуск таймера производится коротким нажатием кнопки энкодера, появится надпись «Timer !«, это значит, что таймер готов к отсчету, повторное короткое нажатие запустит отсчет времени и на дисплее появится надпись «Timer *» и включится нагрузка.

Таймер во время отсчета можно остановить, для этого нужно нажать коротко на кнопку энкодера, таймер остановится и на дисплее появится надпись «Timer P» (нагрузка отключится) и будет мигать светодиод, чтобы продолжить отсчет, нажимаем опять коротко на кнопку энкодера и отсчет времени продолжится (нагрузка включится).

Также можно отменить отсчет времени. Для этого нужно во время отсчета или во время паузы нажать длительно на кнопку энкодера, на дисплее появится надпись «End!» и произойдет отключение нагрузки. После отпускания кнопки, таймер перейдет в главное меню.

4. По окончании отсчета времени на экране появится надпись «End!«, будет мигать светодиод и издавать сигнал бузер и произойдет отключение нагрузки. Чтобы отключить бузер и перейти в главное меню, нужно нажать коротко или длительно (не важно) кнопку энкодера.

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

Работа таймера времени

Видео работы таймера для засветки фоторезиста и паяльной маски.

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

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

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

Данная статья опубликована на сайте whoby.ru. Постоянная ссылка на эту статью находится по этому адресу http://whoby.ru/page/tajmer-vremeni

Читайте статьи на сайте первоисточнике, не поддерживайте воров.

Фото таймера времени обратного отсчета

Приведу несколько фото собранной платы таймера для засветки. Здесь первая версия без бузера, прошу не обращать на это внимания.

Скачать схему таймера времени

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

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

Заключение

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

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

Вывод PC4 для удобства выведен на отдельный разъем на плате таймера XT2. Как этот сигнал использовать или не использовать для каких то своих нужд, решайте сами, главное он есть, нужен не нужен — это другой вопрос.

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

На этом заканчиваю. Всем ровного отсчета времени.

Автор статьи: Admin Whoby.Ru

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

Многофункциональный таймер+термостат на микроконтроллере ATMega8

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

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

Рассмотрим подробно принципиальную схему, функции меню и возможности устройства.

Принципиальная схема

В основе схемы устройства находится микроконтроллер производства фирмы ATMEL семейства AVR — ATMega8 (IC4). Микроконтроллер работает с цифровым датчиком температуры IC2 DS18B20 и микросхемой реального времени IC3 DS1307. Данные выводятся на жидкокристаллический дисплей на шестнадцать знаков в две строки. Нагрузка коммутируется с бытовой сетью переменного напряжения 220 В через симисторы VS1-VS3 (BT139), которые связаны с микроконтроллером через гальваническую развязку собранную на оптосимисторах ОС1-ОС3, в данном случае это МОС3061. Таким образом микроконтроллер управляет тремя устройствами, через отдельные функциональные возможности о которых говорится ниже.

Питание схемы осуществлено по классической схеме выпрямителя на базе интегрального стабилизатора напряжения TL7805 (IC1).

Отображение данных и настройка

В нормальном положении (главном меню) отображаются следующие данные:

  • текущее время (часы, минуты, секунды);
  • текущая температура в градусах Цельсия;
  • текущая дата (число, месяц, год);
  • текущие режимы (Р — расписание; Ц — цикл; Т — термостат;).

Режим отображения данных в главном меню

Отображение режимов для настройки

Поочередным нажатием кнопки S5 (Режим / Настр.) выбираем необходимую функцию для на настройки часов, календаря, режимов включения нагрузки или коррекции работы часов. Подойдя к нужной функции и нажав клавишу S4 (Выбор) можем изменить данные клавишами S2 и S1 («+» и «-»). Принимаем изменения клавишей S4 (Выбор), отменить же изменение и вернуться в предыдущее меню возможно через S3 (Отмена / Пред.)

Режим «Расписание» (Р)

В режиме «Расписание», который отображается буквой «Р» (замечу, что меню отображается на украинском языке) можно задать суточное расписание включения и выключения нагрузки через симистор VS1. Здесь з адаем время когда микроконтроллер включит нагрузку и время когда она будет выключена. Таких событий в расписании можно задать не более 15-ти. В этом же меню выбираем включить или выключить данную функцию.

Настройка режима «Расписание»

При включенном режиме «Расписание» в главном меню отображается буква «Р».
Режим «Цикл» (Ц)

В режиме «Цикл» задается циклическое включение и выключение нагрузки на симисторе VS2. Здесь выбирается интервал времени в минутах в течении которого нагрузка будет включена и отдельно настраиваем сколько ей быть выключенной. Это будет повторяться до тех пор, пока не выключить данный режим.

Настройка режима «Цикл»

При включенном режиме «Цикл» в главном меню отображается буква «Ц».

Режим «Термостат» (Т)

В режиме «Термостат» мы можем управлять электрическим нагревателем или охладителем через симистор VS3. Для этого выбираем пороговое значение температуры при котором включается нагреватель или охладитель. Если в настройке выбрать опцию «Нагреватель», то нагрузка включится при изменении температуры на 1ºС ниже заданного значения. При включенной опции «Охладитель» нагрузка включится при изменении температуры на 1ºС выше заданного значения.

Настройка режима «Термостат»

При включенном режиме «Термостат» в главном меню отображается буква «Т».

Функция «Коррекция»

Известно, что точность подобных часов зависит от микросхемы реального времени DS1307 и специального кварцевого резонатора частотой 32.768 кГц и, как правило, трудно подобрать детали для абсолютно точных часов. Поэтому реализована функция «Коррекция», где можно задать компенсацию времени.

В настройке задаем сколько секунд добавить или отнять в сутки или в неделю.

Печатная плата и программа

Расположение деталей на печатной плате

Расположение розеток на задней стенке прибора

При программировании микроконтроллера фьюзы выставляем так:

Скачать прошивку[/hidepost]

Таймер обратного отсчета на мк atmega8

Сразу разберу, почему называется «таймер/счетчик». На самом деле Таймер/счетчик – аппаратная часть МК, которая подсчитывает количество каких-либо импульсов. Таких импульсов может быть два вида: 1. Генератор МК; 2. Импульсы на ножке МК.

1. Генератор МК. Как все уже знают, МК работает с определенной частотой, которая определяется выбранным генератором (внутренним или внешним). Так вот, в этом режиме импульс для таймера подается от этого генератора с той же частотой. Именно этот режим работы таймера/счетчика и называется Таймером.
2. Импульсы на ножке МК . Значение таймера/счетчика изменяется в зависимости от состояния сигнала на определенной ножке. Т.е. считает количество импульсов на ножке. Этот режим называют Счетчиком.

Как же работает Таймер/Счетчик? Элементарно! В памяти МК есть кусочек отведенный для таймера, называется регистр TCNT0. Этот регистр, при запуске равен 0, при появлении импульса от генератора или ножки МК, значение регистра увеличивается на 1. Так как регистр TCNT0 восьмиразрядный, то его максимальное значение равно 0xFF. После того как Таймер/Счетчик насчитал 256 импульсов (0xFF) он сбрасывается на 0 и начинает все заново.

Тут начинается самое интересное! Таймер/Счетчик0 при переполнении и сбросе регистра вызывает TCNT0 прерывание. С какой частотой будет выполняться прерывание не сложно посчитать. Для этого частоту работы МК надо разделить на 256 (максимальное значение таймера). К примеру, частота ATmega8 по умолчанию (заводские настройки) составляет 1МГц, отсюда 1000000/256= 3906,25 раз в секунду будет вызываться прерывание. Многовато. Для этого существуют пределители. Хитрое слово, но все элементарно на деле. Пределитель заставляет таймер реагировать не на каждый импульс, а через n – раз. Эээээ….

В ATmega8 для Таймера/Счетчика0 можно устанавливать пределители 8, 64, 256, 1024. Таким образом таймер0 будет считать не все импульсы подряд, а только 8-ой, 64-ый, 256-ой и 1024-ый соответственно. Посчитаем на примере, 1000000/8/256= 488,28125 Герц. – это с пределителем 8. и 1000000/1024/256= 3,814697265625 в секунду с пределителем 1024 – думаю, что формула ясна.

Таким образом, знаю частоту работы МК можно высчитывать частоту срабатывания прерываний. Кстати прерывание называется «прерывание по переполнению таймера0».

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

Теория вроде закончилась. Далее…

Я рекомендую: как только вы решили изучить новую функцию в МК, сразу открывать регистры управления этой функцией. Вот и сейчас мы отправимся к ним в гости. И так:

Наш таймер (Таймер/счетчик0 в ATmega8) использует всего 4 регистра: TCCR0, TCNT0, TIMSK, TIFR. Два из них принадлежат только нашему таймеру, а оставшимися он пользует по совместительству.

TCCR0 – самый главный регистр у данного таймера. Он управляет его пределителем, источником импульсов (такта) и включением/выключением.

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

Тут должно быть все понятно. Поясню только нижние две строки. Внешний источник от пина Т0 – это и есть та нога МК, на которой ожидается импульс. Счетчик может считать не только 0 и 1, но и снижение или повышение питания – это удобно в большинстве случаев.
TCNT0 – еще проще. В это регистре хранится значение таймера/счетчика на данный момент, его можно считывать и устанавливать в необходимое значение. Его внешний вид:

TIMSK – Это регистр используется по совместительству. Таймер/счетчик0 использует только один бит0 под названием TOIE0, все остальные регистры используются другими функциями МК.

Если бит TOIE0 установлен (1), то прерывание по переполнению разрешено. Ну и 0 прерывание запрещает. Т.е. когда необходимо можно отключить прерывание, но счетчик будет продолжать считать.

TIFR – еще один регистр, используемый по совместительству. В нем нас интересует только бит 0 – TOV0.

Этот бит является сигнализатором. Он устанавливается в 1 при срабатывании прерывания и сбрасывается, когда прерывание начинает выполняться, точнее еще раньше – в момент перенаправления программы по вектору прерывания.

Ну это все что я могу сказать о таймере/счетчике0. Это только поверхностные сведения, вполне достаточные для начала работы с таймером. Для подробной информации читайте даташит.

Ах, да, чуть не забыл – маленький примерчик:

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
// Функция, которая будет выполняться при срабатывании прерывания.

//Чаво хотим, таво и пишим.

TCCR0 |= _BV(CS01); //Запускаем таймер с пределителем 8

TIMSK |= _BV(TOIE0); // Разрешаем прерывание по переполнению

sei (); // Разрешаем глобальные прерывания МК

// далее бесконечный цикл программы. МК будет спать и ждать прерывания.

Это была первая статья из серии о таймерах.

Урок 5. Использование таймера в AVR микроконтроллерах

Прежде чем приступить к изучению таймера определимся с базовым понятием «частота». Простым языком, это количество повторений, в секунду. Это значит, что если вы за секунду хлопнете в ладошки 2 раза, то частота хлопков будет равна 2Гц. Если за 3 раза, значит 3Гц.

Каждый микроконтроллер работает на определенной частоте. Большинство инструкций выполняется за один такт, поэтому чем выше частота, тем быстрее работает микроконтроллер. Если нет источника тактирования, соответственно ничего работать не будет. На случай отсутствия внешнего источника тактирования, в большинстве микроконтроллеров имеется свой внутренний генератор. Обычно на него «с завода» настроены.

Частота внутреннего источника может изменяться («плавать») из за температуры и т.п., поэтому считается непригодным для серьезных проектов, а у нас ведь именно такие 🙂 Поэтому применяется стабильный источник внешней частоты — кварцевый резонатор (кварц). Один из вариантов исполнения кварцевого резонатора:

Теперь, кое что о таймере. Таймер работает на той же частоте, что и микроконтроллер. Иногда это может быть слишком быстро, поэтому используют предделитель который уменьшает количество тиков в 8/64/256/1024… раз. Включается это все программно.

Допустим, мы выбрали предделитель 1024, частота микроконтроллера 8 МГц, значит после предделителя частота таймера станет:
8 000 000 / 1024 = 7813 Гц — это частота, на которой работает наш таймер. По простому говоря, за одну секунду таймер тикнет 7813 раз.

К количеству тиков можно привязать выполнение кода. Эта фича есть не для всех таймеров, читайте документацию на свой камень. Допустим, нам нужно, чтобы раз в 0,5 секунды выполнялся наш код. За одну секунду 7813 тиков, за пол секунды в 2 раза меньше — 3906. Это значение вносится в регистр сравнения, и с каждым тиком проверяется достаточно ли оттикало или нет, как в будильнике, только очень быстро.

Но вот у нас совпали эти 2 значения и что дальше? Для этого существует такая полезная штука как прерывание по совпадению. Это значит, что при совпадении таймера и регистра сравнения, ваша текущая программа остановится. После этого выполнится участок кода, который абсолютно не связан с основной программой. Внутри этого участка вы можете писать что угодно и не беспокоиться о том, что он как то повлияет на программу, выполнится он только когда значение таймера совпадет с регистром сравнения.

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

Вот теперь мы готовы написать нашу программу. Поэтому создаем проект с помощью мастера проектов. Сразу прицепим LCD, мы же уже это умеем).

Переходим на вкладку Timers и тут остановимся поподробнее:

Выбираем частоту 7813 и устанавливаем галочку напротив пункта Interrupt on: Compare A Match. Таким образом мы указали, что при совпадении значения выполнять прерывание (то о чем было написано выше). Прерывание будем выполнять 1 раз в секунду, т.е. нам нужно тикнуть 7813 раз, поэтому переводим число 7813 в шестнадцатеричную систему и получим 1e85. Именно его и записываем в регистр сравнения Comp A. Регистр сравнения Comp A 16 битный, поэтому число больше 2^16=65536 мы записать не можем.

Генерим, сохраняем, вычищаем наш код. Появится новый непонятный кусок кода

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
<

Это то самое прерывание. Именно внутри этих скобок мы можем писать тот код, который мы хотели бы выполнять через определенные промежутки времени. У нас это одна секунда. Итак логично создать переменную, которую мы будем увеличивать 1 раз в секунду, т.е. 1 раз за прерывание. Поэтому проинициализируем переменную int s =0; а в прерывании будем ее увеличивать от 0 до 59. Значение переменной выведем на жк дисплей. Никаких хитростей, все очень просто.
Получившийся код.

Прикрутив еще 2 переменные можно получить часы на микроконтроллере).
Файл прошивки и протеуса