В этом уроке мы поговорим о таймерах.
Данная тема непосредственно связана с темой тактирования микроконтроллера. Поэтому рекомендую перед прочтением данного урока ознакомиться с предыдущим.
Итак, зачем нам таймер?
При построении проектов на микроконтроллерах очень часто возникает необходимость измерение точных временных промежутков. Например, желание мигать светодиодом с определенной частотой, или опрашивать состояние кнопки с необходимыми временными промежутками.
Решить поставленные задачи помогают именно таймеры. Но таймеры микроконтроллеров AVR не знают что такое секунда, минута, час. Однако они прекрасно знают, что такое такт! Работают они именно благодаря наличию тактирования контроллера. То есть, таймер считает количество тактов контроллера, отмеряя тем самым промежутки времени. Допустим, контроллер работает при тактовой частоте 8МГц, то есть когда таймер досчитает до 8 000 000, пройдет одна секунда, досчитав до 16 000 000, пройдет 2 секунды и так далее.
Однако, тут возникает первое препятствие. Регистры то у нас 8 битные, то есть досчитать мы можем максимум до 255, а взяв 16 битный таймер, мы, досчитаем максимум до 65535. То есть за одну секунду мы должны обнулить таймер огромное количество раз! Конечно, можно заняться этим, если больше заняться нечем. Но ведь просто измерять время, используя мощный микроконтроллер совсем не интересно, хочется сделать нечто большее. Тут нам на помощь приходит предделитель. В общем виде это промежуточное звено между таймером и тактовой частотой контроллера. Предделитель облегчает нашу задачу позволяя поделить тактовую частоту на определенное число, перед подачей её на таймер. То есть установив предделитель на 8, за 1 секунду наш таймер досчитает до 1 000 000, вместо 8 000 000 (Разумеется, при частоте тактирования контроллера 8МГц). Уже интереснее, не так ли? А поделить мы можем и не только на 8, но и на 64 и даже на 1024.
Теперь настало время собрать схему, настроить наш таймер, предделитель, и сделать уже хоть что-то полезное!
А делать мы сегодня будем “бегущие огни” из светодиодов. То есть поочередно будем зажигать 3 светодиода, с периодом 0.75 секунды (То есть время работы одного светодиода 0.25 секунды). Соберем следующую схему:
Номиналы резисторов R 1-R 3 рассчитайте самостоятельно.
Далее, рассмотрим регистры отвечающие за работу таймеров. Всего AtMega 8 имеет в своем составе 3 таймера.Два 8 битных(Timer 0,Timer 2) и один 16 битный(Timer 1).Рассматривать будем на примере 16 битного таймера 1.
Пара регистров 8 битных регистров TCNT 1H и TCNT 1L , вместе образуют 16 битный регистр TCNT 1. Данный регистр открыт как для записи, так и для чтения. При работе таймера 1, значение данного регистра при каждом счете изменяется на единицу. То есть в регистре TCNT 1 записано число тактов, которые сосчитал таймер. Так же мы можем записать сюда любое число в диапазоне от 0 до 2 в 16 степени. В таком случае отсчет тактов будет вестись не с 0, а с записанного нами числа.
Регистр TIMSK отвечает за прерывания, генерируемые при работе таймеров микроконтроллера. Прерывание – обработчик специального сигнала, поступающего при изменении чего либо . Любое прерывания микроконтроллера может быть разрешено или запрещено. При возникновении разрешенного прерывания, ход основной программы прерывается, и происходит обработка данного сигнала. При возникновении запрещенного прерывания, ход программы не прерывается, а прерывание игнорируется. За разрешение прерывания переполнения счетного регистра TCNT 1 таймера 1 отвечает бит TOIE 1(Timer 1 Overflow Interrupt Enable ).При записи 1 в данный бит прерывание разрешено, а при записи 0 – запрещено. Данное прерывание генерируется таймером 1 при достижении максимального значения регистра TCNT 1. Подробнее о прерываниях поговорим в следующем уроке.
Регистр TCCR 1B отвечает за конфигурацию таймера 1. В данном случае битами CS 10-CS 12 мы задаем значение предделителя согласно следующей таблицы.
Остальные биты пока нас не интересуют.
Так же существует регистр TCCR 1A , который позволяет настроить другие режимы работы таймера, например ШИМ, но о них в отдельной статье.
А теперь код на C :
#define F_CPU 16000000UL
#include #define F_CPU 16000000UL
#include #include uint8_t
num
=
;
ISR
(TIMER1_OVF_vect
)
PORTD
=
(1
<<
num
)
;
num
++
;
if
(num
>
2
)
num
=
;
TCNT1
=
61630
;
//Начальное значение таймера
int
main
(void
)
DDRD
|=
(1
<<
PD0
)
|
(1
<<
PD1
)
|
(1
<<
PD2
)
;
TCCR1B
|=
(1
<<
CS12
)
|
(1
<<
CS10
)
;
//Предделитель = 1024
TIMSK
|=
(1
<<
TOIE1
)
;
//Разрешить прерывание по переполнению таймера 1
TCNT1
=
61630
;
//Начальное значение таймера
sei
()
;
//Разрешить прерывания
while
(1
)
//Основной цикл программы, он пуст, так как вся работа в прерывании
Код на ASM
: Assembly (x86)
Include "m8def.inc"
rjmp start
.org OVF1addr
rjmp TIM1_OVF
start:
ldi R16,LOW(RamEnd)
out SPL,R16
ldi R16,HIGH(RamEnd)
out SPH,R16
ldi R16,1
ldi R17,0b00000111
out DDRD,R17
ldi R17,0b00000101
out TCCR1B,R17
ldi R17,0b11110000
out TCNT1H,R17
ldi R17,0b10111110
out TCNT1l,R17
ldi R17,0b00000100
out TIMSK,R17
sei
main_loop:
nop
rjmp main_loop
TIM1_OVF:
out PORTD,R16
lsl R16
cpi R16,8
brlo label_1
ldi R16,1
label_1:
ldi R17,0b10111110
out TCNT1L,R17
ldi R17,0b11110000
out TCNT1H,R17
reti Include
"m8def.inc"
Rjmp
start
Org
OVF
1addr
Rjmp
TIM
1_
OVF
start
:
Ldi
R
16,
LOW
(RamEnd
)
Out
SPL
,
R
16 Ldi
R
16,
HIGH
(RamEnd
)
Out
SPH
,
R
16 Ldi
R
16,
1
Ldi
R
17,
0b00000111
Out
DDRD
,
R
17 Ldi
R
17,
0b00000101
Out
TCCR
1B
,
R
17 Ldi
R
17,
0b11110000
Out
TCNT
1H
,
R
17 Ldi
R
17,
0b10111110
Таймер разработан для включения нагрузки в одно время и выключения в другое, т.е. работа нагрузки в определенных рамках времени. В конструкции применены часы реального времени PCF8583 в связке с резервной часовой батареей для работы часов при отсутствии питания. В качестве мозга устройства применен микроконтроллер Atmega8 с тактированием 16MHz. Печатные платы.
Немного 3D-моделей.
Этот таймер предназначен для установки выдержек от 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. По поводу индикаторов сказано выше. Это могут быть
любые семисегментные индикаторы с общим анодом(катодом). Этот таймер предназначен для установки выдержек от 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. По поводу индикаторов сказано выше. Это могут быть любые семисегментные индикаторы с общим анодом(катодом). Данное устройство будет полезно любому человеку, которому приходится постоянно готовить, и надежно защитит вашу кухню от чрезмерного количества дыма. Этот прибор, как следует из названия - кухонный таймер. Он предназначен для отсчитывания интервалов при приготовлении различных блюд. Таймер имеет несколько клавиш, при помощи которых можно легко установить время от 1 минуты до 99 часов. Обратный отсчет начинается автоматически, через 3 секунды после установки времени. Благодаря громкой пищалке вы точно услышите когда блюдо готово. Устройство собрано на основе микроконтроллера ATMega8. Описание конструкции
Сердцем устройства является микроконтроллер U1 (ATMega8) с кварцевым резонатором X1 (16 МГц) и обвязкой из двух конденсаторов C1 (22 пФ) и C2 (22 пФ). Стабилизатор U2 (7805) с обвязкой из конденсаторов C3 (100 мкФ) и C4 (47 мкФ) стабилизирует напряжение питания 5В, необходимое для корректной работы микроконтроллера и связанных компонентов. На разъем Zas подается напряжение 7-12В. Если у Вас имеется блок питания с напряжением 5-6В, можно исключить из схемы стабилизатор напряжения. Зуммер B1 и аноды дисплея W1 управляются транзисторами T1 - T5 (BC556), с обвязкой из резисторов R1 - R8 (3.3 кОм), R17 (3.3 кОм) и R18 (3.3 кОм). Резисторы R9 - R16 (330 Ом) ограничивают ток через сегменты дисплея. Разъем Prog и один вывод R используются для подключения программатора. Клавиатура таймера подключена к разъему Sw. Изготовление
Рисунок печатной платы для устройства есть в архиве в конце статьи. Установка деталей начинается с пайки двух перемычек. Затем устанавливаются все резисторы и прочие элементы в порядке от меньшего к большему. Кварц X1 должен быть "низкий" - он устанавливается под дисплей - в противном случае он просто не поместится туда. Зуммер B1 можно припаять на плату, как это показано на фотографиях, но позже выяснилось, что после закрытия корпуса звук слишком тихий (несмотря на отверстия, просверленные в корпусе). Лучше приклеить зуммер на одну из сторон корпуса (так, как это показано на последнем фото), и соединить проводами с платой. Клавиатура состоит из 5 кнопок без фиксации 12х12мм непосредственно на лицевой части корпуса, так что их толкатели находятся чуть выше поверхности корпуса. Для этого устройства в качестве блока питания хорошо использовать зарядное устройство для телефона, из-за его небольшого веса и размеров. ATmega8A-AU
LM7805CT
BC556
Питание устройство планировалось от зарядки телефона – поэтому на схеме нет стабилизатора 5В – есть разъем питания 5В и питание 220В для БП.
Нагрузка коммутируется реле – с указанным на схеме типом до 10А.
На схеме присутствует 3 светодиода:
OPTIONS
– загорается при попадании в настройки часов.
TIME
– мигает когда таймер работает — не горит когда таймер деактивирован.
OUT
– показывает состояние реле – включено или отключено.
Кнопки:
SW1
– кнопка H
.
SW2
– кнопка M
.
Настройки:
Настройка часов.
Чтобы настроить часы нужно зажать кнопку SW1
до загорания светодиода OPTIONS
.
Точка загорается и не мигает – кнопкой SW1
устанавливаются часы, а кнопкой SW2
минуты.
Чтобы выйти из настроек нужно также подержать кнопку SW1
пока не погаснет светодиод OPTIONS
.
Настройка таймера.
Для настройки таймера нужно в режиме отображения(дежурный режим – основной) установить кнопками SW1
– время включения нагрузки, SW2
– время выключения нагрузки. После набора таймера он сам перейдет в режим отображения времени если кнопки не будут нажаты в течении 2-3 секунд.
Деактивация таймера.
Для деактивации таймера нужно зажать и подержать кнопку SW2
– устройство включит нагрузку и таймер не будет её отключать.
Схема.
На схеме применен нестандартный ISP разъём:
1 – VCC
2 – MOSI
3 – MISO
4 – SCK
5 – RESET
6 – GDN.
На печатной плате применен индикатор с общим анодом E40361 – но можно и другой со схожей распиновкой и размерами.
Архив для статьи "Таймер на Atmega8 и светодиодных индикаторах"
Файлы прошивок
19.02.2011 5.58 KB 2317
Архив для статьи "Таймер на Atmega8 и светодиодных индикаторах"
Описание:
Файлы прошивок
Размер файла:
5.58 KB Количество загрузок:
4 319
Список радиоэлементов
Обозначение
Тип
Номинал
Количество
Примечание
Магазин
Мой блокнот
U1
МК AVR 8-бит
1
В блокнот
U2
Линейный регулятор
1
В блокнот
T1-T5
Биполярный транзистор
5
В блокнот
C1, C2
Конденсатор
22 пФ
1
В блокнот
C3
100 мкФ
1
В блокнот
С4
Конденсатор электролитический
47 мкФ
1
В блокнот
R1-R8, R17, R18
Резистор
3.3 кОм
10
В блокнот
R9-R16
Резистор
330 Ом
8
В блокнот
W1
7-сегментный индикатор
AF-05643FG-B
1
Или с аналогичной распиновкой
В блокнот
B1
Пьезодинамик с генератором
1