- Що таке ТАЙМЕР у вбудованій електроніці?
- Реєстри таймера Arduino
- Переривання таймера Arduino
- Потрібні компоненти
- Кругова діаграма
- Програмування таймерів Arduino UNO
Платформа розвитку Arduino була спочатку розроблена в 2005 році як простий у використанні програмований пристрій для арт-дизайнерських проектів. Його наміром було допомогти неінженерам працювати з базовою електронікою та мікроконтролерами без особливих знань програмування. Але тоді, через його просту у використанні природу, її незабаром адаптували новачки та любителі електроніки по всьому світу, і сьогодні вона навіть є кращою для розробки прототипів та розробок POC.
Хоча починати з Arduino нормально, важливо повільно переходити до основних мікроконтролерів, таких як AVR, ARM, PIC, STM тощо, і програмувати його за допомогою власних додатків. Це тому, що мову програмування Arduino дуже легко зрозуміти, оскільки більша частина роботи виконується за допомогою вбудованих функцій, таких як digitalWrite (), AnalogWrite (), Delay () тощо, тоді як машинна мова низького рівня прихована за ними. Програми Arduino не схожі на інші кодування Embedded C, де ми маємо справу з регістровими бітами і робимо їх високими або низькими на основі логіки нашої програми.
Таймери Arduino без затримки:
Отже, щоб зрозуміти, що відбувається всередині заздалегідь побудованих функцій, нам потрібно відкопатися за цими термінами. Наприклад, коли використовується функція затримки (), вона фактично встановлює біти реєстру таймера та лічильника мікроконтролера ATmega.
У цьому підручнику з таймера Arduino ми збираємося уникати використання цієї функції delay (), а натомість матиме справу з самими Регістрами. Хороша річ полягає в тому, що для цього ви можете використовувати ту ж IDE Arduino. Ми встановимо наші біти регістру таймера і використаємо переривання переповнення таймера для перемикання світлодіода щоразу, коли відбувається переривання. Значення попереднього завантажувача біта таймера також можна регулювати за допомогою кнопок для управління тривалістю, в якій відбувається переривання.
Що таке ТАЙМЕР у вбудованій електроніці?
Таймер - це своєрідне переривання. Це як простий годинник, який може вимірювати інтервал часу події. Кожен мікроконтролер має годинник (генератор), скажімо, в Arduino Uno він становить 16 МГц. Це відповідає за швидкість. Чим вище тактова частота, тим вище буде швидкість обробки. Таймер використовує лічильник, який відлічує з певною швидкістю залежно від тактової частоти. У Arduino Uno потрібно 1/16000000 секунд або 62нано секунд, щоб зробити один підрахунок. Це означає, що Arduino переходить від однієї інструкції до іншої за кожні 62 наносекунди.
Таймери в Arduino UNO:
В Arduino UNO є три таймери, що використовуються для різних функцій.
Таймер0:
Це 8-бітний таймер, який використовується в таких функціях, як затримка (), міліс ().
Таймер1:
Це 16-розрядний таймер, який використовується в сервотеці.
Таймер2:
Це 8-бітний таймер, який використовується в функції tone ().
Реєстри таймера Arduino
Для зміни конфігурації таймерів використовуються регістри таймерів.
1. Регістри таймера / лічильника (TCCRnA / B):
Цей регістр містить основні біти управління таймером і використовується для управління прескалерами таймера. Це також дозволяє керувати режимом таймера за допомогою бітів WGM.
Формат кадру:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Прескалер:
Біти CS12, CS11, CS10 у TCCR1B встановлюють значення попереднього масштабування. Прескалер використовується для встановлення тактової частоти таймера. Arduino Uno має прескалери 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | ВИКОРИСТАННЯ |
0 | 0 | 0 | Немає годинника STOP |
0 | 0 | 1 | CLCK i / o / 1 Без попереднього масштабування |
0 | 1 | 0 | CLK i / o / 8 (від прескалера) |
0 | 1 | 1 | CLK i / o / 64 (від прескалера) |
1 | 0 | 0 | CLK i / o / 256 (з попереднього сканера) |
1 | 0 | 1 | CLK i / o / 1024 (від прескалера) |
1 | 1 | 0 | Зовнішнє джерело годинника на T1 Pin. Годинник на падаючому краї |
1 | 1 | 1 | Зовнішнє джерело годинника на штифті T1. Годинник на висхідному краю. |
2. Реєстр таймера / лічильника (TCNTn)
Цей Регістр використовується для контролю значення лічильника та встановлення значення попереднього завантажувача.
Формула значення попереднього завантажувача для необхідного часу в секундах:
TCNTn = 65535 - (16x10 10 xTime in sec / Prescaler Value)
Щоб розрахувати значення попереднього завантажувача для таймера1 для часу 2 сек:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Переривання таймера Arduino
Раніше ми дізналися про переривання Arduino і переконались, що переривання таймером - це своєрідні програмні переривання. У Arduino є різні переривання таймера, які пояснюються нижче.Переривання переповнення таймера:
Щоразу, коли таймер досягає максимального значення, скажімо, наприклад (16 біт-65535), виникає переривання переповнення таймера . Отже, підпрограма обслуговування переривання ISR викликається, коли біт переривання переповнення таймера увімкнено в TOIEx, присутньому в регістрі маски переривання таймера TIMSKx.
Формат ISR:
ISR (TIMERx_OVF_vect) { }
Регістр порівняння результатів (OCRnA / B):
Тут, коли відбувається вихідне порівняння переривання відповідності, тоді викликається служба переривання ISR (TIMERx_COMPy_vect), а також біт прапора OCFxy буде встановлений у реєстрі TIFRx. Цей ISR увімкнено, встановивши біт увімкнення в OCIExy, присутній у регістрі TIMSKx. Де TIMSKx - це Реєстр масок переривання таймера.
Захоплення вхідного таймера:
Далі, коли виникає переривання вхідного захоплення таймера, тоді викликається служба переривання ISR (TIMERx_CAPT_vect), а також біт прапора ICFx буде встановлений у TIFRx (Реєстр прапорців переривання таймера). Цей ISR увімкнено, встановивши біт увімкнення в ICIEx, присутній у регістрі TIMSKx.
Потрібні компоненти
- Arduino UNO
- Кнопки (2)
- Світлодіод (будь-який колір)
- 10k резистор (2), 2.2k (1)
- РК-дисплей 16x2
Кругова діаграма
Схема з'єднання між Arduino UNO та РК-дисплеєм 16x2:
РК-дисплей 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5В |
V0 |
До центрального штифта потенціометра для контролю контрастності РК-дисплея |
RS |
8 |
RW |
GND |
Е |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5В |
К |
GND |
Дві кнопки з висувними резисторами 10K з'єднані з виводами Arduino 2 і 4, а світлодіод підключений до PIN 7 Arduino через резистор 2,2K.
Налаштування буде виглядати як на зображенні нижче.
Програмування таймерів Arduino UNO
У цьому уроці ми будемо використовувати ТАЙМЕР переривання по переповнення і використовувати його, щоб блимати світлодіод включення і виключення для певної тривалості, доводячи значення завантажника (TCNT1) з допомогою кнопок. Повний код таймера Arduino наведено в кінці. Тут ми пояснюємо код за рядком:
Оскільки в проекті використовується РК-дисплей 16x2 для відображення значення попереднього завантажувача, то використовується рідкокристалічна бібліотека.
#включати
Світлодіодний анодний штифт, який з'єднаний з штирком Arduino 7, визначається як ledPin .
#define ledPin 7
Далі об’єкт для доступу до класу рідких кристалів оголошується за допомогою РК-штифтів (RS, E, D4, D5, D6, D7), які пов’язані з Arduino UNO.
Рідкий кристал LiquidCrystal (8,9,10,11,12,13);
Потім встановіть значення попереднього завантажувача 3035 на 4 секунди. Перевірте формулу вище, щоб розрахувати значення попереднього завантажувача.
плаваюча вартість = 3035;
Потім у налаштуваннях порожнечі () спочатку встановіть РК-дисплей в режим 16x2 і протягом декількох секунд відображайте привітальне повідомлення.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); затримка (2000); lcd.clear ();
Далі встановіть світлодіодний штифт як ВИХІДНИЙ штифт, а кнопкові кнопки встановлені як Вхідні штифти
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Далі вимкніть усі переривання:
noInterrupts ();
Далі таймер1 ініціалізується.
TCCR1A = 0; TCCR1B = 0;
Встановлено значення таймера попереднього завантажувача (спочатку 3035).
TCNT1 = значення;
Потім значення 1024 попереднього масштабувача встановлюється в регістрі TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
Переривання переповнення таймера ввімкнено в регістрі маски переривання таймера, щоб можна було використовувати ISR.
TIMSK1 - = (1 << TOIE1);
Нарешті всі переривання включені.
перериває ();
Тепер напишіть ISR для переривання переповнення таймера, який відповідає за вмикання та вимикання світлодіодів за допомогою digitalWrite . Стан змінюється щоразу, коли відбувається переривання переповнення таймера.
ISR (TIMER1_OVF_vect) { TCNT1 = значення; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
У циклі void () значення попереднього завантажувача збільшується або зменшується за допомогою входів кнопки, а також значення відображається на РК-дисплеї 16x2.
if (digitalRead (2) == HIGH) { значення = значення + 10; // Значення попереднього завантаження стимулятора } if (digitalRead (4) == HIGH) { value = value-10; // Зменшити значення попереднього завантаження } lcd.setCursor (0,0); lcd.print (значення); }
Ось так таймер може використовуватися для затримки програми Arduino. Перегляньте відео нижче, де ми продемонстрували зміну затримки шляхом збільшення та зменшення значення попереднього завантажувача за допомогою кнопок.