Таймер своими руками | Программирование микроконтроллеров 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);

       }

}

Скачать полный текст кода (программу)

3 комментария

Комментировать

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