Мета роботи: набуття практичних навичок організації асинхронного обміну в МК пристроях.
1. Ознайомитися з теоретичним матеріалом, наведеним в описі, а також в [1, 2].
2. Розробити та налагодити програми асинхронного обміну з використанням віртуальних пристроїв і інструментів.
3. Закріпити навички розробки підключених пристроїв IoT з використанням Arduino IDE, Proteus VSM.
4. Закріпити навички завантаження програм в пам'ять МК навчального стенду і налагодження з використанням осцилографа і логічного аналізатора.
5. Дослідити процес групове керуванням станом реле 4 channel Relay Shield.
6. Дослідити стани входів А, В Motor Shield.
7. Проаналізувати тимчасові діаграми асинхронного обміну та провести аналіз використовуваного обсягу ресурсів МК.
Однієї з найважливіших складових роботи сучасних обчислювальних засобів автоматики є обмін даними між пристроями. У сучасних AVR- мікроконтролерах передбачено наявність вбудованого універсального асинхронного приймача (UART), що забезпечує реалізацію дуплексного асинхронного обміну із зовнішніми пристроями. МК ATmega328 (див. додаток) має універсальний синхронно-асинхронний прийомо- передатчик USART0 з розширеними функціональними можливостями.
На рисунку 5.1 наведений приклад сполучення двох мікроконтролерів - ведучого і веденого з використанням UART. Якщо до ліній прийому (RxD) і передачі (TxD) підключити перетворювачі рівня TTL - RS232, то ведений МК можна підключити до СОМ- порту персонального або промислового
комп'ютера. Існують перетворювачі UART - USB, UART - RS485, UART - Bluetooth та ін., які розширюють комунікаційні можливості
Рисунок 5.1 - Сполучення двох МК з використанням UART Входи (INPUT) і виходи (OUTPUT) пов'язані з
універсальними лініями портів МК - PORTA..PORTD, які програмно налаштовуються на відповідний режим роботи.
При програмуванні UART в простому випадку вирішуються три завдання:
1. Ініціалізація UART (задання швидкості, формату даних і режимів роботи).
2. Організація передачі даних.
3. Організація прийому даних.
Ініціалізація UART передує процесу обміну і включає: установку швидкості обміну, режиму роботи і формату посилок.
Оскільки при асинхронному обміні відсутня окрема лінія синхронізації, для забезпечення коректності результатів прийому/передачі інформації тимчасові параметри сигналів мають бути чітко погоджені за часом. Для підтримки стабільної швидкості обміну V в UART AVR- мікроконтролерів використовується спеціальний генератор швидкості передачі -
дільник частоти FCK тактового генератора МК. Коефіцієнт ділення задається кодом в регістрі UBRR відповідно до виразу:
UBRR =
V =
FCK
16 ×V FCK
- 1,
(1)
16 ´ (UBRR + 1)
Відхилення швидкості обміну від заданої має бути не більше
±5%. При встановлені швидкості передачі для типових значень швидкості V і частот синхронізації FCK можна вибирати значення UBRR з таблиці 5.1, розраховані по (1).
Таблиця 5.1. Встановлення швидкості обміну UART
V |
8 MHz |
Error, % |
16 MHz |
Error, % |
2400 |
207 |
0.2 |
416 |
0.2 |
4800 |
103 |
0.2 |
207 |
0.2 |
9600 |
51 |
0.2 |
103 |
0.2 |
19200 |
25 |
0.2 |
51 |
0.2 |
57600 |
- |
- |
16 |
2.1 |
115200 |
- |
- |
8 |
3.5 |
Для FCK=16000000 Гц встановлені значення UBRR = 10310 = 6716 = 0x67 відповідають швидкості обміну BaudRate = 9600 бод.
Встановлення режиму роботи UART відбувається з допомогою встановлення біт регістра UCR:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
RXEN |
TXEN |
0 |
0 |
0 |
Біти цього регістра дозволяють включення приймача (RXEN) і передавача (TXEN). При скиданні усі біти встановлюються в 0, тому приймач і приймач UART відключаються. У секції ініціалізації програми UCR необхідно налаштувати. При записі коду 000110002 = 0х18 приймач і передавач включаються.
Стан приймача визначається прапорами: закінчення прийому (RxC), закінчення передачі усіх даних (TxC), звільнення буфера передавача (UDRE). Ці прапори входять до складу регістра USR:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
RxC |
TxC |
UDRE |
- |
- |
- |
- |
- |
Передача починається в момент завантаж передаваннях даних в регістр UDR передавача з його буферного регістра. Звільнення буферного регістра призводить до установки UDRE=1, що дозволяє завантажити в нього черговий байт, не чекаючи закінчення циклу передачі і установки TxC=1. Прапори передавача можна опитувати програмно, або викликати переривання. Закінчення прийому чергового байта фіксується установкою прапора RxC=1, який можна опитувати програмно, або викликати переривання, залежно від використовуваного режиму обміну.
Якщо МК використовує послідовний канал для коротких однобайтних (8 бітових) повідомлень, то приймати і передавати дані можна, просто опитуючи прапори готовності приймача і передавача UART. На рисунку 5.2 наведений приклад: через UART з програмним опитуванням прапора приймача (очікуванням USR.7=1, що еквівалентно запису RxC=1). Прийнятий в UDR байт зчитується і передається в PORTB. Далі перевіряється готовність буферного регістра передавача до прийому даних (очікується USR.5=1, що еквівалентно запису UDRE=1). Код, зчитаний з ліній PIND, завантажується в регістр передавача UDR.
Рисунок 5.2 - Дуплексний режим обміну з програмним опитуванням прапорів готовності
Проаналізувавши приведені фрагменти, можна помітити, що і у разі передачі, і у разі прийому даних використовується регістр UDR. Фізично він є двома окремими регістрами, доступ до яких відбувається за одним адресом. При записі відбувається запис в регістр передавача, при читанні - зчитується регістр приймача.
У Arduino UNO (Nano і ін.) лінія D0 пов'язана з входом приймача RxD, а лінія D1 - з виходом передавача TxD. З'єднання двох пристроїв для асинхронного обміну показано на рисунку 5.3.
З приймачем і передавачем UART пов'язані буфери, в яких зберігаються прийняті байти і ті що стоять в черзі на передачу. Реалізований механізм переривань після закінчення прийому і передачі кожного байта, що захищає від втрати даних.
Рисунок 5.3 - Передача даних від ARD1 до ARD2. Схема
з’єднання
Набір з 6 перемикачів DSW1 (рисунок. 5.4), пов'язаний з вхідними лініями D7...2 є джерелом вхідних даних (x5…0) для передачі ( на рисунку 5.3 - комбінація сигналів 101001 = 0x29).
Алгоритм обміну
:
- ARD1 опитує стан входів, пов'язаних з датчиками (x5…0);
- формується код для передачі X=<0,0, x5, x4, x3, x2, x1, x0>;
- передача коду X від ARD1 до ARD2;
- прийом і обробка коду X=<0,0, x5, x4, x3, x2, x1, x0> у ARD2 (виділення значень x5, x4, x3, x2, x1, x0);
- виведення стану датчиків на розряди індикатора U2: D13=x5, D12=x4, D11=x3, D10=x2, D9=x1, D8=x0;
- передача коду підтвердження від ARD2 до ARD1 (при необхідності).
Таким чином, сигнали поступають від DSW1 побітно розміщується в переданому байті відповідно до формату асинхронної посилки. При прийомі біти виділяються і відображаються на виходах МК ARD2, пов'язаних зі світлодіодними індикаторами. U2 (рисунок. 5.4).
Рисунок 5.4 - Передача даних від ARD1 до ARD2. Формат
посилок
У додатку 1 наведена віртуальна модель керування 4 - канальним реле в середовищі Proteus, зовнішній вигляд і принципова схема 4 channel Relay Shield. Функціональна схема підключення представлена на рисунку.5.5.
Рисунок. 5.5 – Функціональна схема підключення 4 channel Relay Shield до Arduino
Термінал підключається до ліній прийому (D0) і передачі (D1) МК плати. У нім встановлюється необхідний формат і швидкість
обміну. МК через вихідні лінії D8, D7, D2, D4 керує драйвером, який включає реле RL1 ...4.
В ході виконання роботи необхідно побудувати програми в IDE Arduino відповідно до завдань, виконати їх налагодження у симуляторі і за вказівкою запрограмувати МК віртуального і навчального стендів для перевірки роботи програм.
Задача 1. Групове керування станом реле 4 channel Relay Shield (Додаток 1). Від терміналу поступають коди символів. З кожного 8 - розрядного коду виділяються молодші 4 розряди. Їх комбінації (0000 ...1111) визначають необхідний стан виходів 8,7,2,4. Побудувати програму декодування кодів, що приймаються, виконати налагодження в Proteus або симуляторі і перевірити роботу програми.
Задача 2. Контроль стану входів А, В Motor Shield (Додаток 2). На входи 10,16,8,2,3,7 плат поступають сигнали {0,1} від 6 кнопок. Можуть бути 64 комбінації стану входів - 000000 . 111111. Побудувати програму опитування стану вказаних входів і передачі
6 - символьних рядків "000000" . "111111" вхід терміналу для відображення. Опитування виконується з періодом 500 мс. Виведення нового стану входів розпочинається з нового рядка. Побудувати програму, виконати налагодження в Proteus або симуляторі.
1. Схеми апаратних засобів для вирішення задач.
2. Тексти програм задач.
3. Результати моделювання.
4. Результати виконання експериментів.
5. Висновки по роботі.
1. Що таке UART?
2. Які завдання вирішуються при програмуванні UART?
3. Встановлення режиму роботи UART
4. Який механізм реалізації обміну даними з використанням UART?
5. Як відбувається організація обміном з програмним керуванням?
6. Як відбувається ініціалізація даних в UART?
7. Як підключити термінал до мікроконтролера?
8. Як визначається стан закінчення прийому даних через UART?
9. Як визначається стан закінчення передачі даних через UART?
10. Як з'єднати два пристрої для асинхронного обміну?
1. Опис навчальних стендів.
2. Соммер У. Программирование микроконтроллерных плат Arduino/Freeduino.- СПб.: БХВ – Петербург, 2012.- 256с.
3. Brian W. Evans Блокнот програмиста. 2007.
4. Среда разработки Arduino. [Електронний ресурс]. – Режим доступу: http://www.arduino.cc/en/Main/Software
5. Simulator for Arduino. [Електронний ресурс]. – Режим доступу: http://virtronics.com.au/Data/SetupFree.zip.
6. Программирование Ардуино. [Електронний ресурс]. – Режим доступу: http://arduino.ru/Reference
7. PROTEUS VSM. Среда виртуального моделирования. - PROTEUS-d.pdf [Електронний ресурс]. Режим доступу: http://proteus123.narod.ru/
8. JoyStick Shield V1[Електронний ресурс]. – Режим доступу: https://www.elecfreaks.com/wiki/ index.php?title=Joystick_Shield
а) б)
Рисунок 5.6 – 4 channel Relay Shield – зовнішній вигляд (а) і принципова схема (б)
Рисунок 5.7 – Підключення 4 channel Relay Shield до Arduino– функціональна схема (Proteus)
Додаток 2. Motor Shield – модуль розширення для керування двигунами постійного струму
а) б)
Рисунок 5.8 - Motor Shield – зовнішній вигляд вид (а), застосування (б); спрощена схема (в)
Рисунок 5.9 - Motor Shield – функціональна схема моделі в
Proteus
IO10,16,5 – входи групи A IO2,3,7 – входи групи B
IO~6,12,8– виходи керування групи А (PWMA, DIRA, BREAK-A)
IO~11,13,9 – виходи керування групи В (PWMB, DIRB, BREAK-B)
Таблиця 5.2 - Логіка керування двигунами
BRAKE-
A(B) |
|
DIRA(B) |
PWMA(B) |
Motor-A(B) |
0 |
|
x |
x |
Стоп |
1 |
|
x |
0 |
Стоп |
1 |
|
0 |
1..255 |
За часовою стрілкою |
1 |
|
1 |
255..1 |
Проти часової стрілки |
Для скорочення числа використовуваних ліній керування сигнали BREAK - A, BREAK - B відключаються.
Додаток 3. Таблиця кодування символів ASCII (American Standard Code for Information Interchange)
Таблиця. 5.3 Коди символів ASCII
Додаток 4. Приклад програмування послідовного асинхронного обміну
int Button[] = {7,6,5,4,3,2}, N=6;
// Список входів для N датчиків int LEDs[] = {8,9,10,11,12,13};
// Список виходів для індикації int buttonState,ledState,i;
// коди станів датчиків і індикаторів
void setup() {
Serial.begin(9600); // швидкість 9600 for(i=0;i<N;i++){
pinMode(Button[i], INPUT); //входи digitalWrite(Button[i],HIGH); // Х=11..1
}
}
void loop() {
// тут опитування станів
// передача коду стану датчиків
// тут приймання та виведення на вихідні лінії delay(500); // затримка циклу опитування 500 мс
}
buttonState = 0; // код станів входів Х
for(i=0;i<N;i++){ // цикл зчитування входів х5..0 buttonState <<= 1; // зсув вліво
buttonState |= digitalRead(pushButton[i]) & 0x01;
// додавання сигналу з чергового входу
}
Serial.write(buttonState); //передача Х
while(Serial.available()>1) {
ledState = Serial.read(); // read byte for(i=0;i<N;i++){ // write the output pin if((ledState & 0x01)==1) {digitalWrite(LEDs[i],HIGH);}
else {digitalWrite(LEDs[i],LOW);} ledState >>= 1;
}
}
Додаток 5. Bluetooth модуль HC-05(06)
Bluetooth модуль виконує функцію безпровідного подовження дротяного з'єднання UART.
Рисунок 5.10 - Bluetooth модуль HC-05(06)
Додаток 6. Joystick Shield v1.A з модулем HC-05
|
|
а) |
|
|
|
б) |
в) |
Рисунок 5.11 - Joystick Shield v1.A і Arduino UNO
Рисунок 5.12 - Спрощена схема Joystick Shield v1.A
Рисунок 5.13 - Схема підключення елементів JoyStick Shield
V1.A до Arduino
Натиснення кнопки відповідає логічному "0" на вказаному цифровому вході. Кнопка К вбудована в джойстик і натискається його ручкою.