Таймер своими руками | Программирование микроконтроллеров AVR
Рассмотрим, как сделать таймер своими руками на микроконтроллере ATmega8, хотя код довольно просто адаптировать и для МК AVR других серий. Электронный таймер нужное устройство во всех областях, где требуется выполнение определенных действий через конкретный промежуток времени.
Чтобы не повторяться схему подключения четырехразрядной динамической индикации и основу кода мы возьмем из предыдущей статьи, в которой подробно описаны все элементы кода и принцип работы динамической индикации.
Управление таймера состоит всего из четырех кнопок:
— увеличение значения числа;
— уменьшение значения числа;
— старт таймера;
— сброс таймера.
В качестве индикатора срабатывания таймера применяется генератор звуковой частоты с динамиком. Генератор будет запускаться с помощью транзисторного ключа Q5, который в свою очередь открывается положительным потенциалом, поступающим из порта PC2 микроконтроллера.
Упрощенно таймер работает следующим образом. Кнопками «+» и «-» устанавливается требуемое количество секунд; кнопкой «старт» запускается таймер. Когда таймер отсчитает до нуля, на выводе PC2 микроконтроллера ATmega8 появится высокий потенциал, который откроет транзисторный ключ Q5. Далее транзисторный ключ запустит генератор и раздастся звук в динамике. Сброс таймера осуществляется при нажатии кнопки «сброс». Генератор звуковой частоты собран на двух транзисторах Q6 и Q7 разный полупроводниковых структур. С принципом работы и описанием схемы подобных генераторов можно ознакомиться, перейдя по ссылке.
Алгоритм работы таймера на микроконтроллере
Наш таймер будет отсчитывать обратное время ровно по одной секунде, хотя можно задать и любое другое время, например минуты, часы, сотые секунды и т.п.
Для формирования интервала времени в одну секунду мы воспользуемся первым таймер-счетчиком микроконтроллера ATmega8. Все его настройки мы определим в функцию start. Сначала разделим рабочую частоту микроконтроллера 1000000 Гц на 64 и получим новую частоту 15625 Гц. За это отвечают бит CS10, CS11 и CS12 регистра TCCR1B. Далее разрешаем прерывание по совпадению и в регистр сравнения (старший и младший) записываем двоичное число равное десятичному 15625. Затем обнуляем счетный регистр TCNT1 и устанавливаем в единицу бит WGM12 регистра TCCR1B, что вызывает сброс счетного регистра при совпадении текущего его значения с числом, записанным в регистры сравнения.
void start (void)
{
TCCR1B &= ~(1<<CS12);
TCCR1B |= (1<<CS11) | (1<<CS10); // деление частоты на 64 = 15625
TIMSK |= (1<<OCIE1A); // разрешаем прерывания при совпадении
OCR1AH = 0b00111101;
OCR1AL = 0b000001001; // регистр сравнения 15625
TCNT1 = 0;
TCCR1B |= (1<<WGM12); // сброс при совпадении
}
Когда таймер отсчитает ровно одну секунду – вызовется прерывание. В теле функции прерывания мы будем снижать значение переменной на единицу. При достижении нуля на второй выход порта C микроконтроллера появится высокий потенциал, который откроет транзисторный ключ и запустит генератор, в результате чего мы услышим звук в динамике.
ISR (TIMER1_COMPA_vect)
{
z—;
if (z<0) z=0;
if (z == 0)
{
PORTC |= (1<<2);
}
else
{
PORTC &= ~(1<<2);
}
}
здравствуйте меня зовут Сергей я хотел попросить чтоб Вы сняли видео о приемниках передатчиках для ардуино с выводом на LCD экран.
спасибо автору,
я этот таймер применил для установки времени для пролива автомобильных форсунок,
только изменив в первом таймере условие, по истечению времени выключается рыле.. спасибо Автору за работу!!,побольше бы таких уроков.
Предлагаю упростит систему, использовав вместо генератора на транзисторах сам микроконтроллер. Можно генерировать звуковую частоту тем же таймером, перенастроив его когда придет время примерно так:
TCCR0A |= _BV(COM0B1); // Clear OC0B on Compare Match when up-counting. Set OC0B on Compare Match when down-counting.
TCCR0A |= _BV(WGM00); // PWM, Phase Correct, 8-bit
TCCR0B |= _BV(CS00); // Start timer
OCR0B = 48; //
Прекрасные уроки. Сделайте видео программы часов. Разные варианти. Буду очень признательный.
Прекрасный урок. Сделайте урок по часам. С разными вариантами. Спасибо!!!
Отличные уроки! Спасибо!!! Сделайте программу часы .(разные варианты)
Отличные уроки!
Privet ya Alişer iz Türkmenistana sposibo tebya çotki i yasno obisnaeysh
Дмитрий,спасибо за Ваши уроки, они действительно интересны и полезны!
Хотелось бы, чтоб Вы сделали видео с разъяснениями по работе и применению жидкокристалических символьных индикаторов на основе контроллеров HD44780, например, таких как LCD 1602.
> OCR1AH = 0b00111101;
> OCR1AL = 0b000001001; // регистр сравнения 15625
GCC давным-давно спокойно «переваривает» человеческую запись вида
OCR1A = 15625;
Зачем это извращение?
НЕотображается на индикаторе
https://diodov.net/tajmer-svoimi-rukami-programmirovanie-mikrokontrollerov-avr/#comment-469
Подключил индикаторы вручную индикатор показывает нули или 8 в proteuse