Кухонный таймер на atmega8 своими руками. Таймер на ATmega8 и светодиодных индикаторах

Этот таймер предназначен для установки выдержек от 5 секунд до 100 минут. На его выходе имеется достаточно мощное электромагнитное реле, позволяющее коммутировать ток до З0А при напряжении 12V и ток до 10А при напряжении 220V. Благодаря применению электромагнитного реле таймер может управлять не только нагревательными или осветительными приборами, но и электронными приборами, критичными к форме питающего переменного напряжения. Трансформаторное питание, в сочетании с реле, обеспечивает полную гальваническую развязку электронной схемы таймера от сети.

Для общения таймера с оператором есть четырехразрядный светодиодный индикатор, в нем очень старые 7-сегментные матрицы АЛ304 в количестве четырех штук, соединены в матрицу путем соединения вместе одноименных сегментных выводов. Конечно можно использовать и более современные светодиодные индикаторы, и даже готовые матрицы по четыре разряда под динамическую индикацию.

Управляют таймером кнопками S1, S2, S3, S4. При нажатии кнопки S1 происходит включение нагрузки и запуск таймера. Чтобы установить время, в течение которого должна работать нагрузка, нужно нажать S4.На дисплее будут мигать два старших разряда (минуты). Теперь кнопками S2 и S3 можно установить значение минут. Затем нужно еще раз нажать S4. Теперь будут мигать младшие разряды и кнопками S2 и S3 можно установить секунды. Чтобы сохранить установки нужно еще раз нажать S4. Теперь индикатор будет показывать установленную выдержку. Чтобы запустить таймер нужно нажать S1. Нагрузка включается, а показания индикатора начинают убывать. Как только заданное время иссякнет на индикаторе появляется надпись «OFF», а нагрузка выключается электромагнитным реле. Чтобы повторить нужно дважды нажать кнопку S1. При первом нажатии «OFF» сменится на показание заданного времени, а при втором произойдет запуск таймера. Управление реле по выводу 23 D1. Включение - логической единицей. Ключ на VT5 и VT6 управляет электромагнитным реле К1. Такие реле используются в схемах автомобильных сигнализаций. Они могут коммутировать как постоянный ток (12V) так и переменный (220V), поскольку обладают хорошей изоляцией.

Источник питания выполнен на маломощном трансформаторе. Поскольку вторичная обмотка трансформатора имеет отвод от середины (12-0-12), то выпрямитель сделан не по мостовой, а по двухполупериодной схеме на двух диодах VD2 и VD3. Если трансформатор будет с обмоткой 12V без отводом, то нужен выпрямительный мост. Реле питается непосредственно с выхода выпрямителя, а остальная схема через стабилизатор А1 напряжения 5V.

При прошивке нужно задать на работу с внутренним генератором 8 МГц.

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

Транзисторы КТ315 можно заменить на КТ3102 или любые аналоги. Транзистор КТ815 можно заменить на КТ817, КТ604. Диод КД521 - практически любой аналог. Диоды в выпрямителе КД209 - любые диоды выпрямительные на постоянный ток не ниже 150 мА. Интегральный стабилизатор 7805 можно заменить любым 5-вольтовым, например, КР142ЕН5А. Или сделать стабилизатор по параметрической схеме на двух транзисторах и стабилитроне на 5V. По поводу индикаторов сказано выше. Это могут быть любые семисегментные индикаторы с общим анодом(катодом).

Архив для статьи "Таймер на Atmega8 и светодиодных индикаторах"
Описание: Файлы прошивок
Размер файла: 5.58 KB Количество загрузок: 4 319


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

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

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

компактная конструкция и простая схемотехника;

– оперативное кнопочное управление;

– при управлении кнопками, дублирование действий на ЖКИ;

– задание времени с точностью до секунды;

– диапазон отсчета от 1 секунды до 24 часов;

– функция старт, пауза;

– функция сброса отсчета и выставленных значений времени;

– при достижении значения 00.00.00, включается исполнительное устройство;

Все поставленные задачи были реализованы в этом проекте.

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

После включения таймера, можно выставлять время, которое нам требуется. Назначение кнопок видно на схеме. После установки, нажимаете кнопку СТАРТ-пауза отсчет начинается. Максимальное выставляемое время 23.59.59.

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

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

Если при его работе таймера нажать кнопку старт-ПАУЗА, таймер остановит отсчет, двойное нажатие кнопки СТАРТ-пауза приводит к возобновлению остановленного отсчета.

Чтобы выключить нагрузку после включения, нужно нажать СБРОС, данные таймера установятся 00.00.01 – нагрузка выключиться. Или выставить новый период отсчета и двойное нажатие кнопки СТАРТ-пауза.

Отображение на ЖКИ символов < ! > означает, что нагрузка отключена (PD3) и при однократном нажатии кнопки СТАРТ начнется обратный отсчет установленного времени.

Кварц внешний 8 MHz, для точности счета.

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

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

Внимание! Что касается FUSE-битов. Это основной источник ошибок, приводящих к залочиванию контроллера.

– CKSEL3…0 должны быть НЕзапрограммированы.

В PonyProg и CodeVisionAVR стоят так:

ЖК должен быть на базе контроллера HD4480

16х1, для него в архиве имеется прошивка V-1

или 8х2, в архиве прошивка V-2.

Работу схемы можно протестировать в proteus’е.

Если при симуляции проекта в proteus’е некорректно отображаются символы кириллицы на ЖКИ, то для правильного отображения кириллицы на ЖК индикаторе распаковать библиотеку LCDrus .zip (приложена в архиве проекта) в папку models proteus’а.

В предыдущей статье — я написал, что это последняя разработка такого устройства с использование семисегментных светодиодных индикаторов, но оказалось, что я поспешил. Дело в том, что в этой конструкции используется лишь 40% памяти микроконтроллера, да и еще остался один незадействованный вывод порта микроконтроллера (кроме вывода RESET). Поэтому было принято решение исправить эту несправедливость по отношению к МК и добавить еще один канал управления нагрузками. После проведенной работы память МК используется на 99% и задействованы все выводы МК. Полное название измененной конструкции:
«Двухканальный термометр, двухканальный термостат (терморегулятор) с возможностью работы по времени, одноканальный таймер реального времени на микроконтроллере ATmega8 и датчиках температуры DS18B20»

Описание и характеристики двухканального термометра, термостата (терморегулятора), одноканального таймера реального времени
на ATmega8 и DS18B20

Так-как данная конструкция «вышла» из предыдущей — , и подробно описана (все характеристики термометров и термостатов, режимы работы, реакция на ошибки — остались без изменений), я остановлюсь только на нововведении — таймере реального времени.

Таймер реального времени

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

Дискретность отсчета временных интервалов 10 минут принята по двум причинам:
— удобство вывода информации на трехразрядном индикаторе, к примеру 22 часа 40 минут — 22,4
— управление нагрузкой с точностью до 10 минут вполне достаточна для большинства задач (реально точность составляет 5 минут — если вам надо включить нагрузку в 7 часов 35 минут, то можно установить или 7,4 или 7,3)

Введение таймера немного изменило алгоритм работы с устройством (об алгоритме работы я расскажу ниже). Теперь нажатием кнопки «Выбор» можно попасть в два меню:
— меню установки пределов температур работы термостатов и временных интервалов работы термостатов, временных интервалов управления нагрузкой по таймеру
— меню коррекции хода часов и установки текущего времени.
Так как МК работает от внутреннего RC-генератора (8 МГц), который не отличается стабильностью и зависит как от температуры МК, так и питающего напряжения, функция коррекции хода часов позволяет подстроить точность хода для конкретных условий. А функция установки текущего времени позволяет установить текущее реальное время при первоначальной настройке или уточнять его при сильном отличии от реального времени.
Показания таймера при работе устройства не высвечиваются, узнать «который час» можно только при входе в режим установки текущего времени.

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

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

Схема трехканального термометра, термостата, таймера на ATmega8

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


Так-как в схеме применены «выводные» детали, то для удобства размещения конструкции в подходящем корпусе схема разделена на две части:
— Блок индикации — индикаторы и кнопки
— Блок управления — все остальное
Надо было бы вывести в блок индикации и светодиоды, которые сигнализируют о включенных каналах, но это можно сделать и самостоятельно при разводке платы (добавить три пары контактных площадок для светодиодов и соединить их с блоком управления проводами).

Конструкция устройства

Основа устройства — микроконтроллер ATmega8 с тактовой частотой 8 МГц от встроенного генератора с внутренней RC-цепочкой.
Для подстройки частоты внутреннего генератора необходимо при программирование МК записать в EEPROM-память по нулевому адресу значение калибровочной ячейки для тактовой частоты 8 МГц. В выложенном ниже НЕХ-файле EEPROM-памяти по умолчанию записано число $В1 (В1) — среднее значение калибровочных ячеек 5 проверенных микроконтроллеров.
Кроме того, для правильной работы таймера реального времени, а работает он по прерываниям от таймера/счетчика Т1 при равенстве счетного регистра и регистра сравнения OCR1A, при программировании EEPROM-памяти следом за значением калибровочной ячейки записывается число 33050 (1А81) которое программным путем заносится в регистр сравнения OCR1A. При коррекции хода таймера меняется и значение этого числа.

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

Датчики DS18B20 подсоединяются к устройству через 3-х контактные штыревые линейки DS1 и DS2, нумерация выводов которых соответствует нумерации выводов датчиков.

Управление разрядами осуществляется маломощными биполярными транзисторами NPN-типа.

Вход в меню, установка значений , запуск режимов однократного нагрева (охлаждения) осуществляется тремя тактовыми кнопками типа DTS:
— S1 — «Выбор»
— S2 — » + »
— S3 — » — »


— для каналов термостатирования — через оптосимисторы МОС3063 и симисторы ВТ139-800Е по стандартной схеме включения, что позволяет управлять нагрузками мощностью до 3,5 кВт (если мощность нагрузки более 300-400 Вт — симисторы необходимо ставить на радиаторы)
— для канала от таймера — через миниатюрное механическое реле с напряжением питания катушки 5 Вольт, что позволяет, в зависимости от примененного реле, управлять нагрузкой до 2 — 2,5 кВт

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

Питание устройства осуществляется от любого источника постоянного тока напряжением 7-25 Вольт. Схему можно запитать и от ненужного зарядного устройства от сотового телефона с выходным напряжением 5 +-0,5 Вольт. В этом случае можно из схемы исключить стабилизатор 7805 и конденсаторы С4, С5. Средний ток потребления устройством 40 миллиампер.

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

Детали, примененные в конструкции:

Управление трехканальным термометром, термостатом, терморегулятором, таймером

1. Вход в меню

В устройстве имеется два меню.
При «коротком» нажатии на кнопку «Выбор» на индикаторах высвечивается надпись «ON—-OFF», входим в меню:
— установки пределов температур работы термостатов и временных интервалов работы термостатов, временных интервалов управления нагрузкой по таймеру
При «длинном» нажатии кнопки «Выбор» надпись «ON—-OFF» сменяется надписью «Cor—-USt», при этом надо отпустить кнопку, входим в меню:
— коррекции хода часов и установки текущего времени

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

2. Меню «Коррекции хода и установки текущего времени» (длинное нажатие кнопки «Выбор»)

После входа в меню сразу попадаем в режим коррекции хода часов:
«Cor—-00»
Повторным нажатием кнопки «Выбор» переходим в режим установки текущего времени:
«USt—-00.0»
В режиме установки текущего времени смотрим на свои самые точные часы и кнопками «+» и «-» устанавливаем ближайшее время с точностью до 10 минут.
К примеру — текущее время 20 часов 37 минут, устанавливаем на индикаторе «20,4» (20 часов 40 минут) и ровно в 20.40, нажатием кнопки «Выбор» выходим из меню. Все, реальное время выставлено, часы запущены.
Корректировать ход часов можно от +50 единиц до -50 единиц. Первоначальное значение «00» («00» появляется всегда при входе в этот режим)
При изменении установки на единицу ход часов увеличивается (+1) или уменьшается (-1) примерно на 4 секунды за 24 часа.
Точность хода часов можно проверить на канале управления нагрузкой по таймеру без подключенной нагрузки по зажиганию светодиода.
К примеру, в 21.00 мы установили текущее время, задали включение нагрузки — 8.50, выключение — 9.00. Утром замерили время выключения нагрузки. Допустим нагрузка отключилась в 8 часов 59 минут 20 секунд. Значит таймер отстал на 40 секунд за 12 часов. За 24 часа отставание составит уже 80 секунд. 80 секунд делим на 4 = 20. В режиме коррекции устанавливаем показание 20, затем переходим в режим установки текущего времени, устанавливаем ближайшее текущее время, например 9.1, и в 9 часов 10 минут, нажатием кнопки «Выбор» выходим в рабочий режим.

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

3. Меню установки температурных и временных интервалов для термостатов

Напомню режимы работы каналов термостатирования (терморегулирования):
— режим термостатирования — поддержание определенной температуры
— режим терморегулирования — поддержание температуры в определенных границах
— режим однократного нагрева (охлаждения)
Все эти режимы подробно описаны в статье , там же приведены подробные инструкции и возможности каждого режима.
С введением в конструкцию таймера реального времени появилась возможность для каждого канала задавать в течении суток один временной интервал работы канала. Для этого в меню введены дополнительные строчки времени включения и выключения каналов.
К примеру, нам надо чтобы 1-й канала термостатирования работал только в ночное время с 23.00 до 6.30. Для этого в 1-м меню (короткое нажатие кнопки «Выбор»):
— после установки верхнего и нижнего температурного предела появятся еще две строчки: «t.On——00,0» и «t.OF——00,0» (тоже самое будет и для второго канала)
— кнопками «+» и «-» устанавливаем: «t.On——23,0» и «t.OF——06,3»
Теперь, в 23.00 1-й канал начнет работать в заданном режиме, а 6.30 канал будет отключен, и так каждые сутки.
По режиму однократного нагрева/охлаждения. Если временной интервал не выбран (время включения/выключения установлены в «0»), то запуск этих режимов осуществляется в ручном режиме, нажатием соответствующей кнопки. Этот режим может работать и по времени.
Допустим нам надо на 2-м канале термостатирования с утра, к 7.00, нагреть воду в баке до 45 градусов, учитывая, что вода в баке до этой температуры нагревается за 25 минут:
— устанавливаем «2.On——00» и «2.OF——45»
— устанавливаем «t.On——06,3» а «t.OF» оставляем по умолчанию «t.OF——00,0»
Теперь, 2-канал автоматически запуститься в 6.30 минут, и по достижению температуры воды 45 градусов отключится.
При использовании режима однократного нагрева/охлаждения совместно с таймером сохраняется возможность и ручного запуска режима, но при этом следует учитывать, что в промежуток времени «t.OF—-t.On» (для предыдущего примера — с 24.00 до 6.30) ручной режим невозможен. Поэтому, для того, чтобы в любой момент времени запустить режим вручную, необходимо «t.OF» устанавливать на 10 минут меньше чем «t.On».

4. Меню установки временных интервалов для таймера

Таймер реального времени позволяет задать два временных интервала в течении суток для управления нагрузкой по таймеру.
Для этого в меню введены дополнительно четыре строчки:
— t1.1 — время включения для первого временного интервала
— t1.0 — время выключения для первого временного интервала
— t2.1 — время включения для второго временного интервала
— t2.0 — время выключения для второго временного интервала
Временные интервалы не должны пересекаться.
Допустим, нам необходимо включать освещение во дворе два раза в сутки: с 21.00 до 0.30 и с 5.30 до 7.00
Устанавливаем:
— t1.1 — 21,0
— t1.0 — 00,3
— t2.1 — 05,3
— t2.0 — 07,0
Теперь нагрузка по таймеру будет включена в 21.00 и в 5.30, и выключена в 0.30 и в 7.00

Второй вариант печатной платы:

Вариант установки FUSE битов:

(22,2 KiB, 2 016 hits)

На нашем сайте, посвящённом различным электронным самоделкам, уже неоднократно публиковались схемы . Конечно они уступают современным промышленным аналогам, где имеется дисплей, возможность программирования и другие сервисные функции. И вот пришло время разместить такую схему, которая на равных будет конкурировать с лучшими фирменными образцами. Цифровой таймер используются для управления работой электрических устройств, по запрограммированному графику. Этот программируемый таймер делается на основе микроконтроллера PIC16F628A , который может быть запрограммирован, чтобы составить расписание включения и выключения электрического прибора, подключенного к нему, который управляется через реле. Таймер позволяет вручную задать время включения и выключения. Максимальный интервал времени, который можно настроить для включения и выключения, составляет 99 часов 59 минут. Проект разработан под использование 16х2 ЖК-дисплея и 4 кнопки.

Здесь 5 вольтовое реле управляется транзистором PN2222, который, в свою очередь, управляется RB3 PIC16F628A. Цифровые входы из 4 кнопок читаются с помощью порта ввода/вывода RA2, RA3, RA4, и RB0. Стандартный 16?2 символьный ЖК-дисплей используется для отображения состояния устройства, программы, меню и времени. ЖК работает в 4-битном режиме, поэтому только 6 выводов I/O PIC16F628A необходимы для работы. Пьезоэлектрический зуммер дает звуковой сигнал, когда таймер запускается и останавливается. Он также подает звуковой сигнал, когда устройство включено или выключено. Напряжение питания схемы поступает от стабилизатора LM7805. На вход её подается 9 В от сетевого адаптера. Подсветка LED повышает читаемость дисплея LCD в условиях низкой освещенности состоянии.

Работа таймера и функции кнопок

Таймер получает команды от 4-х кнопок. Их функции следующие:

Время : позволяет задать время включения и выключения. Когда таймер изначально включен, устройство находится в выключенном состоянии, и время 0. Нажав эту кнопку, можно переключаться между on и off на дисплее.

Выбор : позволяет выбрать между on и off параметрами, а также часовой и минутной цифрой. Выбранная цифра увеличивается нажатием кнопки ON/OFF.

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

Пуск/стоп : чтобы запустить или остановить таймер. Если он уже включен, вы можете остановить его в любое время при нажатии на эту кнопку.

Урок 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 );

Теперь давайте поиграемся с самими регистрами сравнения 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 )

{

}

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

Нам нужна будет переменная. Объявим её глобально, в начале файла

#include

//———————————————

unsigned char i ;

//———————————————

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

int main ( void )

unsigned char i ;

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

while (1)

{

// for(i=0;i<10;i++)

// {

// while (butstate==0)

// {

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

// {

// if(butcount < 5)

// {

// butcount++;

// }

// else

// {

// i=0;

// butstate=1;

// }

// }

// else

// {

// if(butcount > 0)

// {

// butcount—;

// }

// else

// {

// butstate=1;

// }

// }

// }

// segchar(i);

// _delay_ms(500);

// butstate=0;

// }

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

ISR ( TIMER1_COMPA_vect )

if ( i >9) i =0;

segchar ( i );

i ++;

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

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

DDRB = 0x00;

PORTD = 0b11111111 ;

PORTB = 0b00000001;

i =0;

sei ();

while (1)

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

#include

#include

#include

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

int main ( void )

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

timer_ini ();

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

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

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

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

Смотреть ВИДЕОУРОК

Post Views: 17 258